OmniAICreator/Qiita-1.07M huggingface dataset:
バックアップを取りつつS3バケットのオブジェクトを再度PUTする方法

# 概要
この記事がやることは、AWS-CLIを用いて、指定したパスのファイルを全部DLして再度同じパスにDLしたファイルをアップロードする。

# 実施の経緯
S3バケットの指定したパス配下のオブジェクトを再度PUTしたかった。
再度PUTすることで、PUTイベントで発火するプログラムの動作確認を行いたかった。

# やりかた
## 指定したパス配下をまるっとダウンロード

```shell
DIR_PATH={your-dir-path}
aws s3 cp --profile {your-profile} --recursive --exclude="*" --include="${DIR_PATH}/*" s3://your-bucketname ./ >> ./logs/download_log.txt
```

## ダウンロードしたファイルをまるっと同じパスにアップロード

```shell
DIR_PATH={your-dir-path}
aws s3 cp --profile {your-profile} --recursive --exclude="*" --include="${DIR_PATH}/*" ./ s3://your-bucketname >> ./logs/upload_log.txt
```
## 補足
ログをとったり、実施前に`--dryrun`のオプションを付けて実施内容を確認するとよいと思います。
url正規化 index.htmlをアリにする場合

https://www.webdesignleaves.com/pr/html/htaccess.html



RewriteEngine on
 
#TOPページの処理
RewriteRule ^$ https://example.jp/index.html [R=301,L]
 
#下層ページの処理
#ただし/xxxxxxxx/のURLは除外
RewriteCond %{THE_REQUEST} !^.*/xxxxxxxx/
RewriteCond %{THE_REQUEST} ^.*/
RewriteRule ^(.*)/$ https://example.jp/$1/index.html [R=301,L]


#合算
RewriteEngine On
RewriteRule ^$ https://%{HTTP_HOST}/index.html [R=301,L]
RewriteRule ^(.*)/$ https://%{HTTP_HOST}/$1/index.html [R=301,L]


# httpsリダイレクト
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]




wwwありに統一
RewriteEngine on
RewriteCond %{HTTP_HOST} ^dev\.planet\.jp$
RewriteRule ^(.*)$ https://www.dev.planet.jp/$1 [R=301,L]

wwwなしに統一
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.url\.com)(:80)? [NC] RewriteRule ^(.*) http://url.com/$1 [R=301,L]
「http://www.url.com/」にアクセスされたら「http://url.com/」にリダイレクトする記述です。



RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.jp) [NC]
RewriteRule ^(.*) https://example.jp/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]


・RewriteEngine on：書き換えを開始するぜ！！
・RewriteCond：書き換えする対象（条件）はこれだぜ！！
・RewriteRule：書き換え内容はこれだぜ！


トレイリングスラッシュをなしにする。
でもループしちゃった。
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)/+$ $1 [R=301,L]
いつも忘れる OpenPyXL

# インストール
```
pip install openpyxl
```

# お約束
```
import openpyxl
```
# 基本

#### ワークブックの作成
```
wb = openpyxl.Workbook()
# 'Sheet'というワークブックが作成される
```
#### ワークブックの読込
```
wb = openpyxl.load_workbook('filename.xlsx')
```
#### ワークブックの保存
```
wb.save('output.xlsx')
```
#### ワークシートの作成
```
wb.create_sheet(title='title')
# titleを付与しない場合、 'Sheet'+番号(1~) で生成される
```
#### ワークシート名の変更
```
ws.title = 'new title'
```
#### ワークシート名の確認
```
wb.sheetnames
```
#### ワークシートの取得
```
ws = wb['title']
```
#### アクティブなワークシートの取得
```
ws = wb.active
```
#### セルの取得
```
cell = ws['A1']
cell = ws.cell(row=1, column=1)
```
#### セルに値を代入
```
cell.value = value
```
#### セルにハイパーリンクを付与
```
cell.hyperlink = 'url'
```
#### セルの幅を設定
```
ws.column_dimensions['A'].width = value
```
#### セルの座標を取得
```
cell.coordinate
# 文字列で取得される
```
#### セルの結合
```
ws.marge_cells('A1:A2')
ws.marge_cells(start_row=1, start_column=1, end_row=1, end_column=2)
```

# スタイル
#### セルに色をつける
```
cell.fill = openpyxl.styles.PatternFill(fill_type='solid', fgColor='000000')
```
#### テキストの中央寄せ
```
cell.alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center')
```
#### テキストの色を変える
```
cell.font = openpyxl.styles.Font(color='000000')
```


# 罫線
#### 罫線を作成
```
side = openpyxl.styles.Side(style='thin')
border = openpyxl.styles.Border(left=side, right=side, top=side, bottom=side)
```
#### 罫線を引く
```
cell.border = border
```


# ユーティリティ
#### 座標を分離(タプル化)
```
coordinate = openpyxl.utils.cell.coordinate_from_string('A1')
# coordinate -> ('A', 1)
```
#### 列（アルファベット）を数字に変換
```
col = openpyxl.utils.cell.column_index_from_string('A')
col = openpyxl.utils.column_index_from_string('A')
# col -> 1
```
#### 列（数値）をアルファベットに変換
```
col = openpyxl.utils.cell.get_column_letter(1)
col = openpyxl.utils.get_column_letter(1)
col -> 'A'
```


### 投稿者はチカラ尽きた。。。
### そのうち増える
歴代のスイッチ

一般家庭のスイッチの変遷を調べてみました。

日本では松下電工（現在はパナソニック）が大きいシェアーを握っています。日本の灯りは松下がつけてきたと言っても過言ではないかもしれません。松下電工の頃はナショナルがブランド名で「明るいナショナル」のCMが懐かしく思い出されますが、この曲は三木鶏郎さんの作曲でした。

戦後すぐの頃は露出型だったようです。

![スクリーンショット 2020-05-14 7.51.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/cadb9f49-a113-b93e-3d35-d2bebb0a9ef8.png)

1950年台後半に「ハイ連用器具」(通称:ハイ連)という製品になり埋め込み式になります。

![スクリーンショット 2020-05-14 8.16.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/886edbee-4aa4-3ef5-c527-56e20654150d.png)

四角いものは「ハイ角連用器具」(通称:ハイ角)となっていました。

![スクリーンショット 2020-05-14 7.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f4f02a5e-7194-b546-15ea-c0b2f2a05419.png)


後期の「ハイ角」は金属プレートもありました。

![スクリーンショット 2020-05-14 7.56.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/599e4a92-9b9c-1533-5b24-180ada471b7e.png)

1971年に「フルカラー」という製品が発売されます。

![スクリーンショット 2020-05-14 7.58.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a4dca010-8ac6-93a4-36e5-b76fe3575902.png)

1980年台はほぼフルカラーが使われていますが、1970年台はまだ「ハイ角」も多かったのではないかと思われます。「ハイ連」「ハイ角」の頃はプレートのあまりバリエーションがありませんでしたが、フルカラーは販売期間も長くいろいろなタイプのプレートがあります。初期のプレートは「ハイ連」のようにネジが露出していましたが、後期のものはパネルが二重構造になり、ネジは中に隠れるようになっています。また上記の写真のように初期のものは角ばっていて、後期のものは丸くなっています。色は初期の標準品はベージュで後期になって白になっています。時代が映し出されているのかもしれません。

スイッチの黒いボッチがONのマークですが、三路回路の場合はONが固定されないのでボッチがありません。

時々フルカラーのパネルをクリーニングのためにばらしたりしているのですが、つめが折れたりする事はほとんどありません。使っていたプラスチックの素材が良かったのか、つめの形が良いのかもしれません。

「ハイ連」や「ハイ角」の頃のプレートには右下に凸のエンボス加工で「NATIONAL」の文字があり、「フルカラー」前半には凹のエンボス加工で「National」と入っていましたが、フルカラーの後半からは文字は入らなくなりました。

![写真（2020-05-16 6.14）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/74696f6a-bb46-aea0-4428-d4db3758c269.jpeg)

![写真（2020-05-16 6.13）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3a9f73a4-953a-1a56-e298-6f9e20bd2260.jpeg)

2000年台にはいって「コスモ」シリーズが流通するようになりました。

![スクリーンショット 2020-05-14 8.02.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/80857908-7a94-48d7-8d59-2cfc0f133c64.png)

2014年には「アドバンス」になりました。

![スクリーンショット 2020-05-14 8.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7ffa5a44-4fc3-ba4b-2362-29388bb806d5.png)

2017年には「ハイ連」のような「クラシックシリーズ」を発売したようです。また最近のプレートは「ハイ連」頃のように角が丸く、色も白に戻ってます。時代が一回りしてしまったということでしょうか。

この写真は我が家の一番古いスイッチです。「ハイ連」以前のようですが、まだ現役でちゃんと使えています。

![IMGP0001 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/c7dbb1c0-0331-c8ac-826e-61850e4fc171.jpeg)

我が家はこれ以外は全てフルカラーでしたが、玄関だけコスモの人感センサー付きに替えてあります。

コスモシリーズのほたるスイッチは緑のとき消燈で消えているときにオンなのですが、ちょっと紛らわしい感じがします。

親類が屋内配線業をやっていたので、小さい頃に遊びに行くと時々現場に連れていもらったり倉庫で遊んだりしていたので、結構身近な存在でした。

松下電工はパナソニック電工になり、その後再編でパナソニックの一部門になったようです。

最近の電気製品は中国製がほとんどですが、スイッチは一貫して国内製造のようです。

スイッチの取り換えには電気工事士の資格が必要です。私は第二種電気工事士です。

参考

https://news.panasonic.com/jp/stories/2018/61019.html

https://twitter.com/kuriuzu/status/1031901605522694144?s=20
いつも忘れる ApplePencil対応

# Apple pencilなんで仕事してくれへんの
selectやinputをApple pencilで突きすぎてペン先が磨耗した人向け

# 動け！（切望)
```
const elm = document.getElementById('idDayo')
elm.addEventListener('touchstart', function(){
  elm.focus();
  elm.select();
})
```
cssにcusrosr:pointer;をつけると良いなど、探すといろいろな方法があるがどれも期待した動作をしない。。。
メンテナンス性は悪いけど、期待する動作はしてくれたのでおけまる

# クラスで使用する場合
```
class NanikaClass{
  constructor() {
    this.elm = document.getElementById('idDayo')
    this.elm.addEventListener('touchstart', function() {
      this.elem.focus();
      this.elem.select();
    }
  }  
}
```
thisのスコープで悩む人(メンバー呼び出し思考)は.bind(this)で我慢して。
メンテナンス性を考えると、基底クラスにイベント登録用の関数を作って、そこで処理の共通化を行う方が良さそう。


##### Let's タブレット対応
Ruby と Python で解く AtCoder ABC057 C 素因数分解 ビット全探索

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。

~~尚、昨日より過去問においても言語のアップデートが実施されました。~~
**追記**
一旦、旧環境に戻された様です。

```
ruby
"2.7.1"

python
Python: 3.8.2
NumPy:  1.18.2
SciPy:  1.4.1

pypy3
Python: 3.6.9

cython
Python: 3.8.2
```
Numo::NArrayのバージョン確認方法は不明でした。
# 今回のお題
*[AtCoder Beginner Contest C - Digits in Multiplication](https://atcoder.jp/contests/abc057/tasks/abc057_c)*
<font color="green">Difficulty: 834</font>

今回のテーマ、素因数分解 ＋ ビット全探索
# Ruby
以前解きました、*[Ruby と Perl と Java と Python で解く AtCoder CADDi 2018 C 素因数分解](https://qiita.com/superrino130/items/7e0c69756c455f74caf2)* の類題の様ですので、早速~~コピペ~~解きましょう。

```ruby.rb
require 'prime'

n = gets.to_i
if n == 1
  puts 1
else
  h = Prime.prime_division(n).to_h
  p = []
  h.each do |k, v|
    while v > 0
      p << k
      v -= 1
    end
  end
  min = Float::INFINITY
  0.upto(2 ** p.size - 1) do |bit|
    a = 1
    b = 1
    p.size.times do |i|
      if bit[i] == 0
        a *= p[i]
      else
        b *= p[i]
      end
    end
    if a >= b
      min = a if min > a
    else
      min = b if min > b
    end
  end
  puts min.to_s.size
end
```
素数を降順に割り振る方法ですと`WA`を貰いますので、ビット全探索を使用しています。

```bit.rb
  0.upto(2 ** p.size - 1) do |bit|

  [0, 1].repeated_permutation.each do |bit|
```
ビット全探索では、`repeated_permutation`も使用されますが、ここでは`TLE`になる様です。
# Python
```pypy.py
from math import sqrt
from itertools import product
import sys

n = int(input())
p = []
def factorization(arg):
    while arg % 2 == 0:
        p.append(2)
        arg //= 2
    for i in range(3, int(sqrt(arg)) + 1, 2):
        while arg % i == 0:
            p.append(i)
            arg //= i
    if arg > 1:
        p.append(arg)
if n == 1:
    print(1)
else:
    factorization(n)
    min = sys.maxsize
    for bit in range(2 ** len(p)):
        a = 1
        b = 1
        for i in range(len(p)):
            if ((bit >> i) & 1):
                a *= p[i]
            else:
                b *= p[i]
        if min > a and a >= b:
            min = a
        elif min > b and b > a:
            min = b
    print(len(str(min)))
```
```int.py
            arg //= i
```
`/=`ですと`WA`になる様です。

||Ruby(2.3.3)|Ruby(2.7.1)|Python|PyPy3(2.4.0)|PyPy3(7.3.0)|
|:--:|:--:|:--:|:--:|:--:|:--:|
|コード長 (Byte)|506|506|763|763|763|
|実行時間 (ms)|TLE|1355|TLE|643|352|
|メモリ (KB)|2300|9284|3064|52736|30112|
# まとめ
+ ABC 057 C を解いた
+ AtCoder の過去問の言語がバージョンアップされた
+ Ruby に詳しくなった
+ Python に詳しくなった
charts_flutterのTimeSeriesChart(またはLineChart)でY軸の単位を任意の文字列にする

charts_flutterを使っていて、X軸が日付、Y軸が5段階評価というグラフを作りたかったんですが、円グラフじゃないとmeasureを数字以外にするプロパティが見当たらない（measureFormatterFnは利かない）なぁとなって、結構手間取ったのでメモっておきます。

# やりたかったこと

Y軸のラベルをこういう状態にしたかった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105934/48acf88d-9d13-9fb3-e9d9-bfea572e5d5e.png)


# 実際のコード

**StatelessWidgetの中身**

```
Widget build(BuildContext context) {
  return charts.TimeSeriesChart(
    chartDatas,
    animate: false,
    primaryMeasureAxis: charts.NumericAxisSpec(
      tickFormatterSpec: charts.BasicNumericTickFormatterSpec(
        // ここでラベルの文字列を返す
        (num value) {
          switch (value) {
            case 0:
              return "悪い";
            // 他の数字もそんな感じで
          }
        },
      ),
    ),
  );
}
```
GitHub Education を使い始めたのでメモ

　コロナ騒動で、これまで大学でやっていた共同開発の演習（実験）をオンライン講義化しろという無茶振りが来たのでうんうん唸りながらやってます。それで、オンライン化の一環として、学内に用意していたgitサーバの代替にGitHubを使い始めたのでその辺のメモです。

　ちょうど4/15にチーム機能のFreeプランが出てた（[GitHub、チームでの利用も無料に。プライベートリポジトリ数も制限なく、チームディスカッション、ActionsによるCI/CDも可能 ](https://www.publickey1.jp/blog/20/githubactionscicd.html)－ Publickey）ので、とりあえずこれだけでも大丈夫かなーと思ったんですが、チームメンバが3人までなんですよねこれ。あらー（実験では8人くらいのチームになる）

　ということで、どうしようかなとウロウロ探してたら、教育関係向けのプログラム（[GitHub Education](https://education.github.com/)）というのがあるのを見つけました。学生さん向けと、教職員向けの２種類あります。

　学生さん向けの申請方法は、[【学割】GitHub Educationの申請とPrivateリポジトリを無料で使う方法](https://note.com/yotaszk/n/n8cf4d00dbf30)で紹介されてます。教職員向けの申請も基本は同じです。途中選ぶ項目がStudentではなくFacultyになるだけ。

　おもに研究室での活用紹介記事は[新春特別企画：大学におけるGitHub／GitHub Educationの活用事例 〜慣れることがソーシャルコーディングの道を拓く](http://bit.ly/2OUbBzi)にありました。GitHubはインターフェースが英語なので学生さんには敷居が高いわかる。

　まだ使い始めなので以下雑感だけ。

- 学校の公式メールアドレス（ドメイン）検索でリストにSaga University (Sadai)って出たのにはちょっとウケた
- 申し込んで審査には数日かかるよとメール来てたけど翌日には受諾されてたはやっ
- すでに講義で使用を開始していた既存の組織のアップグレードできるのかちょっと心配してたけどめっちゃ簡単にできた
    - [Applying for an educator or researcher discount](https://help.github.com/en/github/teaching-and-learning-with-github-education/applying-for-an-educator-or-researcher-discount)の下の方にある「[Upgrading your organization](https://help.github.com/en/github/teaching-and-learning-with-github-education/applying-for-an-educator-or-researcher-discount#upgrading-your-organization)」のところにやり方が書いてある
Xcodeのコードアノテーションの裏ワザ

## この記事の内容は？

普段コードにコメントを書き込んでいますか？ToDo項目をチェックしたり、コードの各セクション（変数、UI、デリゲートなど）に印をつけたりしていますか？Xcodeのコメント機能で生産性を高めるための小さなヒントをお伝えします。

## コードファイルの概要
単一のコードファイル内の関数一覧を表示させることができます。そのためには、Xcodeのエディターのパス項目をクリックします。

<img width="1272" alt="スクリーンショット 2020-05-12 午後8.11.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/7d0e8652-e4c5-3125-07e3-c957a8336476.png">

すると、現在のファイル内の関数一覧がメニューに表示されます

<img width="1285" alt="スクリーンショット 2020-05-12 午後8.12.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/494bdcf0-1d55-a86d-e57f-ab9d139b6624.png">

## 特別なアノテーションを追加

### MARK

```swift
// MARK: コードの新たなセクションが始まる箇所に印をつける

//TODO: この作業が必要！ToDo項目

//FIXME: この修正が必要！絆創膏アイコンが表示されます。
```

それぞれのフォーマット `// MARK: `、`//TODO: ` 、 `//FIXME:` を守る必要があるので注意しましょう

そしてもう一度概要ウィンドウを開くと、以下のように表示されます:

<img width="1298" alt="Screen Shot 2020-05-13 at 15.33.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/0a7e8c13-d07f-e38e-332e-ea4b755ec2a8.png">

---

:relaxed: [Twitter @MszPro](https://twitter.com/MszPro)

:sunny: [私の公開されているQiita記事のリストをカテゴリー別にご覧いただけます。](http://mszpro.com/ioskiji/)
<img width="150" src="https://cdn.mszmagic.com/static-web-content/AppClipImage_small.png">
初心者によるプログラミング学習ログ 315日目

#100日チャレンジの315日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
315日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>315日目 2h<br>・ポートフォリオ作成<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1260657573348294656?ref_src=twsrc%5Etfw">May 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
vmware toolsのインストール　または　ダウンロード

#vmware toolsのインストール　または　ダウンロード

ubuntu debian centos OpenSuSE RHEL Fedora centos 
wmware-toolsのisoを探していたのですがなかなかダウンロードリンクが見つかりません
そして行き着いたURL下記を見ると
https://docs.vmware.com/jp/VMware-Tools/11.0.0/com.vmware.vsphere.vmwaretools.doc/GUID-C48E1F14-240D-4DD1-8D4C-25B6EBE4BB0F.html

え、ちょっと待って
###[Ubuntu、Debian、および関連 OS]

```
sudo apt-get install open-vm-tools
```

Linuxのデスクトップでは

```
sudo apt-get update
sudo apt-get install open-vm-tools-desktop
```
とするだけ

Ubuntu20.04の場合
解像度の変更などは　
設定＞ディスプレイ＞任意倍率のスケーリング
任意倍率のスケーリングをONにするだけでウインドウサイズを
いじるだけで解像度の変更ができます
とても簡単
![LINUXディスプレイ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53561/c417bb78-63a1-d34a-ee2d-f3c7de56fd03.jpeg)

###[RHEL、Fedora、および CentOS]

```
sudo yum install open-vm-tools-desktop
```

```
sudo yum install open-vm-tools
```

###[SLE および OpenSuSE]

```
zypper install open-vm-tools-desktop
```

```
zypper install open-vm-tools
```
まさかこんな便利な時代が来るとは
今回Vmwaretoolsのインストールisoをダウンロードをしようとして四苦八苦してたら
このページにたどり着いておどろきました
今までの苦労はなんだったのか・・・

#共有フォルダの作り方

```
vmhgfs-fuse --help
Usage:	vmhgfs-fuse sharedir mountpoint [options]
Examples:
	vmhgfs-fuse .host:/ /mnt/hgfs
	vmhgfs-fuse .host:/foo/bar /mnt/bar
```

#過去のインストール方法は以下で
https://kb.vmware.com/articleview?docid=1022525&lang=ja
【SwiftUI】入力開始時に TextField の Placeholder の文字列を非表示にする

## はじめに

**SwiftUI** ではデフォルトでは入力開始時に `TextField` の
Placeholder の文字列は表示されたままですが，
入力開始時に Placeholder を非表示にできるのかについて
検証をする機会があったので備忘録です。

**通常はデフォルトのままで大丈夫だとは思います。**

## 実装

結果的に Placeholder の文字列を定数にせず，
バインドすることで実現できました。

`TextField` を生成する際に下記を使って入力開始/終了時の処理で
placeholder の文字列を変更しています。

```swift
init<S>(_ title: S, text: Binding<String>, onEditingChanged: @escaping (Bool) -> Void = { _ in }, onCommit: @escaping () -> Void = {}) where S : StringProtocol
```

サンプルコードはこちらです。
1つ目の `TextField` がデフォルトのシンプルなもの，
2つ目の `TextField` が入力時に非表示になるものです。

```swift:ContentView.swift
import SwiftUI

struct ContentView: View {

    @State private var firstTextFieldStr = ""
    @State private var secondTextFieldStr = ""
    @State private var placeholderStr = "文字列を入力"

    var body: some View {
        NavigationView {
            VStack(alignment: .leading) {
                TextField("文字列を入力", text: $firstTextFieldStr)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                    .padding(.vertical, 16.0)
                TextField(self.placeholderStr, text: $secondTextFieldStr, onEditingChanged: { (hasChanged) in
                    // 編集を始めたらtrue，終えたらfalseになる
                    if hasChanged && self.secondTextFieldStr.isEmpty {
                        // 編集開始時に文字列が入力されていなければplaceholderを空文字に
                        self.placeholderStr = ""
                    } else if !hasChanged && self.secondTextFieldStr.isEmpty {
                        // 編集終了時に文字列が入力されていなければplaceholderをデフォルトに
                        self.placeholderStr = "文字列を入力"
                    }
                }) {
                    // returnキーが押された際の処理
                }
                .textFieldStyle(RoundedBorderTextFieldStyle())
                Spacer()
            }
            .padding(.horizontal, 20.0)
            .navigationBarTitle("TextField Placeholder test", displayMode: .inline)
        }
    }
}
```

## 動作

![RPReplay_Final1589396086](https://user-images.githubusercontent.com/8732417/81854408-d89da880-9598-11ea-97da-d3b8ff238253.gif)

## おわりに

SwiftUI 2では痒いところに手が届くように色々期待です。

## 参考
https://developer.apple.com/documentation/swiftui/textfield/3338359-init
[Rails]ネストしたコメントの削除機能の作成

##コメントの削除機能の作成
Railsで投稿サイトのコメント削除機能を作成した際に、ネストのルーティング関連で少し詰まってしまったのでログを残しておきます。

##作りたいもの
本の内容を投稿(book)して、その投稿1つ1つに対してコメント(book_comment)できる。
そのコメントを消すことができるようにする。


```routes.rb
Rails.application.routes.draw do
  devise_for :users
  resources :users,only: [:show,:index,:edit,:update]
  resources :books do
  	resources :book_comments, only: [:create, :destroy]
  end

  root 'home#top'
  get 'home/about'
end
```

##destroyアクションにlink_toする書き方について
ここで、viewファイルのlink_toの書き方が分からず、詰まってしまいました。

```comment``` は```book```に紐づいているので、```comment```を削除(destroy)するときは以下のように引数を2つ指定してあげるといいそうです。

※```book_book_comment_path(@book, book_comment)```の部分。

```book_comment``` となっているのは、```@book.book_comments```を```each```で1つ1つ回しているためです。



```show.html
<% @book.book_comments.each do |book_comment| %>
	<%= link_to  "#{book_comment.user.name}", user_path(book_comment.user) %>
		<span><%= book_comment.created_at.strftime('%Y/%m/%d') %></span>
	<%= link_to "Destroy", book_book_comment_path(@book, book_comment), method: :delete, data:{confirm: "削除しますか？"}, class: "btn-sm btn-danger"%>
	<div class="comment-entry"><%= book_comment.comment %></div>
<% end %>
```


##コントローラーファイルについて
コントローラーファイルは以下の通りです。

URLにはidが2つある状態(```/books/:book_id/book_comments/:id(.:format) ```)なので、```book_id```とコメントの```id```が2つ分かっている状態にすると、きちんと動きました。

```book_comments_controller.rb
class BookCommentsController < ApplicationController
	before_action :authenticate_user!
	def create
		@book = Book.find(params[:book_id])
		@book_new = Book.new
		@book_comment = @book.book_comments.new(book_comment_params)
		@book_comment.user_id = current_user.id
		@book_comment.save
		redirect_to book_path(@book)
	end
	def destroy
		@book = Book.find(params[:book_id])
		book_comment = @book.book_comments.find(params[:id])
		if book_comment.user != current_user
			redirect_to request.referer
		end
		book_comment.destroy
		redirect_to request.referer
	end

	private
	def book_comment_params
		params.require(:book_comment).permit(:comment)
	end
end

```
Eclipseで保存時に未使用のimportが勝手に削除されるのを防止する

#なぜ不便なのか

Eclipseで、ソースコードを一時的にコメントアウトして保存をした時に、そこで使用されているクラスのimport文が消えてしまう。

コメントアウトから戻したときにimport文を書くのが面倒ということも勿論あるが、それよりimportミスが怖い。
importするときには、Eclipseの優秀な提案機能によって一覧から選ぶだけでimport文が自動入力されるが、
importするクラス名の中には、同名のクラス名が異なるパッケージに入っているものもあり、コメントアウトから戻したときに選び間違えることもなくはない。

#環境

Eclipse Java EE IDE for Web Developers.

Version: Neon Release (4.6.0)
Build id: 20160613-1800

#改善前

![改善前の設定(import文が消える).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619869/7f70df1a-8cb0-923b-fac5-0307332c7ede.png)
↑　改善前の設定

#設定項目を探してみる

上の画像「改善前の設定」にある、「追加アクション」にチェックを入れて「構成」ボタンを押せるようにして、「構成」ボタンを押すと下の画像のような画面が開く。

![「追加保管アクション」ダイアログ内に「未使用のインポートの除去」設定項目がある様子.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619869/7abc3ef0-a672-7416-7961-ad570dd53790.png)

「不要なコード」タブに「未使用のインポートの除去」という設定項目がある。
チェックが外れていることを確認して、OKクリックで画面を閉じる。

![改善案の設定①(import文が消える).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619869/b0c144df-1c82-3f77-8d68-549b54f5bc72.png)

これで改善すると思いきや、 **消えてしまう** 。

###なぜか、うまくいかなかった

（改善前は「追加アクション」にチェックが入っていなくて設定を明示していなかったから、チェックを入れれば行けるのでは？と思ったのだが）

#解決策

[このページ](https://qiita.com/kimisyo/items/9f9a028f9b4fba9367d8)で説明されているように、「インポートの編成」のチェックを外すとimport文が消えなくなった。

「追加アクション」の **「未使用のインポートの除去」設定項目は無視されて、「インポートの編成」の設定が優先されている**っぽい。
「インポートの編成」で何をしているのかは不明。

ということで、このような設定にした。

![改善案の設定②(import文が消えない)(成功！).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619869/d8527c9f-9e51-8a3c-33ee-412ea375392f.png)


もちろん、下の画像のように「追加アクション」にチェックをいれなくてもOK

![改善案の設定③(import文が消えない)(成功！).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619869/a0a0555b-3465-3c81-a512-51c99630b787.png)

以上。
画質の客観評価（SNR, PSNR, SSIM）について

# はじめに
画質の評価方法には、**主観評価**（DSCQS法、DSIS法、ACR法、ACR-HR法）と**客観評価**（SNR, PSNR、SSIM）の2種類がある。ここでは、後者の客観評価についてまとめた。

* 客観評価：圧縮符号化により生じた雑音をSNR, PSNR, SSIM等の手法で定量的に表す方法
* 主観評価：画像を見た人が自分の感覚に基づいて評価値を決める方法

以下に示す式で、単位が[dB]の理由は、画像信号のダイナミックレンジ（信号の最小値と最大値の比率）が広いため。
# SNRとは
**SNR（Signal to Noise Ratio）**：信号と雑音の比（SNR大 ⇒ 雑音の影響小）。

圧縮符号化に伴って発生する雑音の評価値SNR（Signal to Noise Ratio）の定義は

```math
SNR = 10\log_{10}\frac{s^2}{e^2} \quad [dB] \tag{1}\\
\Bigr( s^2: 原画像の信号分散、e^2：雑音電力 \Bigr)
```
なお、雑音電力$e^2$は、原画像と復号画像の差分二乗平均 MSE (Mean Squared Error)に等しく

```math
e^2 = MSE = \frac{1}{N} \sum_i(x[i]-y[i])^2 \tag{2}\\
\Bigr( N：画素数、x[i],y[i]: 原画像および復号画像のi番目の画素位置における輝度値 \Bigr)
```
と表わされる。

# PSNRとは
**PSNR（Peak Signal to Noise Ratio）**：最大電力（Peak to Peakの輝度変化の二乗）と雑音の比率。PSNR大 ⇒ 画像の劣化少。客観評価尺度としてよく利用。

PSNRの定義は、輝度信号が8bit表現の場合、0 ~ 255の範囲で表現されるため、(1)式を s=255 として

```math
PSNR = 10\log_{10} \frac{255^2}{e^2} \quad [dB] \tag{3}
```
動画像の場合、PSNRの評価値は、各フレームのPSNRの平均値。

### 特徴
* PSNRが高い、すなわち、劣化の少ない画像の時 ⇒ PSNRと主観画質の相関が良い

* PSNRが著しく低い、または、画面内で品質に偏り(局所的な劣化)がある場合 ⇒ PSNRと主観画質の相関が悪い時あり

いいかえれば、
PSNRの結果において、「画像全体で少し劣化」している時の値と「局所的に劣化」している時の値は、ほぼ同じになってしまう。しかし、主観評価では後者の方が悪いと感じてしまうことがある。

* 動画像では各フレームのPSNRの平均値を評価値とするため、時間的な品質変動の大きい動画像の場合 ⇒ 評価値と主観画質の相関が悪い時あり 

しかし、MSEは、MEPG-2, H.264などの主要な動画像符号化方式における「レート - 歪み最適化」の歪みの指標に用いられているため、符号化効率を図る用途としてもPSNRの有効性は高く、また複雑な計算がいらないため、PSNRは客観評価尺度としてよく使われている。

# SSIMとは
PSNRは、必ずしも主観評価と一致すると限らない。そこで、提案されたのが**SSIM（Structual SIMilarity）**である。

PSNRとSSIMの違いは以下である。

* PSNR：符号化とともに生じた**雑音成分の知覚感度**に基づく指標

* SSIM：人間の画質劣化の知覚に**画像構造の類似度**が寄与するものとした指標

SSIMにおける画像構造の類似度は、原画像$x$及び復号画像$y$の輝度・コントラスト・構造の比較項の乗算から成る。

よって、SSIMの定義式は、$\alpha, \beta, \gamma$ を正の定数とすると 

```math
SSIM(x, y) = [l(x, y)]^\alpha \times [c(x, y)]^\beta \times [s(x, y)]^\gamma \tag{4} \\
\Bigr( l(x,y), c(x,y), s(x,y)：輝度・コントラスト・構造の比較項 \Bigr)
```
なお、

```math
l(x, y) = \frac{2\mu_x \mu_y + C_1}{\mu_x ^2 + \mu_y ^2 + C_1}, \quad c(x, y) = \frac{2\sigma_x \sigma_y + C_2}{\sigma_x ^2 + \sigma_y ^2 + C_2},
\quad s(x, y) = \frac{\sigma_{xy} + C_3}{\sigma_x \sigma_y + C_3} \tag{5} \\
\Bigr( \mu_x, \mu_y：輝度x[i], y[i]の平均値、\sigma_x, \sigma_y：x[i], y[i] の標準偏差、\sigma_{xy}：x[i]とy[i] の共分散 \Bigr)
```
また、$C_1, C_2$は、定数 $K_1,K_2<<1
$ とすると（論文では$K_1=0.01, K_3=0.03$としている）

```math
C_1 = (K_1 L)^2, \quad C_2 = (K_2 L)^2, \quad C_3 = \frac{C_2}{2} \tag{6}\\
\Bigr( L：最大振幅（8bit表現なら L=255） \Bigr)
```
よって、(4)式は、論文同様、簡単のために$\alpha = \beta = \gamma = 1$ とすると

```math
SSIM(x,y) = \frac{(2 \mu_x \mu_y + C_1)(2 \sigma_{xy} + C_2)}{(\mu_x ^2 + \mu_y ^2 + C_1)(\sigma_x ^2 + \sigma_y ^2 + C_2)} \tag{7}
```
と最終的になる。

また、実際に用いられるSSIMの評価値は、MSSIM（Mean SSIM）と呼ばれるものであり

```math
MSSIM(x,y) = \frac{1}{M} \sum_{j=1}^{M} SSIM(x_j, y_j) \tag{8} \\
\Bigr( x_j,y_j：小領域の原画像・復号画像 \Bigr)
```
と表わされる。上式は、一枚の画像を小領域で分割し、小領域ごとに$SSIM(x_j, y_j)$を求め、それらを平均した値である。

### 特徴
* SSIMと主観画質の相関が、PSNRよりも良い場合あり

* SSIMの算出前に、ガウシアンフィルタをかけて平滑化するなどの前処理をする場合が多い

# 参考
* [画質の客観評価](http://www.ieice-hbkb.org/files/02/02gun_05hen_09.pdf)
* [Image Quality Assessment: From Error Visibility to Structural Similarity](http://https://ece.uwaterloo.ca/~z70wang/research/ssim/)
25+ CSSドロップダウンメニュー

#CSS Perspective Text Hover
<p class="codepen" data-height="637" data-theme-id="light" data-default-tab="result" data-user="bosworthco" data-slug-hash="YWBLpR" style="height: 637px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Perspective Text Hover">
  <span>See the Pen <a href="https://codepen.io/bosworthco/pen/YWBLpR">
  CSS Perspective Text Hover</a> by James Bosworth (<a href="https://codepen.io/bosworthco">@bosworthco</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#Color Swap
<p class="codepen" data-height="761" data-theme-id="light" data-default-tab="result" data-user="maicodes" data-slug-hash="XXjWwx" style="height: 761px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Color Swap">
  <span>See the Pen <a href="https://codepen.io/maicodes/pen/XXjWwx">
  Color Swap</a> by Mai El-Awini (<a href="https://codepen.io/maicodes">@maicodes</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
#Silent Movie Text Effect
<p class="codepen" data-height="596" data-theme-id="light" data-default-tab="result" data-user="mimikos" data-slug-hash="QMjjzy" style="height: 596px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Silent Movie Text Effect">
  <span>See the Pen <a href="https://codepen.io/mimikos/pen/QMjjzy">
  Silent Movie Text Effect</a> by Dimitra Vasilopoulou (<a href="https://codepen.io/mimikos">@mimikos</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
#(cool) text effect
<p class="codepen" data-height="798" data-theme-id="light" data-default-tab="result" data-user="Moslim" data-slug-hash="zwJPgL" style="height: 798px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="(cool) text effect">
  <span>See the Pen <a href="https://codepen.io/Moslim/pen/zwJPgL">
  (cool) text effect</a> by Hakkam Abdullah (<a href="https://codepen.io/Moslim">@Moslim</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
#more example [25+ CSS DROPDOWN MENU](https://gscode.in/css-dropdown-menu/)
TwurlでTwitterに動画付きツイートをする際の注意点

公式のチュートリアルを読んでもGifアニメ付きツイートができなかったメモ。

# 環境
- CPU: Intel
- Ubuntu 18.04 (amd64)
- ruby 2.5.1p57


# 前提
TwurlはTwitter公式のツールで、Railsで動きます。今回は以下の状況の対象にしています。

- Twurlインストール済み
- Developperアカウント取得済み
- 認証済み (`twurl authorize --consumer-key key --consumer-secret secret`の部分)
 - 以上参考; [Using Twurl (公式,たぶん英語のみ)](https://developer.twitter.com/en/docs/tutorials/using-twurl)

- 文字だけのツイートができる
 - 参考; [twurl - Twitter APIを呼び出すCLIコマンド](https://www.moongift.jp/2020/02/twurl-twitter-api%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99cli%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/)

- 画像をTwitterにアップロードし、`processing_info`にて`"state": "succeeded"`が返ってくる。またファイルの有効期限`expires_after_secs`が切れていない。
 - 参考; [メディアのアップロード (公式)](https://developer.twitter.com/ja/docs/tutorials/uploading-media)

# 症状

- 前出の公式チュートリアル([メディアのアップロード](https://developer.twitter.com/ja/docs/tutorials/uploading-media))通りに以下のコマンドを実行した際、**テキストのみツイートされる**。動画が添付されない。

**失敗したコマンド**

```:terminal
twurl "/1.1/statuses/update.json" -d "media_ids= 931263015239933952&text=Sample Tweet with media_ids and twurl"
```

# 対処
**修正点**

- `media_ids=`の後ろの半角スペースを外す。
- テキスト部分の`text=`を`status=`に変更する。

**留意点**

- `media_ids`に与えるのは、`media_id_string`の値であって`media_id`の値ではない(これは公式にも書いてある)。
- `media_ids`と`status`の順番は前後入れ替えても動いた。

**修正後のコマンド**

``` :terminal
twurl "/1.1/statuses/update.json" -d "media_ids=931263015239933952&status=Sample Tweet with media_ids and twurl" 
```

これに気付かずに丸々3日無駄にしました…　**というかTwitterさん[チュートリアル](https://developer.twitter.com/ja/docs/tutorials/uploading-media)更新してください**
【Golang】Byte型

#【Golang】Byte型
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main
//バイト型
//ネットワーク系、ファイルの読み書き系で使われる

import "fmt"

func main() {
	//バイト型 アスキーコード
	//初期化
	b := []byte{72, 73}
	fmt.Println(b)
	//>>72,73

	//string() 文字列に変換
	fmt.Println(string(b))
	//>>HI
	
	//バイトのスライスに変換
	c := []byte("HI")
	fmt.Println(c)
	//>>72,73

	//文字列に変換
	fmt.Println(string(c))
	//>>HI
}
```
画像自動判別で、あなたに最適なカメラマンを探してくれるサイトを作りたかった。(Azure)

今回やったこと
--
・Custom Vision を使用したwebサイトの作成
・Azure App Services へのデプロイ

成功したこと
--
・Azure App Services へのデプロイ

背景
--
僕はカメラマンをしています。最近、僕と、もう2人のカメラマンの3人チームで活動することが増えてきました。それぞれ撮影するジャンルが違うのですが、例えば、クライアントから僕たち３人に向けて撮影の依頼をした時、３人の中で誰が一番クライアントが希望する写真を撮れるのか、クライアント側で事前にわかるといいなというアイデアがありました。
そんな時、Azure の Custom Vision という、"独自の画像分類器を構築、デプロイ、改良できるようにする認識サービス"を知りました。これを使えば、クライアントが希望する写真の雰囲気に近い画像をアップロードすると、独自に構築した画像分類システムが、僕たち３人の中で誰が最もクライアントのイメージする写真に、近い写真を撮ってきたのかが分かるのでは？と思いサイトの作成に至りました。

結果
--
散々時間を浪費しましたが、Azure App Services へのデプロイが限界でした(自身の理解力足らず)。僕がうまくいかなかった理由を備忘録として残しておきます。それらを参考に(なるのかな...)、今回のサイトのアイデアを実現してくれる人が出てくればと思います。

参考にした記事
--
Custom Vision でおさかな判別アプリを作成する
https://qiita.com/komiyasa/items/0ba847d7359817ea2dd5

参考というか、ほぼパクりました。
GitHub から必要なファイルをダウンロードできるようになっているので、そこから今回の制作に必要なソースコードの全てを持ってきました。

手順
--
<h4>1.html を書き換えて、カメラマン仕様にした</h4>
![スクリーンショット 2020-05-14 1.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603301/14ef4bba-c4e6-604f-c401-e878d837c0eb.png)

「Put the picture you want!!」＝「あなたが欲しい写真を入れて！！」
ここで画像をアップロードすると、３人の中から最適なカメラマンが検出される想定です。

<h4>2.Custom Vision を僕たち仕様に学習させた</h4>
![FireShot Capture 009 - Custom Vision_ protoout-custom-vison-portfolio - Training Images_ - www.customvision.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603301/01a6cb7a-6a08-a248-c531-43fe21bde27e.jpeg)

カメラマン３人の名前のタグを作成し、それぞれの作品にそれぞれのタグを付けました。これで、アップロードされた画像に対して、過去の作品から、もっとも要素の近い作品を作ったカメラマンが算出されるはずです。

↓Quick Test の結果
![a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603301/ec2b5df0-0748-2dd3-2462-2c32184fee92.jpeg)
Custom Vision の Quick Test で実際に試してみました。サンプルは、尊敬する写真家の1人、繰上和美さんの写真を使用させていただきました。結果は『kohno』というカメラマンが、一番サンプルに近い写真を撮っている、という結果になりました。

<h4>3.サイトを Azure App Services にデプロイ</h4>
App Servicesの作成は Azure portal、『App Service』から作成しました。
<img width="1157" alt="スクリーンショット 2020-05-14 2.21.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603301/f2d88066-d192-4e08-5535-bdc8972ae487.png">

また、App Serviceへは、Gitを使いデプロイを行いました。
↓この辺りの記事を参考にしました。
https://docs.microsoft.com/ja-jp/azure/app-service/deploy-continuous-deployment

<h4>4.公開</h4>
↓実際のサイト
https://protoout-portfolio.azurewebsites.net/
![FireShot Capture 012 - Photographer Automatic selection - protoout-portfolio.azurewebsites.net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603301/c2fbef78-950e-382b-dbd0-60e0a0e1452b.png)

お察しの通り、上手くいっていません。どうも html から JS が呼び出されていないくさいです。
色々と調べましたが、僕では原因が解明できませんでした...
GitHub のリポジトリを公開するので、もし気になった方は覗いてみてください。
https://github.com/cazmura/Photographer-Automatic-selection

最後まで読んでいただきありがとうございました。
http://www.sverigetillskott.se/les-vitalities-sverige/

![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637237/6b25ba59-79d4-e57e-1dc5-0ca1f6ce72fe.jpeg)

Les Vitalities behövs för att kunna använda natten innan du vilar. Till att börja med måste du rengöra ansiktet såväl som att klappa helt torrt. Ta några droppar serum på handflatan och applicera det på panna, kinder, nacke och även under ögat. Massera den i den runda aktiviteten i 20 sekunder och låt den blötläggas. Använd serumet i två månader regelbundet för att se de mest effektiva resultaten. Alternativet är utrustat med alla hudbehandling lösningar. et är en riskfri produkt för alla hudtyper. De flesta vill göra det perfekta valet när det gäller att välja åldrande medel för hudvård. Undersökningen är om du är redo att prova varje produkt och också fastställa dess effektivitet. Visst, med åldern, börjar din hud visa för tidiga indikationer på åldrande. Det är bäst och rekommenderas också att använda en anti-aging-kräm som naturligt kan återställa hudens hudstruktur. Med det sagt vill jag presentera Les Vitalities som kan göra dig mycket mer presentabel. Det kan också föryngra din hud genom att använda sina energiska komponenter för att sänka utseendet på åldrande tecken. För mer information besök här :  http://www.sverigetillskott.se/les-vitalities-sverige/
FlutterのdriverテストでpageBackが出来ない件の対応方法

Flutterのインテグレーションテスト(Driver Test)を書いていて、AppBarの戻るボタンタップをエミュレートしてページ遷移を戻そうとしたのですが、上手くいかなくて試行錯誤して解決したので、覚え書きです。

# 環境など

|ツールなど|バージョンなど|
|:--|:--|
| MacBook Air Early2015|macOS Mojave 10.14.6|
|Android Studio |3.6.1|
|Java |1.8.0_131|
|Flutter|1.12.13+hotfix.9|
|Dart |2.7.2|
|Xcode |11.3.1|

# 現象

ページを戻るには、`await driver.tap(find.pageBack())`をすればいいとか、`await driver.tap(find.byTooltip('Back'))`をすればいいとか情報があり、そのどちらも試しましたが、動作せず、タイムアウトしてテストがクラッシュしてしまう。

# 解決策

`await driver.tap(find.byTooltip('戻る'))`にする。

# 原因

対応言語を日本語にしていたから。

```dart
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // 日本語フォント設定
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('ja', ''), // Japanese
      ],
```

# 解決した方法

Issueで聞いてしまいました。
https://github.com/flutter/flutter/issues/56963

最後の質問は、多分意図をよく理解して貰えなかったみたいだけど・・・

もし日本語と英語をサポートしたときは、端末の言語設定によってテストコードを変えなきゃいけないと言うことになるのかしらん？ということが知りたかったんですが、とりあえず、その時が来たら考えることにします。

一応質問する前には相当ググったつもりでしたが、みんな回答は「`pageBack`が出来ないなら`findByTooltip('Back')`すればいいよ」、で、それでもダメだという投稿には返信がついていなかったんですよね。

でも、私も自分の質問の中で引用した質問への回答に、ヒントが出ていましたね。

https://github.com/flutter/flutter/issues/52594#issuecomment-613008470

言語リソースファイルを提示していたので、そこから、「日本語用ファイルを見つければ良いじゃないか」と気付けば良かったのです^^;
徹夜近い作業が数日続いてちょっと頭が働いてませんでした。

他にも困っている方の助けになれば幸いです。
コピペでできるチュートリアル風TextView(android)

![dynamic_textview.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367893/536eedd3-2dba-29f6-740d-258297197490.gif)



文字列が動的にカタカタと追加されていって、もう一度クリックするとまとめて表示する、といったtextviewの拡張を実装しました。
手軽なライブラリとかありそうですがどうなんでしょう
まずコピペすべくコードは


```kotlin:TextView.kt

import android.os.Handler
import android.widget.TextView

fun TextView.showTextDynamically(text: String, milliSec: Int, afterShow: (() -> Unit)? = null): (() -> Unit) {
    val charArr = text.toCharArray()
    var isShowing = false
    var isEnd = false
    return {
        // 再起関数で１文字ずつ表示する
        fun addChar(idx: Int) {
            if (idx == charArr.count()) {
                afterShow ?: return
                afterShow()
                return
            }
            Handler().postDelayed( {
                if (!isEnd) {
                    this.text = this.text.toString() + charArr[idx]
                }
                addChar(this.text.length)
            }, milliSec.toLong())
        }
        // 表示中に二度目のクリックされたらtextをまとめて表示する
        if (isShowing) {
            isEnd = true
            this.text = text
        } else {
            isShowing = true
            addChar(0)
        }
    }
}

```



↑このファイルを追加してください。

ちなみに使いかたですが、
一度関数をオブジェクト化して使います。
引数には表示したいテキストと、一文字表示するごとの間隔をミリ秒で入れます。
そして最後にテキストを表示し終えたタイミングで何かしたい場合は、カッコ内に書き込めば使えるようになっています（省略可能です）

※クリックリスナーの中にすべて書いてしまうと、クリックするたびに新しい関数オブジェクトが生成されてしまって想定した動きになりません。
関数オブジェクトは一度だけ生成してください。そしてその関数オブジェクトを一度目の実行で文字がカタカタと入力されていって、二度目の実行（今回は二度目のボタンクリック）で文字が一気にすべて入力される仕組みになっています。




```kotlin:MainActivity.kt

class MainActivity : AppCompatActivity() {

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

        setTutorialText()
    }

    private fun setTutorialText() {
        button.text = "スタート"
        // test用文字列
        val testText = "abcdefghijklmnopqrstuvwxyzあいうえおかきくけこさしすせそ"
        // 関数をオブジェクト化する
        val dynamicallyShowMethod = dynamic_textview.showTextDynamically(testText, milliSec=100) {
            // 表示完了後にここを通ります(設定しなくても可）
            button.text = "完了"
        }
        // buttonをクリックされたら上記関数を実行
        button.setOnClickListener {
            dynamicallyShowMethod()
        }
    }
}
```


これはほぼ雑談なのですが、今回、拡張メソッド内でフラグを使っています。
今までずっとフラグはメンバ変数に置かなければならないと思っていましたが、
これの何がよくないかというと
①フラグで一部にしか使われないのにわざわざメンバ変数を追加したらコードが汚れる
→スコープが無駄に広くなってしまいます。少なくとも今回のフラグはこのメソッド内でしか使われないのでメンバ変数として置くのは余計ですよね
②クラスの拡張においてメンバ変数は定義できないので、フラグをメンバ変数におくにはカスタムクラス（クラスを継承したクラス。今回の場合はTextView）を作らなければならない
→わざわざカスタムクラスを作ってそれを継承するというのは手間ですし汎用性がさがるので、できれば拡張して「しれっと使えるように」したいです。

普段使わないような文法を含むので初学者の方がこのコードを一つ一つ理解しようとしたら大変かと思います。
・関数内関数
・再起関数
・クロージャ
・関数オブジェクト
このあたりを検索してみたら勉強になるかと思います。
build.gradle.kts にしたら The associated Gralde Project isn't imported. と表示される

「KotlinDSL を完全に理解した」と言って、build.gradle を Rename して build.gradle.kts にした私です。
しかし、開くたびに上部に`The associated Gralde Project isn't imported.`という警告が出てきます。
それを嫌に思い、解決方法を調べました。結構悩んだのでメモしておきます。

## 解決方法１
### Gradle タブを開いてリロードを押す

## 解決方法２
### Intellij を再起動する
Vimeoの動画のサムネイルのリンクを取得する

![thumbnail](https://i.vimeocdn.com/video/595062338_640.webp)

Markdownに動画のリンクをまとめたりしててEmbedはしたくない(環境によってはできない)けど、サムネイルの画像があると見返しやすいかなと思い、例としてVimeoの公式の動画 [https://vimeo.com/185068072](https://vimeo.com/185068072) のサムネイルを取得してみます。

```uri
http://vimeo.com/api/v2/video/185068072.json
```
APIを使ってjsonを取得します。VideoIDを変えると他の動画でもできます。

見やすくするのにVScodeで開いて、右クリックのメニューから `Format Document` すると下のようになります。

```json
[
    {
        "id": 185068072,
        "title": "I am a Vimeo Filmmaker",
        "description": "\"Vimeo is a vital part of my filmmaking process.\" - Kate Herron, uploading since 2011. <br \/>\r\nProfessional filmmakers around the world share their videos on Vimeo. <br \/>\r\nJoin Vimeo PRO now at vimeo.com\/professionals<br \/>\r\n<br \/>\r\nAudio: Rain by Color Palette",
        "url": "https:\/\/vimeo.com\/185068072",
        "upload_date": "2016-09-30 16:11:49",
        "thumbnail_small": "https:\/\/i.vimeocdn.com\/video\/595062338_100x75.webp",
        "thumbnail_medium": "https:\/\/i.vimeocdn.com\/video\/595062338_200x150.webp",
        "thumbnail_large": "https:\/\/i.vimeocdn.com\/video\/595062338_640.webp",
        "user_id": 152184,
        "user_name": "Vimeo Staff",
        "user_url": "https:\/\/vimeo.com\/staff",
        "user_portrait_small": "https:\/\/i.vimeocdn.com\/portrait\/9934446_30x30.webp",
        "user_portrait_medium": "https:\/\/i.vimeocdn.com\/portrait\/9934446_75x75.webp",
        "user_portrait_large": "https:\/\/i.vimeocdn.com\/portrait\/9934446_100x100.webp",
        "user_portrait_huge": "https:\/\/i.vimeocdn.com\/portrait\/9934446_300x300.webp",
        "duration": 30,
        "width": 1920,
        "height": 1080,
        "tags": "Vimeo, Filmmaker, I am a Vimeo filmmaker",
        "embed_privacy": "anywhere"
    }
]
```

"thumbnail_small" から "thumbnail_large" がサムネイルのURLになります。
VideoIDそのまま入れ替えで使えないのがちょっと不便です。

Markdownでは

```md
![thumbnail](https://i.vimeocdn.com/video/595062338_640.webp)
![thumbnail](https://i.vimeocdn.com/video/595062338_640.png)
```

のように利用することができます。
Docker Composeをインストールしよう（CentOS8）

# 構築環境

```bash
$ cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
```

# インストール
公式手順：https://docs.docker.com/compose/install/
非公式翻訳手順：http://docs.docker.jp/compose/install.html

## 現在の安定版Docker Composeをダウンロードする

```
$ curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

## ダウンロードしたDocker Composeのバイナリに対して、実行権限を付与する

```
$ chmod +x /usr/local/bin/docker-compose
```

## インストールを確認する

```
$ docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6
```

これで完了。めっちゃ簡単だね！！！
【Flutter】世界最速？Adobe XD、Flutterをサポートしたらしいので日本語で解説してみた

[元ブログ - 技術は熱いうちに打て！ | 【Flutter】世界最速？Adobe XD、Flutterをサポートしたらしいので日本語で解説してみた](http://blog.dalt.me/1705)

# 概要
[Adobe XD](https://www.adobe.com/jp/products/xd.html)が[Flutter](https://flutter.dev/)を[サポートした](https://medium.com/flutter/announcing-adobe-xd-support-for-flutter-4b3dd55ff40e)
みたいなので触ってみました。
導入方法を紹介しようと思います。
すごい簡単でした！

# Adobe XDでプラグインの追加

## プラグイン -> プラグインを見つける...を選択

<img width="553" alt="スクリーンショット 2020-05-14 1.08.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/daa0a1d2-185c-4ff4-ee18-43829190440d.png">

## 「Flutter」と検索

<img width="850" alt="スクリーンショット 2020-05-14 1.09.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/fda4fcec-5a71-68ba-7f52-5660d7fa7aea.png">

## 「XD to Flutter Plugin」のインストール

<img width="850" alt="スクリーンショット 2020-05-14 1.09.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/5f652766-63dd-76f0-6875-f0c0637fa537.png">

## UI Panelの表示

XDの再起動は必要ありません。

<img width="705" alt="スクリーンショット 2020-05-14 1.09.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/cfa1e4de-f189-c65c-a94e-c67da935a61c.png">

# Flutterでプラグインの追加

[adobe_xd](https://pub.dev/packages/adobe_xd)をインストールします。

以上で設定は終わりです。

# 単一のエレメントを吐き出す場合

吐き出したいオブジェクトを選択します。
そうすると、UI Panelが以下の様な状態になるはずです。

<img width="194" alt="スクリーンショット 2020-05-14 1.15.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/ffa6fdbc-b6e2-a1b4-c791-a0950a00d438.png">

## Copy Selectedを選択

そうする事で、クリップボード上にContainerなどがコピーされている状態になるので対象のファイルにペーストして使用します。

```dart:sample.dart
Container(
    width: 320.0,
    height: 89.0,
    decoration: BoxDecoration(
      color: const Color(0xff73eadc),
      border: Border.all(width: 1.0, color: const Color(0xffedc69e)),
    ),
  );
```

ちゃんと`const`などにも対応していて良い感じです。

# アートボードを吐き出す場合

全てを吐き出したい場合は、全てのオブジェクトが選択されていない状態にします。
すると、UI Panelは以下の様になっているはずです。

<img width="192" alt="スクリーンショット 2020-05-14 1.14.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/39f59301-7519-4665-2d14-9e1192705bc9.png">

以下を設定します。

### FLUTTER PROJECT

プロジェクトのルートパスを設定します。libフォルダがあるフォルダですね。

### CODE PATH

lib以外の名前にしている場合等に必要だと思います。

### IMAGE PATH

画像を保存しているパスを設定します。

### WIDGET_NAME_PREFIX

吐き出されるdartファイルのプレフィックスです。

例えば、`FLUTTER PROJECT`を設定している状態で`Export All Widgets`を選択すると、
設定したプロジェクトのlibフォルダ内にファイルが吐き出されているはずです。

# 最後に

こちらの機能を利用すれば、UIにかける時間をかなり短縮でき、ロジック部分に時間をかける事ができそうですね。

誰かのお役に立てば。

こんな感じで、最近はFlutterの情報を中心にお届けしているので、良ければフォローしていただけると嬉しいです。
Rails tやRails sでクラッシュレポートが出る！テストが実行されないとき。sqlite3関連エラー

#今回起きたエラー

Rails6.0でアプリ作成中にサーバー立ち上げや、
テスト実行で以下のクラッシュレポートが出ました。

```
-- Crash Report log information --------------------------------------------
   See Crash Report log file under the one of following:
     * ~/Library/Logs/CrashReporter
     * /Library/Logs/CrashReporter
     * ~/Library/Logs/DiagnosticReports
     * /Library/Logs/DiagnosticReports
   for more details.
Don't forget to include the above Crash Report log file in bug reports.
```

[このサイト](https://qiita.com/longtime1116/items/8d93838a77ff2eb48e0e)によると、使っているsqlite3の参照元がいけないだとか。



[こちらのサイト](https://dot-blog.jp/news/mac-pyenv-homebrew-install-sqlite3-use/)を参考に、
使うsqlite3をhomebrewからインストールしたものに変えてみた。

#開発環境

OS: 64bit Mac macOS Catalina 10.15.3
Ruby 2.6.3
Rails6.0


#やったこと

##sqlite3インストール準備、brewをアップデート

sqlite3のバージョン確認。

```
$ sqlite3 --version
3.28.0 2019-04-15 14:49:49 378230ae7f4b721c8b8d83c8ceb891449685cd23b1702a57841f1be40b5daapl
```

sqlite3のパスを確認。

```
$ which sqlite3
/usr/bin/sqlite3
```

一応あらかじめbrewをアップデートしておく。

```
$ brew update
```
インストールしたパッケージのアップグレード。

```
$ brew upgrade
```
##sqlite3のインストール

```
$ brew install sqlite3
Warning: sqlite 3.31.1 is already installed and up-to-date
To reinstall 3.31.1, run `brew reinstall sqlite`
```

どうやら元々大丈夫そうだったけど、reinstallされた。問題はなさそう。

##/usr/local/binへのシンボリックリンク作成

cdでこんなこともできるんですね。

```
$ cd /usr/local/bin
```

>Homebrewのインストール先の『Cellar』からsqlite3のシンボリックリンクを作成します。

とのことだ。
3.31.1という箇所は各自のバージョンに合わせてください。


```
$ ln -sf ../Cellar/sqlite/3.31.1/bin/sqlite3 ./
```
先ほどのシンボリックリンクが作成されたか確認。

```
$ ls -la

lrwxr-xr-x    1 takerusugeno  admin        35  5  4 01:04 sqlite3 -> ../Cellar/sqlite/3.31.1/bin/sqlite3
```

##パスを通す

vimで直接パスを編集していきます。

```
$ vim ~/.bash_profile
```

最後の行に以下を追記。

```
export PATH=/usr/local/bin:"$PATH"
```

設定内容を反映させる。

```
$ source ~/.bash_profile
```

##変更の確認

再度バージョン確認。

```
$ sqlite3 --version
3.31.1 2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837bb4d6
```

ふむ、ちゃんと先ほどbrewでインストールしたバージョンになってますね。

パスを確認。

```
$ which sqlite3
/usr/local/bin/sqlite3
```
変更できてるみたいです。

#まだクラッシュレポートが出る


その後、[こちらのサイト](https://github.com/rails/rails/issues/38279)を見つけ、[こちら](https://github.com/rails/rails/commit/2afc9fd8aee7eac9cb433fcedf4a4750ae4ac995)に飛び、

Gem fileのminitestを'5.14.0'にして、

```
$ bundle update
```


以前、変わらずクラッシュレポート


#最終手段

sqlite3をアンインストール。

```
$ gem uninstall sqlite3
You don't have write permissions for the /Library/Ruby/Gems/2.6.0 repository.
```

その後、sudoで強引に消す。
**※個人開発なので777を使いましたが、あくまで最終手段です。**
chmodについては、あとでちゃんと調べるようにとメンターに念押しされました。

```
$ sudo chmod -R 777 /Library/Ruby/Gems/2.6.0
```



結果、システムのRubyに入ってた二つのバージョンのsqlite3が消えたようです。

ここで、試しにテストすると、稼働しました。
しかし、依然クラッシュレポートが出てる。

とりあえずテストが実行されたので、今はこれで御の字。

##と思ったが、Gitにpush後にもう一度テストしたらクラッシュが出なくなった。

なるほど、さっぱり分からんという状態です。

ローカル環境構築時に、よく分からなくて複数バージョンのGemを大量に入れてしまっていたことと、
それらのシステムのRubyのGemを使用元にしているために、コンフリクトを起こしやすくなっているかもしれないです。

現在作っているアプリが完成したら、環境構築を1からやり直した方が良いかもしれないと感じました。
cloudfront から S3 バケット内の特定のファイルへのアクセス制限をするためにはオリジンアクセスアイデンティティを使う

# 概要
cloudfront で配信している SPA でメンテナンスページを作成するとき、静的な HTML ファイルを S3 に置くが cloudfront からは「/maintenance.html」のように URL 直打ちだとアクセスできないようにしたい、というケースがありました。maintenance.html は URL 直打ちではなく SPA の制御によってレンダリングされます。
その際のメモです。

# オリジンアクセスアイデンティティを使う

S3 のバケットポリシーでオリジンアクセスアイデンティティを使って cloudfront からのアクセスを制御することによって上記のケースを実現できます。

```json
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity TESTTEST"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::test/*"
        },
        {
            "Effect": "Deny",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity TESTTEST"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::test/maintenance.html"
        }
    ]
}
```

上記のポリシーでは Deny を使って maintenance.html への直アクセスを禁止しています。

参考：
[オリジンアクセスアイデンティティを使用して Amazon S3 コンテンツへのアクセスを制限する](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html)
【Objective-C】遅延処理

#**dispatch_after**
dispatch_afterでの遅延処理を下記に記します。

```objective_c
//DISPATCH_TIME_NOWで1.0と指定している為、１秒間ディレイさせて処理することができる。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    // 処理内容
});
```

#セレクタ指定
セレクタを指定しての遅延処理を下記に記します。

```objective_c
//@selector()に遅延させたい関数を指定し、afterDelayに遅延させたい秒数を指定する事で遅延処理が出来ます。
//下記の場合だと５秒遅延して処理を行います。
 - (void)doSomething{
   // 処理内容
 }
[self performSelector:@selector(doSomething) withObject:nil afterDelay:5];


```