OmniAICreator/Qiita-1.07M huggingface dataset:
【Android Studio】NDKデバッグ変数表示のHEX化

## アプリではHEX表示出来てNDKでは出来ない・・・。んな訳ない！

---

でも、ググっても出てこない・・・
~~(しかたなく)~~ Google Issue Trackerで問い合わせ！
⇒ 無事解決できた！というお話。

---

## Googleからの回答
This is something we inherit from CLion. You can turn on hex view following this instruction:
https://www.jetbrains.com/help/clion/using-hexadecimal-view.html

⇒ CLionベースなので、こんな感じで設定変更したらHEX表示できるよ！との回答。

---

### Enable hexadecimal view (少しアレンジ)

---

1.
In Find Action dialog (Shift+Ctrl+A on Linux/Windows, ⇧⌘A on macOS) type Registry; open Registry, type cidr.debugger.value.numberFormatting.hex (or just hex) to search for the setting and turn it on.
<img width="254" alt="MaintenancePopup.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188672/114b8d99-66b7-883b-724c-404ba60e7b31.png">

---

<img width="583" alt="RegistryPopup.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188672/02ea16f4-0463-27b2-1238-873c8fc33c36.png">

---

2.
Go to Settings / Preferences | Build, Execution, Deployment | Debugger | Data Views | C/C++ and set the checkbox Show hex values for numbers. Choose to have hexadecimal values displayed instead or alongside the original values:

---

設定前
<img width="343" alt="DecView.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188672/b0cb2e8b-f7d2-0a7b-af73-8974ae568168.png">

---

設定後（やった！）
<img width="344" alt="HexView.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188672/64933caa-5b50-0551-4880-db333a6640e7.png">

---

## まとめ
Currently, this feature is experimental. 的な事もあるので、開発元への問い合わせ。大事。

---

## 以上
RaspberryPi最新化

この記事は、2020/01/14に執筆しています。
情報が古くなる可能性があるため、ご注意ください。
また、updateを行うには、ネットワークに接続する必要があります。

##はじめに
RaspberryPi最新化で、少し調べたので記載します。


##パッケージ最新化

RaspberryPiを最新化するには、以下コマンドを実行します。
ここで行っているのは、各パッケージ（アプリ）のupdateです。

```
sudo apt update　　　　…パッケージ管理システム（apt）を最新化する
sudo apt upgrade　　　 …パッケージ管理システムを参照し、各パッケージを最新化する
```

##ディストリビューション最新化

上記に加えて、以下コマンドを実行します。
ここで行っているのは、ＯＳのupdateです。

```
sudo apt full-upgrade …RaspberryPiのディストリビューションを最新化する
```

##ファームウェア最新化（非推奨）

以下コマンドを実行します。
なお、通常このコマンドは非推奨です。（テスター用のため）

```
sudo rpi-update
```

([https://github.com/Hexxeh/rpi-update](https://github.com/Hexxeh/rpi-update) )より引用

> A good reason for using this would be if you like to help with the testing effort, and are happy to risk breakages and submit bug reports. These testers are welcome.

Google翻訳

> これを使用する正当な理由は、テスト作業を支援したい場合、そして破損のリスクを負い、バグレポートを提出することを喜んでいる場合です。これらのテスターは大歓迎です。

##終わりに
いかがだったでしょうか　…（・ω・｀）ｲｯﾃﾐﾀｶｯﾀﾉ

調べた結果は、上記の通りです。
参考は以下に記載していますので、不明点あれば参照してみてください。

##参考
[これ1冊でできる! ラズベリー・パイ 超入門 改訂第5版 Raspberry Pi 1+/2/3(B / B+)/Zero/Zero W対応](https://www.amazon.co.jp/dp/4800712246/ref=cm_sw_em_r_mt_dp_U_ufshEb880AKWN)
[Debian 管理者ハンドブック 6.2. aptitude、apt-get、apt コマンド](https://debian-handbook.info/browse/ja-JP/stable/sect.apt-get.html)
[Debian 管理者ハンドブック 6.6. 安定版から次のディストリビューションへのアップグレード](https://debian-handbook.info/browse/ja-JP/stable/sect.dist-upgrade.html)
[GitHub rpi-update](https://github.com/Hexxeh/rpi-update)
[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ～Composite～

この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
**ごく普通のiOSアプリ開発でよくある状況**や
**Swiftのコアライブラリやフレームワークで使われているパターン**に
着目してデザインパターンを学び直してみた記録です。

**関連記事一覧**
[[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン](https://qiita.com/y-some/items/96db5f24ded4a1fab48f)

# Compositeパターン概要

- **ディレクトリとファイルのような、ツリー構造を扱うためのパターンです。**
- ディレクトリとファイルのように、「名前」などの同じプロパティや、「削除」などの同じ操作を持つ場合、ディレクトリ（容器）とファイル（中身）を同じように扱うことができます。
- すなわち、検索や削除などを再帰的に行うことができます。
- GoFのデザインパターンでは**構造に関するパターン**に分類されます。

# 使い所

- そのものズバリ、ツリー構造を扱う場合には、Compositeパターンを思い浮かべると設計に掛かる時間を短縮できる可能性が高いです。
- UIViewのView Hierarchyもツリー構造であり、Compositeパターンが使われています。

![view_hierarchy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/8fc76a96-0697-acda-34a2-a264b25a2e71.gif)
引用：[Cocoa Design Patterns (Retired Document)](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/CocoaDesignPatterns.html)

# サンプルコード

Swiftバージョンは 5.1 です。

```swift
protocol DirectoryEntry {
    var name: String { get }
    func remove()
}

final class File: DirectoryEntry {
    let name: String
    
    init(name: String) {
        self.name = name
    }
    
    func remove() {
        print("\(name)を削除しました")
    }
}

final class Directory: DirectoryEntry {
    let name: String
    private var entryList = [DirectoryEntry]()

    init(name: String) {
        self.name = name
    }
    
    func add(entry: DirectoryEntry) {
        entryList.append(entry)
    }

    func remove() {
        for entry in entryList {
            entry.remove()
        }
        print("\(name)を削除しました")
    }
}

// Usage
let dir1 = Directory(name: "dir1")
let file1 = File(name: "file1")
dir1.add(entry: file1)
// dir1
//   ∟file1

let dir2 = Directory(name: "dir2")
let file2 = File(name: "file2")
let file3 = File(name: "file3")
dir2.add(entry: file2)
dir2.add(entry: file3)
// dir2
//   ∟file2
//   ∟file3

dir1.add(entry: dir2)
// dir1
//   ∟file1
//   ∟dir2
//     ∟file2
//     ∟file3

let file4 = File(name: "file4")
dir1.add(entry: file4)
// dir1
//   ∟file1
//   ∟dir2
//     ∟file2
//     ∟file3
//   ∟file4

dir1.remove()
// "file1を削除しました"
// "file2を削除しました"
// "file3を削除しました"
// "dir2を削除しました"
// "file4を削除しました"
// "dir1を削除しました"
```
一般の時系列回帰過程

```{r}

#AR多項式過程

library(dplyr)

data=data.frame(no=1:48,values=window(UKgas,c(1975,1),c(1999,3)))

r=4;dim=5

values=data$values

X=array(0,dim=c((nrow(data)-r),dim*r))

Y=c()

for(j in 1:(nrow(data)-r)){
  
vec=c()

for(i in 1:dim){
  
vec=c(vec,values[j:(j+r-1)]^i)  
  
}
  
X[j,]=vec

Y=c(Y,(values[r+j]))
  
}

X2=t(X)%*%X

sol_H2=eigen(X2)$vectors%*%diag(1/eigen(X2)$values)%*%t(eigen(X2)$vectors)

A=sol_H2%*%t(X)%*%Y

b=mean(Y)-sum(apply(X,2,mean)*A)

predict=X%*%A+b

result=data.frame(predict=predict,Y=Y)

N=nrow(X);

sigma_hat=sum(c(Y-X%*%A+b)^2)/N

AIC=log(sigma_hat)+2*r/N

```

```{r}

#罰則項付きのAR多項式過程

library(dplyr)

data=data.frame(no=1:48,values=window(UKgas,c(1975,1),c(1999,3)))

r=4;dim=5

values=data$values

X=array(0,dim=c((nrow(data)-r),dim*r))

Y=c()

for(j in 1:(nrow(data)-r)){
  
vec=c()

for(i in 1:dim){
  
vec=c(vec,values[j:(j+r-1)]^i)  
  
}
  
X[j,]=vec

Y=c(Y,(values[r+j]))
  
}

X2=t(X)%*%X


mesh=1

AIC_data=data.frame(lambda=seq(mesh,10000,mesh),AIC=0,CV=0,GCV=0)

for(i in 1:nrow(AIC_data)){

lambda=AIC_data$lambda[i]

sol_H=eigen(X2+diag(lambda,ncol(X)))$vectors%*%diag(1/eigen(X2+diag(lambda,ncol(X)))$values)%*%t(eigen(X2+diag(lambda,ncol(X)))$vectors)
  
A=sol_H%*%t(X)%*%Y

b=mean(Y)-sum(apply(X,2,mean)*A)

predict=X%*%A+b

sigma_hat=mean((Y-predict)^2)

H=X%*%sol_H%*%t(X)

AIC=length(Y)*log(2*pi+1)+length(Y)*log(sigma_hat)+2*sum(diag(H))

CV=mean(((Y-predict)/(1-diag(H)))^2)

GCV=mean(((Y-predict)/(1-mean(diag(H))))^2)

AIC_data$AIC[i]=AIC

AIC_data$GCV[i]=GCV

AIC_data$CV[i]=CV

}

plot(AIC_data$lambda,AIC_data$AIC)

lambda=min(AIC_data$lambda[AIC_data$AIC==min(AIC_data$AIC)])

sol_H=eigen(X2+diag(lambda,ncol(X)))$vectors%*%diag(1/eigen(X2+diag(lambda,ncol(X)))$values)%*%t(eigen(X2+diag(lambda,ncol(X)))$vectors)
  
A=sol_H%*%t(X)%*%Y

b=mean(Y)-sum(apply(X,2,mean)*A)

predict=X%*%A+b

result=data.frame(predict=predict,Y=Y)




```



```{r}

#一般の時系列回帰過程

library(dplyr)

data=data.frame(anscombe)

char=c("x1","x2","x3","x4")

char=c("x1")

r=4;cols=length(char)

values=data$y4

X=array(0,dim=c((nrow(data)-r),(1+cols)*r))


names=colnames(data)


Y=c()

for(j in 1:(nrow(data)-r)){

vec=c()

vec=c(vec,values[j:(j+r-1)])  

if(cols==1){

data_sub=array(data[,colnames(data) %in% char],dim=c(nrow(data),cols))

}else{
  
data_sub=data[,colnames(data) %in% char]  
  
}

for(i in 1:ncol(data_sub)){

vec=c(vec,data_sub[j:(j+r-1),i])  

}

X[j,]=vec

Y=c(Y,(values[r+j]))

}

X2=t(X)%*%X

sol_H2=eigen(X2)$vectors%*%diag(1/eigen(X2)$values)%*%t(eigen(X2)$vectors)

A=sol_H2%*%t(X)%*%Y

b=mean(Y)-sum(apply(X,2,mean)*A)

predict=X%*%A+b

result=data.frame(predict=predict,Y=Y)

N=nrow(X);

sigma_hat=sum(c(Y-X%*%A+b)^2)/N

AIC=log(sigma_hat)+2*r/N



```
[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ～Command～

この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
**ごく普通のiOSアプリ開発でよくある状況**や
**Swiftのコアライブラリやフレームワークで使われているパターン**に
着目してデザインパターンを学び直してみた記録です。

**関連記事一覧**
[[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン](https://qiita.com/y-some/items/96db5f24ded4a1fab48f)

# Commandパターン概要

- **Command＝命令をオブジェクトとして扱うパターン**です。
- Commandオブジェクトは、「パラメータ」と「処理」をカプセル化したモノ。
- GoFのデザインパターンでは**振る舞いに関するパターン**に分類されます。

# 使い所

1. 並列処理を行いたいケース
2. Queueing処理（Commandの待ち行列管理）を行いたいケース
3. （DBを使わずに）ある時点の状態へのロールバックを行いたいケース
4. Commandオブジェクトの生成元とは異なる場所でCommandを実行したいケース

- 上記1、2を実現するための言語機能である**Operation（とOperationQueue）は、Commandパターンに則って構築されています。**
- したがってSwiftでは、Commandパターンのコードを自力で実装しなければならないケースは少なそうです。
- とはいえ前提知識として、Commandパターンのコンセプトは理解しておいて損はないかと思います。

（ご参考）
【Swift】Grand Central Dispatch (GCD)とOperationQueue まとめ > [Operation Queue]
(https://qiita.com/shiz/items/693241f41344a9df6d6f#operation-queue-1)

# サンプルコード（Commandパターンの実装例）

Swiftバージョンは 5.1 です。

```swift
class Command {
    let receiver: Receiver
    
    init(receiver: Receiver) {
        self.receiver = receiver
    }
    
    func execute() {}
}

class HelloCommand: Command {
    override func execute() {
        receiver.action(message: "Hello")
    }
}

class WorldCommand: Command {
    override func execute() {
        receiver.action(message: "World")
    }
}

protocol Receiver {
    func action(message: String)
}

class PrintReceiver: Receiver {
    func action(message: String) {
        print(message)
    }
}

class Invoker {
    private var commands = [Command]()
    
    func addCommand(_ command: Command) {
        self.commands.append(command)
    }
    
    func execute() {
        for command in commands {
            command.execute()
        }
    }
}

let invoker = Invoker()
let receiver = PrintReceiver()
let hello = HelloCommand(receiver: receiver)
let world = WorldCommand(receiver: receiver)
invoker.addCommand(hello)
invoker.addCommand(world)

invoker.execute()

// 処理結果
// "Hello"
// "World"
```

引用元：
[しめ鯖日記 - Swiftで学ぶデザインパターン22 (Commandパターン)](https://llcc.hatenablog.com/entry/2015/08/19/224723)

# サンプルコード（Operationの実装例）

```swift
import Foundation
class MyCommand: Operation {
    var commandName: String
    var delay: Int

    init(commandName: String, delay: Int) {
        self.commandName = commandName
        self.delay = delay
    }

    override func main() {
        for _ in 0..<delay {
            sleep(1)
        }
        print(commandName)
    }
}

let operationQueue = OperationQueue()
// 最大同時実行数
operationQueue.maxConcurrentOperationCount = 3


let command1 = MyCommand(commandName: "command1", delay: 1)
let command2 = MyCommand(commandName: "command2", delay: 3)
let command3 = MyCommand(commandName: "command3", delay: 2)

operationQueue.addOperation(command1)
operationQueue.addOperation(command2)
operationQueue.addOperation(command3)

// 処理結果
// "command1"
// "command3"
// "command2"
```

OperationとOperationQueueを使ってみると、Commandパターンになっていることが理解できるかと思います。
[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ～Chain Of Responsibility～

この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
**ごく普通のiOSアプリ開発でよくある状況**や
**Swiftのコアライブラリやフレームワークで使われているパターン**に
着目してデザインパターンを学び直してみた記録です。

**関連記事一覧**
[[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン](https://qiita.com/y-some/items/96db5f24ded4a1fab48f)

# Chain Of Responsibilityパターン概要

- 全体を統率するクラスを作らず、個々のクラスが**責務を「たらい回し」**して、責務を果たせるクラスに行き当たった時点でそのクラスが処理を行います。
- GoFのデザインパターンでは**振る舞いに関するパターン**に分類されます。

# 使い所

- iOSエンジニアにとってはおなじみの、UIKitの「Responder Chain」という仕組みがChain Of Responsibilityパターンに則って構築されています。

> Responder Chainとは？

> UIResponderオブジェクトの繋がりのことで、この繋がりの順番にしたがって
> touchイベントなどの処理ができるUIResponderオブジェクト(=first responder)を見つけて処理を行う仕組みです。
    
引用：[【Swift】Responder Chainの仕組み](https://qiita.com/shiz/items/5a75fbd903de4a474b1d)

- アプリ開発での使い所は思い当たらなかったのですが、iOSフレークワーク内部で使われている仕組みであるわけですから、概念を理解しておいて損はないかと思います。

# サンプルコード

Swiftバージョンは 5.1 です。

```swift
protocol Withdrawing {
    // 引き出す
    func withdraw(amount: Int) -> Bool
}

// 札束クラス
final class MoneyPile: Withdrawing {
    // 額面
    let value: Int
    // 枚数
    var quantity: Int
    // 責務をたらい渡す次のオブジェクト
    var next: Withdrawing?

    init(value: Int, quantity: Int, next: Withdrawing?) {
        self.value = value
        self.quantity = quantity
        self.next = next
    }

    func withdraw(amount: Int) -> Bool {

        var amount = amount

        func canTakeSomeBill(want: Int) -> Bool {
            return (want / self.value) > 0
        }

        var quantity = self.quantity

        while canTakeSomeBill(want: amount) {

            if quantity == 0 {
                break
            }

            amount -= self.value
            quantity -= 1
        }

        guard amount > 0 else {
            return true
        }

        if let next = self.next {
            return next.withdraw(amount: amount)
        }

        return false
    }
}

// ATMクラス
final class ATM: Withdrawing {
    // $100の札束
    private var hundred: Withdrawing
    // $50の札束
    private var fifty: Withdrawing
    // $20の札束
    private var twenty: Withdrawing
    // $10の札束
    private var ten: Withdrawing

    private var startPile: Withdrawing {
        return self.hundred
    }

    init(hundred: Withdrawing,
           fifty: Withdrawing,
          twenty: Withdrawing,
             ten: Withdrawing) {

        self.hundred = hundred
        self.fifty = fifty
        self.twenty = twenty
        self.ten = ten
    }

    func withdraw(amount: Int) -> Bool {
        return startPile.withdraw(amount: amount)
    }
}

// Usage
// 札束オブジェクトを生成して $10 -> $20 -> $50 -> $100 と数珠つなぎにする
let ten = MoneyPile(value: 10, quantity: 6, next: nil)
let twenty = MoneyPile(value: 20, quantity: 2, next: ten)
let fifty = MoneyPile(value: 50, quantity: 2, next: twenty)
let hundred = MoneyPile(value: 100, quantity: 1, next: fifty)

// ATMオブジェクトを札束オブジェクトを格納して生成する
var atm = ATM(hundred: hundred, fifty: fifty, twenty: twenty, ten: ten)

// ATMには合計$300しか入っていないため$310は引き出せない
atm.withdraw(amount: 310)   // false

// $300は引き出せる
atm.withdraw(amount: 100)   // true
```

引用：
https://github.com/ochococo/Design-Patterns-In-Swift#-chain-of-responsibility
【Nuxt.js】 inject is 何？

## TL;DR.
- injectを利用すると関数を共通化することができる
- 関数はthis.$hogeで呼び出すことができる


## injectを使用した処理の例
ページに'hoge'を返す関数を作ってみる

```js:plugins/hoge.js
const returnHoge = () => {
  return 'hoge'
}

export default(context, inject) {
  inject('hoge', returnHoge)
}
```

これをnuxt.config.jsに設定する



```js:nuxt.config.js

plugins: [
  { src: '@/plugins/hoge', ssr: false }
]
```

このようにすると`this.$hoge`でVueインスタンスで関数を実行することができる

引数を渡したい場合や、関数名を代替したい場合はこのようにする

```js
const calcNumber = (num) => {
  return 3 * num
}

export default(context, inject) {
  inject('calc', { get: calcNumber })
}
```

これで`this.$calc.get(4)`を実行すると12が返ってくる


## コンポーネントから呼び出す場合
asyncDataやfetchで使用したい場合はこのように呼び出す

```js:pages/index.vue
export default {
  asyncData(context) {
    context.app.$hoge()
  }
}
```



## injectを使用する利点
- 確定した処理の共通化が可能
    - 関数を呼び出して必ず実行される処理や分岐に対しては有効
    - ex. 取得処理が成功したら値を返し、失敗したらエラーの処理を実行するなど
- いちいちページでimportしなくていい
    - これに関しては何を呼び出しているかが明示的にわかりにくくなるので、良し悪しがある
    - 共通化したい処理の中でも関数の実態を把握できるような関数名や共通認識があるものであれば良いが、そうでなければページに残したいところ。。
    - axiosやfirebaseのget, delete、日付処理など、誰が見てもわかり切っているものなら便利そう
- Vuexストア内でも同様に`this.$`で関数を呼ぶことができる
- 同様の方法に`mixin`を使用して関数をグローバルに実行する方法があるが、`inject`の場合は`asyncData`や`fetch`内でも共通の関数を利用することができる

## 参照
[Nuxt.js 統合された注入](https://ja.nuxtjs.org/guide/plugins/#%E7%B5%B1%E5%90%88%E3%81%95%E3%82%8C%E3%81%9F%E6%B3%A8%E5%85%A5)
PostgreSQL 小ネタ備忘録

複雑めなSQLを書く時に重宝している Snippet を記録していこうかと。


`COUNT(row.*) OVER()`
-----

LIMIT を越えて全件数を取得する

ポイントは Window Function の `OVER()`。Window Function がなんなのか、細かいことはよく理解できていない。

基本的にリストを取得する時はページネーションを行なっていると思うけど、LIMIT を設定した状態で COUNT を実行しても、LIMITまでの数値しか出ないところを、一発で取得できるようにしてくれる。
一発のSQLで取得できるのは楽だけど、ライブラリとの関係で使いづらかったりする時もあるかも。

`ROW_NUMBER() OVER(PARTITION BY column ORDER BY DESC)`
-----

1体多の関連テーブルから特定の条件で1件だけ取得する

このSQL単体では機能しないけど、このSQLを含めたサブクエリを利用することで、例えば「最新の一件」とかを取得できる。
「リストを取得するタイミングで関連するテーブルの情報を一見だけ欲しい！」みたいな時にアプリケーション側でのマージ作業を省けるのが嬉しいところ。

この snippet を知ったのは[この Stack Overflow](https://stackoverflow.com/questions/2411559/how-do-i-query-sql-for-a-latest-record-date-for-each-user) から

とりあえずそんな感じで。
[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ～Bridge～

この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
**ごく普通のiOSアプリ開発でよくある状況**や
**Swiftのコアライブラリやフレームワークで使われているパターン**に
着目してデザインパターンを学び直してみた記録です。

**関連記事一覧**
[[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン](https://qiita.com/y-some/items/96db5f24ded4a1fab48f)

# Bridgeパターン概要

- **機能を提供する層と、実装を提供する層を分離する**パターンです。
- 各層の橋渡し(Bridge)をiOSエンジニアにはおなじみの委譲(delegate)で行います。
- GoFのデザインパターンでは**構造に関するパターン**に分類されます。

# 使い所

- 実装をMockに差し替えることができ、ユニットテストがしやすくなります。
- VIPERなどのアーキテクチャーパターンは、Bridgeパターンによって成立しています（と私は認識しています）。

# サンプルコード

Swiftバージョンは 5.1 です。

```swift
// VIPERでのPresenterに当たる層
protocol Presentation {
    var interactor: Usecase { get set }
    func searchButtonTapped()
}

final class Presenter: Presentation {
    var interactor: Usecase

    func searchButtonTapped() {
        self.interactor.fetch()
    }
    
    init(interactor: Usecase) {
        self.interactor = interactor
    }
}

// VIPERでのInteractorに当たる層
protocol Usecase {
    func fetch()
}

final class ProductionUsecase: Usecase {
    func fetch() {
        print("fetch for Production")
    }
}

final class MockUsecase: Usecase {
    func fetch() {
        print("fetch for Mock")
    }
}

// VIPERでのViewに当たる層
let production = Presenter(interactor: ProductionUsecase())
production.searchButtonTapped()    // "fetch for Production"

let test = Presenter(interactor: MockUsecase())
test.searchButtonTapped()    // "fetch for Mock"
```
[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ～Facade～

この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
**ごく普通のiOSアプリ開発でよくある状況**や
**Swiftのコアライブラリやフレームワークで使われているパターン**に
着目してデザインパターンを学び直してみた記録です。

**関連記事一覧**
[[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン](https://qiita.com/y-some/items/96db5f24ded4a1fab48f)

# Facadeパターン概要

- **煩雑なモノの窓口（＝Facade、ファサード）を作ることでシンプルに扱えるようにする**パターンです。
- Facadeクラスは複雑な実装は持たず、（大抵は複数の）モジュールに対する問合せ窓口としての機能だけを提供します。
- GoFのデザインパターンでは**構造に関するパターン**に分類されます。

# 使い所

アプリ開発の実務で適用できるケースはたくさんあると思いますが、例えば

- UserDefaultsの読み込み・書き込み　とか
- KeyChainの読み込み・書き込み　とか

# サンプルコード

Swiftバージョンは 5.1 です。

```swift
// Example
final class Defaults {

    private let defaults: UserDefaults

    init(defaults: UserDefaults = .standard) {
        self.defaults = defaults
    }

    subscript(key: String) -> String? {
        get {
            return defaults.string(forKey: key)
        }

        set {
            defaults.set(newValue, forKey: key)
        }
    }
}

// Usage
let storage = Defaults()

// Store
storage["Bishop"] = "Disconnect me. I’d rather be nothing"

// Read
storage["Bishop"]
```

引用：
https://github.com/ochococo/Design-Patterns-In-Swift#-fa%C3%A7ade
#Rails ActionMailer + #Rspec でメール送信数 / 送信先をテストする例

```rb
subject { something }

it do
  expect { subject }.to change { ActionMailer::Base.deliveries.count }.by(3)
end

```

```rb
before { subject }

it do
  expect(ActionMailer::Base.deliveries.map(&:to)).to include ['alice@example.com']
  expect(ActionMailer::Base.deliveries.map(&:to)).to include ['bob@example.com', 'carol@example.com']
end

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2943








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
図でもっとわかりやすく学ぶ!!Webアプリケーションの模範的な構造MVCモデルとは?

##MCVモデルとは？
Webアプリケーションの開発では、**サーブレットクラス**と[**JSPファイル**](https://qiita.com/Yuriko-Y/items/06a16dde3d85ec83342b)を組み合わせて作成します。組み合わせることで効率よく開発することができます。
組み合わせて開発する際に参考にされるのが**MVCモデル**です。
つまり…
**アプリケーションの内部構造のお手本やガイドラインのようなもの。**
もう少しちゃんと言うと...
**GUIアプリケーションのための模範的な構造**です。
サーブレットやJSPによるWebアプリケーションも基本的にGUIアプリケーションです。
##MVCモデルにおける開発の3つの要素
MVCモデルは、アプリケーションを3つの要素(モデル、ビュー、コントローラ)に分けて開発します。以下の表に役割をまとめてあります。

|  要素      |       役割 |   
|:-----------------|:------------------|
| モデル(Model)           |アプリケーションの主たる処理(計算処理など)やデータの格納などを行う       |       
| ビュー(View)   | ユーザーに対して画面の表示を行う     |       
| コントローラ(Controller)|ユーザーからの要求を受け取り、処理の実行をモデルに依頼し、その結果の表示をビューに依頼する  |   

各要素は担当する役割が決められており、他の要素の役割は担いません。
役割を分担しておくことで、**処理の修正や拡張を行う際にどの要素に手を加えたら良いかが明確になり、アプリケーションそのものの保守や拡張**を行いやすくなる。

これらの要素が連携してアプリケーションの機能をユーザーに提供します。

##WebアプリケーションでのMVCモデルの実現
![Untitled Diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562982/555e255f-2cb2-2343-53be-0631af3d0906.jpeg)

**コントローラはサーブレットクラスの担当**
ユーザーからの要求(リクエスト)を受けて全体の制御を行う**コントローラ**は、**サーブレットクラス**が担当します。リクエストはJSPファイルでもできますが、コントローラ役には、複雑な制御や、例外処理が求められます。そのような処理はJavaが主体のサーブレットクラスのほうが適しています。

**モデルはJavaクラスの担当**
ユーザーの要求(検索など)に応える処理や、その処理に関係するデータ(検索語や検索結果)を表す**モデル**は一般的な**Javaクラス**が担当します。ここでいう一般的なクラスとは、HttpServletRequestのようなWebアプリケーションに関するクラスやインターフェースを含んでいないクラスのことです。
**利点**：Webアプリケーションの知識がないプログラマでも、モデル開発に参加できるようになります。

**ビューはJSPファイルの担当**
出力を行う**ビュー**は、HTMLの出力を得意とする**JSPファイル**が担当します。サーブレットクラスでも出力できますが、println()メソッドを大量に必要とするため処理が煩雑になってしまいます。
**利点**：JSPファイルはHTMLをそのまま書けるので、Webページのデザイン担当者にJavaの知識がなくてもデザインすることができます。

##参考文献
国本大悟『スッキリわかるサーブレット＆JSP入門　第2版』株式会社インプレス、2019年
【Laravel】セルを連結して検索

Laravel6.0

登録したユーザーの氏名(family_name)と名前(last_name)を連結してLike検索をしたいときなど。




[データベース：クエリビルダ 6.x Laravel](https://readouble.com/laravel/6.x/ja/queries.html)
>時々、クエリの中でSQLを直接使用したいことがあります。エスケープなしのSQLを使用する場合はDB::rawメソッドを使用します。

DB::rawメソッドはエスケープ処理がされていないのでSQLインジェクションに注意。

`CONCAT`関数を使用する。
[MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.5 文字列関数](https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_concat)


```php
 User::where(DB::raw('CONCAT(family_name, last_name)'), 'like', '%'.$text.'%')->get();
```





## 参考
[【Laravel】EloquentクエリでCONCAT関数を使う | 84LIFEブログ](https://nori-life.com/laravel-eloquent-concat/)
俺的Shellワンライナーチートシート（仮）

## はじめに
変態ワンライナーシェル芸人を目指す私が，ああこれどうやって書くんだっけ，という時に見るやつ．いつか整理する．この世の全てをパイプで繋ぎたい．
よくcで書いて出てきたログファイルをshellで処理しています．

### ファイルが存在していたら削除
``` non-oneline.sh
if [ -f hoge.log ]; then
    rm hoge.log
fi
```

``` oneline.sh
test -f hoge.log && rm hoge.log
```
### 変数を使い回す時に四則演算する
cのdefineで設定する定数をshell側でも使い回したい時がある．しかも，四則演算したい時がある．1引きたいとか．
例えば，100回のイテレーションをcで回して，出てきた100回分の生データをshell側でforループで回して処理したい．この時，shell内で変数を0-99の間で動かしたい．みたいな．うまく説明できない．

結論，[exprは遅いので，$((...))を使いましょう](https://qiita.com/d_nishiyama85/items/a117d59a663cfcdea5e4)，という話．

``` analyze.sh
NUM_ITERATION="100"

gcc -DNUM_ITERATION=${NUM_ITERATION} -o ./simulation ./simulation.c
./simulation > ./raw.log

for i in `seq 0 $((NUM_ITERATION -1))`; do
    grep "episode ${i}" ./raw.log | awk '{hoge}'
done
```

### grepでAND/OR
ANDは直感通り，ORはいっつも忘れちゃう．

``` letsgrep.sh
# grep de AND
cat file.log | grep "hoge" | grep "fuga"

# grep de OR
cat file.log | grep -e "hoge" -e "fuga"
```
[JavaFX]親ノードの取得の仕方

#親ノード取得についての情報少ねぇ！
ってんで勢いで書いていきます
筆者はSceneBuilder派なのでプログラムでノードを追加する処理とか知りませんので、そこは…ね？
調べ学習って言葉があるじゃん？

#親ノード取得するプログラム
まずは形式だけ

```なんか.java
Node parent = 子Node.parentProperty().get();
```

具体的に書くと

```なんか.java
Slider slider;
/*~~スライダーを追加したりする処理(各自よろしく)~~*/
Node parent = slider.parentProperty().get();
```

#兄弟？ノードを取得する
例えばこんな状況あるとするじゃん？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/aadc2767-10f5-b4e4-3333-e7965ac344d2.png)
兄弟？姉妹？のラベル「Label ズーム倍率」を取得するには

```兄弟姉妹を取得.java
Slider slider;//上記画像で青マーカー引かれてるやーつー
/*~~スライダーを追加したりする処理(各自よろしく)~~*/

Node bro= slider.parentProperty().get().getChildrenUnmodifiable().get(0);
```

Node.getChildrenUnmodifiable()で子ノード一覧のリストを取得できるから、
子ノード一覧のはじめの要素→.get(0)でLabelのノードを取得できる

#ノードのクラスを得る
例えばラベルノードのLabelを得るなら

```クラスを取得.java
Node node = どっかのラベルノード;

Label label= (Label)node;
```
まあキャストするだけですね

#親の子のクラスを得る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/aadc2767-10f5-b4e4-3333-e7965ac344d2.png)
つまりsliderから親を辿ってLabelクラスを得るには

```クラスを取得.java
Slier slider;
/*~~スライダーを追加したりする処理(各自よろしく)~~*/

Label label= (Label)slider.parentProperty().get().getChildrenUnmodifiable().get(0);
```

#以上です
以上です
【これからプログラミング&クラウドを始める人向け】AWS Cloud9 を利用して Ruby の開発環境を作ってみる② - AWS Cloud9 の環境構築

# はじめに
この記事は [【これからプログラミング&クラウドを始める人向け】AWS Cloud9 を利用して Ruby の開発環境を作ってみる① - AWSアカウント準備編](https://qiita.com/KCbogard/items/3cd4605f54c27377da38) の続きになります。

# AWS Cloud9 のセットアップ
- 前回作成した IAM ユーザーを利用してコンソールに入り Cloud9 と検索し選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/8754dd52-e64f-7d78-9785-8fd8c5d4e796.png)

- AWS Cloud9 のコンソールから「Create environment」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/9ebb8153-5406-1514-93fa-9a4ae08bc283.png)

- 環境名を入力 (説明文は任意入力なので無しでもOK)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/baaacbc3-3dbd-c5b7-4ad0-ab3802ee497d.png)

- 以下図のように Configure settings を行い「Next step」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/b413ab1a-6173-a932-45d8-b23223d7079f.png)

- 確認画面が表示され、「Create enviroment」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/f0cd2250-81f5-c4b8-ebe4-945ba72e4b6b.png)

- 選択後以下のような画面が表示される (今回は約2分ほどで構築が完了)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/8758c62f-6506-9a8c-1127-e1fe335b9416.png)

- 完了後、以下のような画面が表示される。これで環境構築は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/ca1b900f-6d1b-6144-d54b-397f8644fa01.png)

# AWS Cloud9 の画面説明
- 左側がファイル、右側がテキストエディタ、右下がターミナルとなります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/10577052-639a-0bb3-fd0c-cbb840f26f84.png)

- エディタ領域はタブ型になっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/d6b07a30-87b3-fc41-5ba9-e0ce107ba4e5.png)

- これらの設定については右側の歯車アイコンで操作が可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/ba979cc1-9d68-f697-cd9b-8c692999fa86.png)

- ちなみにブラウザでの表記なので Chrome の翻訳アドオンで日本語化ができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/f839d1ab-e9ad-5fb9-eb2c-bd3a9b0c001e.png)

# その他 Tips
- 次回以降コンソールからアクセスした場合、「Open IDE」から構築した環境にアクセス可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/5332e812-c2e1-6519-7674-5db1cc3792d5.png)

- EC2 のコンソール画面から自動停止を待たずに環境停止(=課金停止)を行うことも可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/354adb10-8129-41e1-86d1-a1888363939c.png)

- Tab Size の設定
テキストファイルのタブを開いた状態で右下の「Spaces」をクリックすると「Tab Size」が変更できます
ここで Tab Size を「2」に変更することでタブキーを押したときのスペースの入力回数が設定できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/5f0768c4-5429-d5ab-a075-247899758055.png)

- スペース等の不可視文字の可視化
スペースや改行に印をつける設定です。これもテキストファイルのタブを開いた状態で行います
右下の歯車キーをクリックして Show Invisibles にチェックマークをつけます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/9e73c01e-1c21-6e11-6e33-07281555f95a.png)

# まとめ
前回作成した IAM ユーザー を使用してクラウド上に IDE を構築し初期設定を行いました。
びっくりするくらいサクッと立ち上がるのでこれからプログラミングを勉強していきたい人に是非試してみてほしいです。
次回以降はプログラムのバージョン管理について説明していきたいと思います。お楽しみに！
Vue Router(Nuxt.js) methodsでページ遷移する方法


Vue Routerでリンクを作ってページ遷移させる時は、下記のようにすることができます。

```vue:
<router-link :to="/">Topへ戻る</router-link>
```

Nuxt.jsの場合は下記の通り。

```vue:
<nuxt-link :to="/">Topへ戻る</nuxt-link>
```
両方ともaタグとして生成されるので、ページ遷移させることができます。

しかし、methodsなどで何か処理をしたあとでページ遷移させたい時があるかと思います。
そんな時は$router.pushを使います。

```vue
<button @click="returnTop">Topへ戻る</button>

<script>
export default {
  methods: {
     returnTop(){
        this.$router.push('/')
    }
  }
}
</script>
```
`this.$router.push()`の前に処理を記述することで、処理をおこなってからページ遷移させることができます。
VSCode で自動フォーマットを行わずに保存する

VSCode(VisualStudioCode)とても便利ですよね。
保存時に自動フォーマットとかするとコードもきれいに保たれるのでよく使っているんですが、OSSとかでPRを出す際に、不必要に他の作業者の記述を調整するのは避けたかったので調べました。

フォーマット設定を一時的に外すのも面倒だなと思っていたのですが、まさかショートカットにあるとは。
ついでに他の保存系も載せます。

# 自動フォーマットせずに保存

`command` + `K` の後に `S`

# 普通に保存

`command` + `S`

# 開いている未保存ファイルを全部保存

`option` + `command` + `S`

# 別名保存

`shift` + `command` + `S`

# ちなみに

`command` + `shift` + `P`
でコマンドパレットを開いて save とか打つと関連するものがたくさん出てきます。

![command_palette.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401312/49003682-c10b-f580-cc57-65680399c6e4.png)
『恋と禁忌の述語論理』における論理学

ラノベ×論理学 という斬新な小説『恋と禁忌の述語論理』の技術的な部分のネタバレを含みます。いや、ネタバレしか含みません。Coqを使います。


## Q01. SAT問題(p10)

> `(¬c→b)⋀¬(¬a→b)⋀(d→a⋀c)` の充足解は?

含意を書き換え,二重否定除去で同値変形すると`(c⋁b)⋀¬(a⋁b)⋀(¬d⋁(a⋀c))` さらに変形出来て`(b⋁c)⋀(¬a⋀¬b)⋀(¬d⋁(a⋀c))` 

第2項から a,bはFalse。よって第1項からcはTrue。第3項から dはFalseとなり、c: 「私は台所の戸棚の上にいる」のみが正しい言明になる。

なお、主人公はp70において真偽値表を使って解いていた。それに対して硯さんの応答は

> できれば選言標準形に展開してほしかったけれど・・・(p71)

というが、CNF/連言標準形の方が簡単に作ることができる。前述の変形をあと1ステップ進めると得られて、`¬a⋀¬b⋀(b⋁c)⋀(a⋁¬d)⋀(c⋁¬d)`がCNFとなる。

硯さんの指示通りにDNFにしてみよう。CNFの第3項を分配則をつかうとbの方はCNFの第2項を考慮すると⊥となるので展開せずに済むので`¬a⋀¬b⋀c⋀(a⋁¬d)⋀(c⋁¬d)`となり、第4項に分配則を使うとaについて同様のことが言えて`¬a⋀¬b⋀c⋀¬d⋀(c⋁¬d)`となり、第5項に分配則を使うと左側は第3項よりTとなり、右側は第4項よりTとなるので、結局`¬a⋀¬b⋀c⋀¬d`がCNFとなる。充足解は自明に一つしか存在しないことがわかる。

## Q02. 行為は故意か？(p85)
> Z(行為は故意でない)を証明せよ。仮定: P,Q,R,(P⋀Q)→S,S→T,T⋀R→U,U→Z

Coqで証明

```coq
Goal forall P Q R S T U Z: Prop,
 P->Q->R->(P/\Q->S)->(S->T)->(T/\R->U)->(U->Z)->Z.
Proof. intros. apply H5. apply H4. split.
- apply H3. apply H2. split;assumption.
- assumption. Qed.
```

硯さんは証明としては正しいが、仮定のうち `U→Z` つまり「必要のない行為を行った ならば 行為は故意ではない」が妥当ではないと指摘し、正しい推論となっていないことを指摘する(p86)。

彼女は、正しい仮定を補うことで、`¬Z`つまり行為が故意である、という全く逆の結論を証明した(p93)。

> ¬Zを証明せよ。仮定: Y→¬Z,P,Q,R,S,T,T⋀Q⋀R→U,U⋀S→V,P⋀V→Y

Coqで証明

```coq
Goal forall P Q R S T U V Y Z:Prop,
  (Y->~Z)->P->Q->R->S->T->(T/\Q/\R->U)->
  (U/\S->V)->(P/\V->Y)->~Z.
Proof. intros. apply H. apply H7. split;try assumption.
apply H6. split;try assumption. apply H5. split;try assumption.
split; assumption. Qed. 
```

印象的だったのは、『櫁川さんがそれが しきみの実だと認識して あえて渡したこと』から『行為が故意である』ことが形式的に証明され、それが現行法では殺意があると解釈されるということ。

## Q03. 幽霊には足が無い？(p150)
硯さんは中尊寺先輩の推論を正しいと認めたうえで、排中律を使っていることを指摘した。排中律の使用、特に対偶命題による証明は様々な奇妙な推論を生み出す。ヘルペスのカラスの議論を敷衍して、彼女の家に住む幽霊に足が無いことを証明して見せた(p151)

> 私はできるわ。この家の『足』があるものを全て持ってきて。人間、人形、冷蔵庫のタコ、椅子、それらは全て『足』があるけれど、どれも幽霊じゃないわよね。だから『足があるものは幽霊ではない』すなわち『幽霊ならば足はない』

Coqで証明:

```coq
Axiom classic: forall (P:Prop), P \/ ~P.

Goal forall (thing:Type) (x:thing) (Leg:thing->Prop) (Ghost:thing->Prop),
  (Leg x -> ~Ghost x) -> Ghost x -> ~Leg x.
Proof. intros. destruct (classic (Leg x)) as [C|C]; try assumption.
exfalso. apply H; assumption. Qed.
```

## Q04. 様相により証明が妥当でなくなる時(p263)

> ¬Qを証明せよ。仮定: P→I,Q→O,I->O->⊥,P

Coq で証明:

```coq
Goal forall P Q I O:Prop,
 (P->I)->(Q->O)->(I->O->False)->P->~Q.
Proof. intros. intro. apply H1.
- apply H. assumption.
- apply H0. assumption. Qed.
```

ところが少し仮定を様相的に変更するだけで、¬Qの証明ができなくなってしまう。

> ¬Qの反例を挙げよ。仮定: P→□I, Q→◇O, I⋀O->⊥, P 

世界w が自身に到達できない時、P,Oを真、Q,Iを偽とする付値において、wにおいて仮定は充足するが¬Qは充足しない。
【#PowerAutomate】Microsoft Forms のアンケート内容を Common Data Service に保存する

# 概要

Power Apps Startup Meeting@広島 でライブデモで行った Microsoft Forms と データソース(デモ時は Common Data Service) の解説記事。
尚、データソースを CDS ではなく Excel にした場合は、 Automate は必要なく、既存の Excel の機能で作成できます。

登壇資料は[こちら](https://www.slideshare.net/ssuser6e9dab/power-apps-1)

# Forms を用意

お使いのアカウントで適当に Forms を用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/43487a7a-906d-0d57-d383-c257fc996233.png)

# Automate でフローを作成

最終的なイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/4c89726b-6124-23bd-352e-c5ca4862d1a6.png)


## POINT 応答詳細の取得

Forms のトリガーで取得できるものは **応答ID** と呼ばれるもので、指定したフォームの応答を一意に特定するIDのみが取得できます。その為、そのIDを利用して フォームの回答を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/6b6a10c8-57b3-2c2d-7423-8fcf1e57e04d.png)

# Automate の詳細

展開するとこんな形です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/e0265811-5a02-d2c0-1bf2-5238f4a05831.png)

応答内容は文字列で取得できますが、今回は気にせずに文字列で登録しています。
Name プロパティには GUID()関数を指定して、一意のIDを登録しています。

# まとめ

いかがでしたか？
実際にフォームのアンケートを簡単に Common Data Service に登録することができました。今回は Common Data Service を選択していますが、別のデータベースを指定しても同様の形で作成できますのでぜひトライしてみてください。
【ふくだ学習録】ゼロから作るDeepLearning part1【6日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )

# はじめてのパターン認識を読んで(前置き)

「はじめてのパターン認識」を読んでいたのですが、その前に「ゼロから作るDeepLearning」を読んだ方が良さそうだった。（個人的にはそのほうが理解が進みそう）
なので、いったんパターン認識での学習はストップして、こっちの本の学習に入ります。
また数式的理解を深めるべき段階になった時に「はじめてのパターン認識」を読んでいきたいです。

下記サイトの勉強方針を参考にしました。
[機械学習初心者が1年間イロイロ勉強した遍歴[2018年度版]](https://qiita.com/ejama/items/071de616e88eff5d6709)

# ゼロから作るDeepLearningを読んで

### NumPyとは？
数値計算をするためのPythonライブラリ。
高度な数学アルゴリズムや配列（行列）を操作するための便利なメソッドが数多く用意されている。

### Matplotlibとは？
グラフ描画のためのライブラリ。
Matplotlibを用いることで、実験結果の可視化や、ディープラーニング実行途中のデータを視覚的に確認することができる。

### pyenvとは？
pythonのバージョンを簡単に切り替えることができるようにしてくれるツール。
まぁどの言語にもよくあるバーション管理ツール。

### Anacondaディストリビューションとは？
Python本体＋高度な数値計算やデータ分析、機械学習を行う用のライブラリがセットになっているもの。
実務レベルの場合、Anacondaディストリビューションを使用するのか、一からライブラリ構成考えて組み立てていくののどっちが主流なのかは不明。（実務では１から作っていくのが多そうなイメージはある）

インストール思ったより時間かかる…

### Pythonインタプリタを使用する方法
`$ python`と打つだけ。

### スライジングとは？
Pythonのリスト型で使用できる記法。

```python:
>>>a = [1, 2, 3, 4, 5]

>>> print(a)
[1, 2, 3, 4, 5]

>>> a[0:2] #インデックスの０番目から２番目まで（２番目は含まない）まで取得
[1, 2]

>>> a[1:] #インデックスの1番目から最後まで取得
[2, 3, 4, 5]
```

### ディクショナリとは？
Pythonの型。キーと値をペアとしてデータを格納する。
JSでいうオブジェクト。

### if文の際に注意すること
if文の次の文は、空白4文字インデントする。

```python:example.py
hungry = True
if hungry:
    print("I'm hungry")
```

基礎文法は下記サイトを参考にしていく。
[Python3基礎文法](https://qiita.com/Fendo181/items/a934e4f94021115efb2e)

### NumPy配列の作成
NumPy配列を作成するには、`np.array()`というメソッドを使用する。
`np.array()`は、Pythonのリストを引数にとり、NumPy用の配列（`numpy.ndarray`）を作成する。

```python:example
>>> x = np.array([1.0, 2.0, 3.0])

>>> print(x)
[1. 2. 3.]

>>> type(x)
<class 'numpy.ndarray'>
```
（これをする意味が果たして何なのかは、きっと後々わかるはず…）

### NumPy配列の算術計算
要素数が同じ配列x,yの場合、各要素ごとに四則演算を行うことができる。
（要素数が異なる場合は、エラーになる）

またNumPY配列と、単一の数値の組み合わせで算術計算を行うこともできる。
この機能のことを**ブロードキャスト**と呼ぶ。

### NumPyのN次元配列
NumPyでは、１次元の配列だけではなく、多次元配列も作成することができる。

```python:example
>>> A = np.array([[1, 2], [3, 4]])

>>> print(A)
[[1 2]
 [3 4]]

>>> A.shape
(2, 2)

>>> A.dtype
dtype('int64')
```

行列同士の四則演算を行うこともできる。（要素ごとに）またブロードキャストも可能。

# 今日の一言
Python初めて書いたけど、記法シンプルで簡単そう。
若干Python実行環境のインストールで時間がかかったから学習がそこまで進まなかったけど、環境構築でつまずくことは無かったから、その辺りはJSとかRubyとかを経験しててよかったなと思った！
あとAnacondaって実務レベルでも普通に使うディストリビューションなのかどうかきになるから、今日先輩に聞いてみる！
ベローチェの黒糖カフェオレうまい！
CloudfrontにAWS WAFのManagedRuleを適用してみた

#目的
AWS WAFが便利と聞いておりましたが、まだ実運用したことがなかったので環境に適用してみました。
設定完了がゴールです。

#構成図
前回の構成図にWAFを追加した形です。
![Arch3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136929/516bb999-d8cb-19cd-eecd-302e636ae5ea.png)

#手順
AWS WAFの作成のため、WEB ACLsを作成します。

![WAF1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136929/35c19511-7c20-2954-cd89-974cdc2f6f1d.png)
リソース名を入力します。

![WAF3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136929/affa2f92-9bf4-1423-206e-5c7c39f69104.png)

resource typeを選択します。cloudfront構築済環境ですので、cloudfrontを選択し、対象のresourceを選択します。

![WAF2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136929/ab79bee0-5a5c-4970-4775-6073e6885105.png)

次に進み、ルールを選択します。今回はmanaged rule groupを選択します。
![WAF4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136929/57a2a935-1fea-a776-a84e-0aa674003bc3.png)

Add managed rule groupsからルールを選択します。
今回はS3静的サーバレス環境、かつ初めてなので「Admin protection」のみを適用しますが、WordPressやAP＋DB構成を採用している場合は別の構成も検討した方がよさそうです。

![WAF5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136929/401244ea-818e-9e94-a48e-ceb2b140ecb4.png)

「Default web ACL action for requests that dont't match any rules」と聞かれるので「Allow」を選択します。
試しておりませんが、blockを選択するとアクセスできなくなると思われます。

![WAF6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136929/72c096be-9699-b6a1-73bd-0a06acc459b4.png)

Set rule priorityを聞かれるのでルールの優先順位を設定します。今回は一件なのでデフォルトのまま、次へを選択します。

![WAF7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136929/2e0f9e80-9cc2-eb93-a34e-540c847628a8.png)

configure metricsを聞かれるので、チェックしてメトリックを設定します。

![WAF8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136929/4e520377-6673-d3c9-4f71-f685e99feaef.png)

設定を確認し、create web ACLsをクリックします。

![WAF9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136929/9731c789-9300-19a2-2a9b-719e6f05d44a.png)

#気づき
1.設定の確認が難しそう
ACLの動作確認を行なう方法は、選択したルールに合わせた脆弱性診断を実施することだと考えられますが、簡単には実施できないので代替手段を検討すべきだと考えております。

2.利用料金
他のAWSサービスと同様に、使った分だけ課金されます。
今回設定した内容だとWebACL1つ、ルール一つなので\$5+\$1+\$0.6＝$6.6/月ほどの利用料金となる予定です。
他のライセンスに比べて安いてすが、個人サイトでどこまで守るかは要検討だと考えております。Wordpress環境の場合PHP対策のルールやSQLiを利用した方がよいと考えてます。

https://aws.amazon.com/jp/waf/pricing/

| リソースタイプ	   | 料金 　　　　　　　|
|:-----------------|:------------------|
|Web ACL            | 5.00USD、月あたり (時間で案分)             |
|ルール　　　　　　　| 1.00USD、月あたり (時間で案分)             |
|リクエスト           |0.60USD 100 万リクエストあたり              |
AWS ElasticBeanstalk 環境を切り替える方法（EB CLI）

# はじめに
一つのサービスを提供する場合でも、Blue-Green Deploymentをする時は複数の環境を使用することになります。
EB CLIを使って、 ElasticBeanstalk の環境を切り替える方法をすぐに確認できるようにまとめさせていただきました。


#### 関連リンク
関連リンクを下記に載せておくので、必要であれば参考にしてください。。

* ElasticBeanstalk Blue-Green Deployment
    * https://qiita.com/syukan3/items/28eba7462c26409773e6
* AWS CLI アカウントを切り替える方法
    * https://qiita.com/syukan3/items/d01824e5b8f6ac9c387c

# EB CLI
Elastic Beanstalk コマンドラインインターフェイス（EB CLI）の略。
Elastic Beanstalk をターミナルからコマンドを操作することで、ローカルリポジトリからの環境の作成、更新、およびモニタリングを簡素化することができる。

数個の EB CLI のコマンドさえ覚えておけば、アプリケーションをデプロイできてしまう素晴らしいサービス・コマンドラインです。


## インストール・設定・基本事項
個人的にまとめるよりも、公式にてまとめられているものが非常にわかりやすく理解しやすいと思いますので、リンク先を載せておきます。

* EB CLI のインストール
    * https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install.html#eb-cli3-install.scripts
* EB CLI の設定
    * https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-configuration.html
* EB CLI による Elastic Beanstalk 環境の管理
    * https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-getting-started.html




## 環境を切り替える方法（同じアカウント内での変更）

```
$ eb use ${環境名}
```

## 環境を切り替える方法（別のアカウント内での変更）

```
$ eb use ${環境名} --profile ${別アカウント名}
```

別アカウントの名前を確認する方法は、下のリンクを参照してみてください。

* AWS CLI アカウントを切り替える方法
    * https://qiita.com/syukan3/items/d01824e5b8f6ac9c387c

# まとめ
まとめてはみたものの、結局は前に書いた記事と同じ方法+αになってしまいました。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
【MySQL】データベースにユーザーを作成・権限付与する

MySQLのDBでユーザーを作成・権限付与などするときのコマンド覚書です。

```sql:SQL
grant all privileges on db_name.* to db_user@'localhost' identified by 'db_pass' with grant option;
```

これは、以下の意味となります。

```sql:SQL
grant [権限] on [適用対象のデータベース].[適用対象のテーブル] to 'ユーザ名'@'ホスト名' identified by 'パスワード';
```

- `with grant option` を指定すると他のユーザーにも同等の権限を与えられるようになる。
- `grant all privileges` の`privileges` は省略可能で `grant all on db_name~` でもよい。
- 対象ユーザーが未作成の場合は `create` 文を使わなくても `grant` 文で作成可能。



#### 参考URL

[MySQLでユーザを作成し、権限を設定する方法](https://proengineer.internous.co.jp/content/columnfeature/6638)
[ユーザーを作成する(CREATE USER文)](https://www.dbonline.jp/mysql/user/index1.html)
[GRANT -- アクセス権限の定義](https://www.postgresql.jp/document/8.0/html/sql-grant.html)
[IBM Knowledge Center | WITH GRANT OPTION キーワード](https://www.ibm.com/support/knowledgecenter/ja/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_0125.htm)
新言語シールド言語の応用

#_nothing()メソッドとは。

```exp.shie
text = ""
if(text): #False
    text = "存在します"
else:
    text = "ヌルです"
output(text) #->ヌルです。
```

_Nothing()メソッドは特定の値の条件の時if式及びif構文及びfor式及びfor構文でFalseを返すように命令する関数です。組み込み型だとint(0),float(0.0),str(""),list([])tupple(()),dict(Dict<>{})等があります。中身が存在しないときに調べるのに便利です。
以下の場合はTrueを返します。
**0 is _Nothing()**
ただし、以下の場合Falseを返します。
**0 is Null**
あくまで中身が存在してるか調べる関数です。
なお_nothing()メソッドが存在しない場合はNull又はNone以外のものは全てTrueを返します。例外はありません。
最後にこのメソッドはpubを設定しておくこと(なければprivateになるから注意。protectでも×)。

#_fin()メソッドとは
ファイナライザ(ディストラクタ)と呼ばれています。これを使うことで、特定のインスタンスを破棄したときに特定の命令(音楽変更等)をしやすくする効果があります。覚えていて損はありません。GCがあるので基本は使わなくていいです。必ずpubに設定しておくこと。

#覚えておくと便利
varキーワードは値が変更できることを示します無ければ初期値の代入記号(=)で判別します。
constキーワードは値が変更できないことを示します無ければ初期値の代入記号(:=)で判別します。
anyキーワードは型も値も変更できることを示します無ければ初期値の代入記号(;=)で判別します。
defキーワードはプロシージャ―またはメソッドであることを表します。
extremeキーワードは自分より下にあるプロシージャ―またはクラスまたは静的メソッドを参照するときに使います。

#バージョン0.1より
可読性の為書き方が変わりました(パスカル式に変更)
ラベル付けに##が使えるようになりました。
from yyy import where xxx select ref zzz　を追加これにより特定のパッケージを生成可能ref分以降がなく*になっている場合は省略可能。
明示的にconstやanyを記述すれば(=)で代入や束縛ができるようにしました。
from XXX delegate YYYでXXXと書けばYYY関数が呼ばれるようにしました。
Unit型(None,Null兼用)が追加されました。

```
ex1/from hogehoge.HugaHuga.Gito_Gito delegate Gito #普通に別名
ex2/from hogehoge.HugaHuga.Gito_Gito(var x,var y) delegate Gito(var x,2) #特殊な方法で別名
```

```ex.shie

var name0:opt int #<-変数 name0はオプション付きのint(型)です
var name1:str #<-変数 name1はstr(型)です
from Kout import where *&std&* select ref vak #Koutモジュールから*std*を選んでそれをvakにパッケージングする。
pub var name2:int $ set(val) get del  #<-公開変数 name2 はint(型)でセッター,ゲッター,デリーターを保持しています

def forsum(var name:int,const mmk:int):(int):
	return name+= ##bre from(i in range(mmk)) where * with($1(i is not _Nothing() and (name)) $2*)select($1 name $2 break##bre)

```
Debian 11 Alpha 1 と、pintaをインストールする方法

## download

* [Debian -- Debian インストーラ download](https://www.debian.org/devel/debian-installer/)
    * [relase note](https://www.debian.org/devel/debian-installer/News/2019/20191205)

* [distrowatch](https://distrowatch.com/table.php?distribution=debian)によると kernelは5.4.8 の予定。
    * Release ModelがSemi (windows10のようなSACという半期に一度のリリース)になる様子。


## pinta を入れる方法

* Ubuntuでは標準リポジトリに含まれているが、Debianでは追加が必要。
* https://notesalexp.org/ で配布されている。

`/etc/apt/sources.list.d/notesalexp.list`
を編集

```sh
# debian 11の場合
deb https://notesalexp.org/debian/bullseye/ bullseye main
```

```sh
# debian10の場合 (参考まで)
deb https://notesalexp.org/debian/buster/ buster main
```

```sh:インストール
wget -O - https://notesalexp.org/debian/alexp_key.asc | sudo apt-key add -
sudo apt update

sudo apt install -y pinta
```

## Imput Method toolbar

```
uim-pref-gtk3
```
REST APIとDDDの相性が良いと思っている話

## 著者が勉強している状態
- [エリックエヴァンスのドメイン駆動設計を14章まで読んだ](https://www.amazon.co.jp/dp/B00GRKD6XU/)
- [実践ドメイン駆動設計は所持しているが未読](https://www.amazon.co.jp/dp/B00UX9VJGW/)

### 相性がいいと思った理由
　REST APIとDDDの相性がいいと思ったのは、エヴァンス本の第2部第6章 ドメインオブジェクトのライフライクル の集約の節に記載されているこの文章を読んで思った。  

```
エンティティと値オブジェクトを集約の中にまとめ、各集約の集約に境界を定義すること。
各集約に対してルートとなるエンティティを1つ選び、
境界の内部に存在するオブジェクトへのアクセスはそのルートを経由して制御すること。
```

上記言葉の例として、エヴァンス本では車の例が上がっていたので、そのままの例を使用してみます。

- 集約ルート
    - 車

- エンティティ
    - 車
    - ブレーキ
    - タイヤ
    - エンジン

ブレーキの状態を確認するときに、ブレーキを直接参照しない。  
車という集約を通して、ブレーキの状態を参照する。  
  
以下は。車の集約ルートを通して、ブレーキが交換時期なのかを確認する。

```java
public class Car {
    private String id; // ID
    private Brake brake; // ブレーキ
    private List<Tire> tires; // タイヤ
    private Engine engine; // エンジン

    // ブレーキ交換時期
    private boolean brakeTimeToReplace(){
        return this.brake.timeToReplace();
    }
}

public class Brake {
    private String id; // id
    private int mileage; // 走行距離

    // 交換時期
    private boolean timeToReplace(){
        // 7万キロ以上走ったら交換時期
        return this.mileage >= 70000;
    }
} 
```

### 集約をエンドポイントで表現しようとしたときに

このブレーキの例がそのまま、URI で表現できるのではないのかと思った時に、自分の中で電撃が走りました。  
  
REST APIでは、1つのリソースに対してアドレス可能なURIを用意するので、エンドポイントに悩んだときに、適切な構造を探し続ける思想の DDD とマッチすると思ったからです。

```code
// 集約を意識したエンドポイント
http://localhost:8080/car
http://localhost:8080/car/{carId}?type=brake

// 集約を意識しないエンドポイント
http://localhost:8080/car
http://localhost:8080/brake?brakeId={brakeId}
```

カーディーラー や 車検 のユースケースでは、ブレーキのエンドポイントを露出させる必要はありませんが、修理　のユースケースでは、ブレーキそのものが集約となって、ブレーキのエンドポイントを露出させる必要があります。   
  
そう考えた時に、外部に対して何を提供したいのか、言い換えると適切なエンドポイントは、集約の単位で行うべきではないかと考えています。  
  
  
ただ、エンティティのエンドポイントは集約で良いと思いますが、値オブジェクトは集約を意識せずに提供してもいいと思います。  


## とはいえ現実的に
あくまで、以下の2点から現実的には維持するのは厳しいと思います。  

- エンドポイントが変わることによる外部影響
- 性能上の問題

### エンドポイントが変わることによる外部影響
　DDDではリファクタリングを続けることによって、システムにとって適切な構造になるように努力します。
そうなると、エンドポイントで提供していた構造と、リファクタリングによって変更された構造と大きく変わってきてしまいます。  
  
どこかでバージョンアップして、適切な構造を提供するようになると思いますが、同期は取れないですし、そもそも構造の代わるバージョンアップに対応するのって結構めんどくさいですからね。  
  
あまりにも大きい変更を繰り返すと嫌がられるとは思うので、古いバージョンも提供しつつ、新しいバージョンも対応するようになると思います。
  


全く関係ありませんが。
VISAとか、変更箇所を通知して1年後にようやく変更するらしいですね。  


### 性能上の問題
　適切な集約の構造で提供した結果、エンドポイントがバラバラになって1画面表示するのに何度もアクセスが走ってしまう可能性もあります。  
  
そうなったときは、REST APIの原理とは離れますが、なんでも取得する頭のいいAPI(皮肉)として提供するか、graphQL等で提供するしかないんじゃないでしょうか。(思考放棄)

REST API も DDD も性能問題に関しては、解決方法を持っていないので、対応できないと思ってます。

# まとめ
- リソースをURLで表現するREST API と 構造を探求し続けるDDD は相性はいい(はず)
- ただし、現実問題として相性も合わない点もある
- エンドポイントは、エンティティなら集約ルート、値オブジェクトはそのまま提供した方が良い(と思う)
SHA-1の新しい脆弱性について（2020/01/07報告）

# さらにSHA-1の脆弱性の報告

暗号など、サイバーセキュリティの大家である<a href="https://www.schneier.com/" target="_blank">ブルース･シュナイアー氏のブログ</a>によれば、さらにまたSHA-1の脆弱性が発見されたようです。すでに2015年には大きな脆弱性（<a href="https://sites.google.com/site/itstheshappening/" target="_blank">The SHAppening</a>）が発見され、もはやSHA-1の信用性は地に落ちておりますが、使用頻度が減っているとはいえ、まだまだ使われているところもあります。一応、さらなる注意が必要です。

その記事はコチラ。
https://www.schneier.com/blog/archives/2020/01/new_sha-1_attac.html

ほぼママですが、以下意訳してみました。

# ブルース･シュナイアー氏のブログ記事（翻訳）

## 新しいSHA-1攻撃

SHA-1への新しい実践的な<a href="https://eprint.iacr.org/2020/014.pdf" target="_blank">衝突攻撃</a>：

> この論文では、この攻撃の最初の実用的な実装と、PGP/GnuPGのなりすまし攻撃による実際のセキュリティへの影響を報告しています。SHA-1に対する衝突攻撃の複雑さを大幅に減らすことができました。それはNvidia GTX 970で、同一プレフィックスの衝突は264.7よりも261.2の複雑さで、選択されたプレフィックスの衝突は267.1よりも263.4の複雑さで計算できます。 安価なGPUをレンタルする場合、学術研究者のできる範囲内で、この衝突にかかる計算コストは1万1,000米ドルになり、選択したプレフィックスの衝突の場合は４万5,000米ドルになります。実際の攻撃には、900個のNvidia GTX 1060のGPUを使用して2ヶ月の計算が必要です（ GPUの価格が高かったため、7万5,000米ドルを支払い、攻撃の準備に時間を浪費しました）。

<a href="https://sha-mbles.github.io/" target="_blank">実践的なアプリケーション</a>：

>SHA-1に対する選択されたプレフィックスの衝突攻撃のデモンストレーションとして、PGP/GnuPGの信用の輪（Web of Trust）を選択しました。信用の輪（Web of Trust）は、セントラルPKIを使用する代わりに、ユーザーが互いのID証明書に署名することに依存するPGPに使用される信頼されるモデルです。互換性の理由から、GnuPG（バージョン1.4）のレガシーブランチは、ID認証にデフォルトでSHA-1を使用します。
>
>SHA-1選択プレフィックスの衝突を使用して、異なるユーザーIDと衝突する証明書を持つ2つのPGPキーを作成しました。鍵B（Web of Trustによって署名される）はボブにとっての正当な鍵ですが、署名はAの鍵、アリスのIDを持つ偽造された鍵へ転送できます。衝突のため、署名は引き続き有効ですが、アリスの名前付き鍵Aをボブはコントロールでき、3rdパーティーによって署名されます。したがって、彼はアリスになりすまし、彼女の名前で任意の文書に署名することができます。

この<a href="https://arstechnica.com/information-technology/2020/01/pgp-keys-software-security-and-much-more-threatened-by-new-sha1-exploit/" target="_blank">新しい記事</a>によれば：

>その新しい攻撃は重要な意味を持ちます。SHA1は過去5年間で徐々に段階的に廃止されてきましたが、完全に非推奨となるにはほど遠いままです。それはまだGnuPGのレガシー1.4バージョンブランチによるPGP鍵での認証するためのデフォルトのハッシュ関数です。それは、電子メールとファイルを暗号化するためのPGPアプリケーションのオープンソースの後継です。これらのSHA1によって生成された署名は、最近までGnuPGの最新のブランチによって採用されおり、その新しい衝突について個人的に結果を報告した研究者たちは後にすぐ却下されました。
>
>Gitは、多くの人々の間でソフトウェア開発を管理するために世界で最も広く使用されているシステムですが、データの整合性を確保するためにまだSHA1に依存しています。そしてまた、HTTPS暗号化に依存する多くの非Webアプリケーションでは、SHA1証明書を引き続き頼っています。SHA1は、トランスポート層セキュリティおよびセキュアシェルプロトコルのプロトコル内署名に対しても引き続き使用を許されています。

（引用、翻訳ここまで）

# もはやSHA-1の信用性はない

すでにSHA-1にはいくつもの致命的な脆弱性が発見され、Googleも2017年、具体的な衝突例を<a href="https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html" target="_blank">公開</a>しています。2015年からサーバ証明書にSHA-1が使われているサイトに関しては警告を出すようにGoogle Chromeでの改良も進んでいます（他のモダンブラウザでも現在はほぼすべてが対応済みです）。

現在のサーバ証明書も、ほとんどは<a href="https://ja.wikipedia.org/wiki/SHA-2" target="_blank">SHA-2</a>使用への移行が進んでおり、ウェブサイト証明書はもちろんのこと、非Webアプリケーションにおいての使用も廃止する方向でしょう。

ちなみに、SHA-2とは、SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256の6つのバリエーションを持っていて、SHA-1の上位互換的な位置付けのものです。仕様的には、「SHA-1」の改良版アルゴリズムといったところです。

実は2015年にアメリカ国立標準技術研究所(NIST)が、SHA-1への攻撃に対応するために、新しいハッシュ関数を公募して、<a href="https://ja.wikipedia.org/wiki/SHA-3" target="_blank">SHA-3</a>というSHA-2シリーズとはまったくちがう仕様のアルゴリズムを選出しましたが、2017年時点ではSHA-2に対する致命的、有効的な攻撃方法が見つかっていなかったため、SHA-3の採用はあまり進んでいません。

したがって現状、SHA-2への移行が現実的でしょう。