OmniAICreator/Qiita-1.07M huggingface dataset:
Keychain（iOS,Swift）対応



## KeyChain とは
キーチェーンと呼ばれる暗号化されたデータベースに
下記のユーザーデータの小さなビットを格納するメカニズムです。

・パスワード
・Trust Servicesで管理する暗号化キーと証明書
・秘密メモ

### キーチェーンアクセス
パスワードやアカウント情報を保管するmacOSアプリケーション


## iOSのUserDefaults

ユーザーのデフォルトデータベースへのインターフェイスです。

・長点： アプリの起動時にキーと値のペアを永続的に保存します。
　　　　処理が簡単であること。
・短点： アプリ削除ですべて消えること。
　　　　データがそのまま保存するため、安全ではないこと。
　　　　構造体はそのまま保存できないため、Dataなどで変換して保存しないといけないこと。

## iOSのKeychain 

・長点： アプリ削除しても消えないこと。
　　　　セキュアな値を保存できること(apple推奨)
・短点： 処理が少し複雑
　　　　大量のデータ保存には向いてないこと。


### kSecClass 
kSecClassGenericPassword: パスワード（通常）
let kSecClassInternetPassword: パスワード（Internet）
let kSecClassCertificate: 証明書？
let kSecClassKey: 暗号鍵（秘密鍵、公開鍵など）
let kSecClassIdentity: 秘密鍵付き証明書

```swift
 let dic: [String: Any] = 
[kSecClass as String: kSecClassGenericPassword,
kSecAttrGeneric as String: key,           // 自由項目（グループ）
kSecAttrAccount as String: "account",     // アカウント（ログインIDなど）
kSecValueData as String: data]            // 保存情報
```

### ユニークキー

検索時にある１つのアイテムを特定するキー（ユニークキー）は kSecClassGenericPassword の場合、
次の２つで構成されている 
kSecAttrAccount
kSecAttrService

### Keychain 登録/更新
```swift

// 保存データが存在するかの確認
let matchingStatus = SecItemCopyMatching(dic as CFDictionary, nil)
switch matchingStatus {
// 保存
case errSecItemNotFound: 
    SecItemAdd(dic as CFDictionary, nil)
// 更新
case errSecSuccess: 
   SecItemUpdate(dic as CFDictionary,
                 [kSecValueData as String: data] as CFDictionary)
default:
    debugPrint("キーチェーン保存失敗(\(matchingStatus)")
}
```
### Keychain 取得

```swift
var dataTypeRef: AnyObject? = nil
let matchingStatus = withUnsafeMutablePointer(to: &dataTypeRef) {
    SecItemCopyMatching(dic as CFDictionary, UnsafeMutablePointer($0))
}
if matchingStatus == errSecSuccess,
   let getData = dataTypeRef as? Data {
       // キーチェーン取得結果
       String(data: getData, encoding: .utf8)
}
```

### テストコード
```swift
func testKeychainIfSaveKeychainThenEqualToGetKeychainResult() throws {
    guard let data = "testtest".data(using: .utf8) else {
        XCTFail()
        return
    }
    let key = "encryptedkey"
    let value = SHA256.hash(data: data).hexStr
    KeychainAccess.saveKeyChain(key: key, vaule: value)
    let result = KeychainAccess.getKeyChain(key: key)
    XCTAssertTrue(value == result)
}
```

## 課題
 ・kSecClassKeyなど対応方法は？
　kSecClassGenericPassword　を kSecClassKey変更した場合、キーチェーンから情報が取得できませんでした。


## 参照
[キーチェーンアクセスユーザガイド](https://support.apple.com/ja-jp/guide/keychain-access/kyca1083/mac)
[Apple - UserDefaults](https://developer.apple.com/documentation/foundation/userdefaults)
[KeyChain Services](https://developer.apple.com/documentation/security/keychain_services#//apple_ref/doc/uid/TP30000897-CH204-TP9)
[Apple - Item Class Keys and Values](https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_class_keys_and_values)
[[iOS] Keychain Services とは](http://cocoadays.blogspot.com/2011/02/ios-keychain-services.html)
ワンランク上のTerraform使いになるための小技

# 前提
AWSをTerraformで構成する場合、を前提とした小技を記述します。

## リモートステート
何も設定せずにTerraformをデプロイすると、ローカルに`tfstate`ファイルが生成されます。
tfstateはデプロイしたクラウドの実リソースの構成情報が記述されています。この手のファイルはプライベートに扱うべきで、Gitで管理するべきではありません。また、複数人でTerraformを管理する場合、このtfstateを複数の作業PCで共有する必要があります。
そこで、クラウド上にリモートステートとしてアップロードし、必要に応じて管理する。という方法が推奨されています。
具体的にはAWS S3がよく利用されます。
また、DynamoDBを追加することで、複数人での同時書き込みによる競合の発生を防ぐこともできます。

```terraform
terraform 
{
backend "s3" {
    bucket = "tfstate"
    key = "terraform.tfstate"
    region = "ap-northeast-1"
    }
}
```
> https://qiita.com/saiya_moebius/items/a8f8aa3683c2347d607c

## Data Only Module
モジュールは複数のリソースで構成される機能を1つにまとめておくものですが、リソースを含めない用途があります。
Data Only Module では指定した条件(tags="staging"を持つaws_vpc,aws_subnet)に合致するリソースを参照し、出力値としてvpcのidを持つモジュールを定義します。
これにより、柔軟なモジュール実装を可能にします
例では Tags にマッチするものを参照していますが、
他に aws_vpc では state を参照することで、available なVPCのみを参照したりできます。
また、リモートステートやリテラルで参照も可能です。

```terraform:DataOnlyModuleを定義
data "aws_vpc" "main" {
    tags = {
        Environment = "Staging"
    }
}
data "aws_subnet" "main" {
    tags = {
        Environment = "Staging"
    }
}
output "vpc_id" {
    id = data.aws_vpc.main.id
}

```

>https://www.terraform.io/docs/modules/composition.html#data-only-modules

## SSMパラメータストア
AWSのSSMパラメータストアを利用することでプロジェクトやリソースをまたいだグローバル変数を扱えます。

```terraform:SSMパラメータストアへ代入
resource "aws_ssm_parameter" "main" {
    name = "/dev/network/cidrblock"
    value = aws_vpc.main.cidrblock
    type = "String"
}
```

```terraform:SSMパラメータストアから参照
data "aws_ssm_parameter" "cidr" {
    name = "/dev/network/cidrblock"
}
resource "aws_vpc" "main" {
    cidr_block = data.aws_ssm_parameter.cidr.value
    tags = {
        Name = "test"
    }
}
```

## Count引数
リソースに対し`count`引数を与えると、与えた数だけ同じリソースが作成されます。
作成する数に応じて一部パラメータを変える必要があるときは`count.index`を参照。

```terraform:リソースを3つ複製
resource "aws_vpc" "main" {
    count = 3
    cidr_block = "10.${count.index}.0.0/16"
}
```

また、三項演算子と`count`を組み合わせることでリソースの作成の可否を制御できます。

```terraform:リソースの作成を制御
resource "aws_vpc" "main" {
    count = var.create_vpc ? 1:0
    cidr_block = "10.0.0.0/16"
}
```

## 組み込み関数
Terraformには様々な組み込み関数が用意されています。利用するうえで動作を確認したい場合`terraform console`で対話式に動作を確認できます。

> https://www.terraform.io/docs/configuration/functions.html

## マルチリージョン
複数のリージョンでリソースを作成する際に、デフォルトのリージョンと明示的に指定した場合のリージョンを設定することができます。
以下ではデフォルトが`ap-northeast-1`で明示的に`virginia`を指定すると`us-east-1に作成されます`

```terraform:リージョンを定義
provider "aws" {
    alias = "virginia"
    region = "us-east-1"
}
provider "aws" {
    region = "ap-north-east"
}
```

```terraform:リージョンを参照
resource "aws_vpc" "at_virginia" {
    provider = "aws.virginia"
    cidr_block = "10.0.0.0/16"
}
resource "aws_vpc" "at_tokyo" {
    cidr_block = "10.0.0.0/16"
}
```
【Swift】Hello Swift!と表示させる

#はじめに
現在、書籍を使ってSWiftの勉強をしています。
備忘録として記事を書きます。

##Labelを配置
①project navigatorからファイルの一覧表示
②Main.storyboardを選択
③View Controller Scene▼
   　　View Controller▼
     　　　　Viewを選択
④Libraryをクリック
　Library画面がポップアップで表示される。
⑤検索窓にLabelと入力する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631064/2d9adf4a-5a6d-fa66-9a25-f08e8243f11d.png" width=40%>

⑥検索されたLabelをstoryboardの中央にドラッグ&ドロップ

###オートレイアウトを設定
①配置したLabelをクリック
②Xcode右下にあるAlignをクリック
③［Horizontally in Container］と［Vertically in Container］にチェックを入れる。
 ［Horizontally in Container］で画面中央から水平方向の距離を入力。
　⇨[0]であれば、左右の中央に配置される。
［Vertically in Container］で画面中央から垂直方向の距離を入力
　⇨[0]であれば、上下の中央に配置される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631064/7fcbe27d-856d-9391-743a-2c4c95adc131.png"width=40%>
④［Add 2 constraints]をクリックして、制約を反映。

####Labelとプログラムの関連付け
①Main.storyboardを選択、エディタの表示
②Labelからエディタへドラッグ&ドロップ
　⇨Labelの上にマウスポインタを置いた状態で、「control」キー＋クリックを押しながら、右方向へドラッグ（引っ張ると青いラインが出る）。エディタの最後にある中括弧のすぐ上までラインを伸ばす。
③関連付けの設定を行うためのダイアログが表示される。この画面にて、Labelとプログラムをどのような名前で関連付けるかを設定。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631064/0bce0580-0cee-5b3d-c3e6-3570935657db.png" width=50%>
④[connect]をクリックすると↓のようにコードが追加されます。これがLabelとの関連付けを示すコードになる。

```Swift
@IBOutlet weak var outputLabel: UILabel!
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631064/2f6e3e3e-8930-619c-cf0b-5e1678f42b0f.png"width=40%>

#####Labelに文字をセットするコードを書く
```Swift
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        outputLabel.text = "Hello Swift!"
    }
      
    @IBOutlet weak var outputLabel: UILabel!
}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631064/fea3f6e3-56e6-0dff-34bf-933eb083267c.png" width=30%>

以上です。
psqlで繋いだ先から、データをローカルにエクスポートしたい場合

# 概要

DBMSにPostgreSQLを利用し、psqlでDBサーバーに接続しているとき、作成したデータをローカルにエクスポートする方法を記述します。

# 結論

psqlで該当のDBに接続し、下記のように`\copy`コマンドを実行すればエクスポートできます。

```
\copy table_name to 'C:\Users\nannany\Desktop\sql\data.csv' with csv delimiter ',' ;
```

上記のコマンドでは、`table_name`というテーブルのデータを、csvファイルとして`C:\Users\nannany\Desktop\sql\data.csv`
にエクスポートしています。

`copy`コマンドではなく、`\copy`コマンドを利用することが肝かと思います。

# 参考
[\copyコマンドについて](https://www.postgresql.jp/document/12/html/app-psql.html#APP-PSQL-META-COMMANDS-COPY)
汎用性◯『戻る』ボタン

#はじめに
どんなページでも使える「戻るボタン」のコードを残しておこうと思い投稿します。

##汎用的戻るボタン
- Rails
- erb拡張子
- クラス名はお好みで
- CSSでクラス名を指定すれば、スタイルを適用可能


```erb
<%= link_to '戻る', :back, class:"back-btn" %>
```

`:back`の部分が、戻る機能に起因しています。
React Nativeの環境構築でのエラーを解決した方法

React Nativeの学習を開始し、環境構築を行っていたところエラーが出てしまいました。
環境構築はこちらの流れに沿って**React Native CLI Quickstart**で行いました。


https://reactnative.dev/docs/environment-setup


①まず、次のコマンドを打つとReact Nativeのセットアップが完了し、AwesomeTSProjectディレクトリーが作成されます。

```
npx react-native init AwesomeTSProject --template react-native-template-typescript
```

②AwesomeTSProjectディレクトリーに移動します。

```
cd AwesomeTSProject
npx react-native run-ios
```

これでアプリが立ち上がれば開発環境の構築は完了なのです。

しかし、次のようなエラーが起こってしまいました。
##エラー内容

![FC2DAF7D-6346-4C5D-A5C6-C5DDB2D076DE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983298/68d3d935-0b73-8fc2-7575-a73f2455113e.png)
どうやらNodeサーバーが立ち上がっていないようです。

##解決方法
①node.jsのサーバーが立ち上がっていないようなので、ターミナルで起動してみました。

```
npm start
```

しかし、ポートが衝突しているようです。

```
error listen EADDRINUSE: address already in use :::8081.
```


②ポートを特定して、消去する。

```
// ポートを特定する
losf -i 8081

// PIDを指定して消去する
kill -9 *****  // *****にはPIDの数字を入力してください
```

③もう一度iosで立ち上げます。

```
npx react-native run-ios
```
![スクリーンショット 2021-01-17 19.31.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983298/7d2cb19c-6bbc-8b68-20d0-6242ebd267eb.png)

無事にアプリが立ち上がりました！

##参照
[ビルド失敗：Error: listen EADDRINUSE: address already in use :::4000](https://ja.stackoverflow.com/questions/52577/%E3%83%93%E3%83%AB%E3%83%89%E5%A4%B1%E6%95%97-error-listen-eaddrinuse-address-already-in-use-4000)
[React Nativeの環境構築でつまずいた話：Error: listen EADDRINUSE](https://qiita.com/shumatsukishu/items/68755725a9370c119c8c)
FireStoreでサブコレクションを追加 [Swift] 

サブコレクションとは、ドキュメント内のコレクションのことです。
これを新しく追加するには、ドキュメント内のサブコレクション内のドキュメントを作ることで、自動で生成されます。

たとえば、国コレクション内に”japan”というドキュメントがある場合、

```swift
let db = Firestore.firestore()
db.collection("countries")
            .document("japan")
            .collection("prefectures") // サブコレクションであるprefecturesがない場合、自動でリストが生成される。
            .document("osaka")
            .setData([
    capital: "osaka",
    specialty: "takoyaki"
]) { err in
    if let err = err {
        print("Error writing document: \(err)")
    } else {
        print("Document successfully written!")
    }
}
```

これでjapanドキュメントの中にprefecturesが生成され、県庁所在地と名物の情報をもったosakaというドキュメントが追加されます。

セキュリティルールの追加をお忘れなく。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[Docker+Rails]Railsサーバー起動失敗の対処方法

#はじめに
サーバー起動しようと思った時に下記エラーログが出力されます。

```
A server is already running. Check /app/tmp/pids/server.pid.
```

#原因
前回のRailsサーバー起動時に作成された`server.pid`ファイルが残っているのが原因。

#解決方法
色々サイトで調べてみたところ3つ存在するはず。

##①ターミナル再起動
参考：[A server is already running 対処方法【Rails】](https://qiita.com/uloruson/items/78b0d2d5c30a1f79fc02)

##②server.pidファイルを削除
エラーが発生する度に、`/app/tmp/pids/server.pid`ファイルを削除する。
確実な方法ですが、面倒臭いですね…

##③サーバー起動時に自動でserver.pidファイルを自動で削除する（推奨）
これが一番、楽な方法だと思います。
`docker-compose.yml`ファイルの**`command`**部分を次の通り設定する。

```:docker-compose.yml
command: bash -c "rm -f tmp/pids/server.pid ; bundle exec rails s -p 3000 -b 0.0.0.0"
```
PATHを通す まとめ

#環境変数PATHとは
- コマンドを実行するプログラムが保存されているディレクトリの場所を設定する変数

# 流れ
###1. whichコマンドでコマンド実行ファイルの場所を確認

```
% which pwd 
 /bin/pwd
 % which ls
 /bin/ls
```
<br>
###2.exportを使用し、PATHを通す
export PATH＝＄PATH：[コマンド実行ファイルへのパス]

```
mac$ export PATH=$PATH:/Users/mac/Documents
mac$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/mac/Documents
mac$ pwd
/Users/mac
mac$ composer.phar -V
Composer version 1.8.0 2018-12-03 10:31:16
```

→　exportコマンドで実行した設定は一時的なもので、別のターミナルを起動するとその設定は解除されてしまう。
<br>
###3..bash_profileファイルに環境変数PATH設定
1.MACインストール直後は.bash_profileは存在しないので、下記のコマンドを使用して.bash_profileを作成。
そのファイルの中にexportコマンドの設定を記述する。

```
mac$ echo 'export PATH=$PATH:/Users/mac/Documents' >> .bash_profile
```
<br>
（注）使用シェルがzshの場合は~/.zshrcにパスを通す。

###/usr/local/binへの実行ファイルの保存（裏技）
exportコマンドを使用して、環境変数PATHの追加を行ったが、環境変数PATHに追加するのではなく、事前に環境変数PATHに設定されている/usr/local/binに実行ファイルを保存するという方法もある。その場合は、.bash_profileの作成も必要ない。

MACではインストール直後では、/usr/localにbinディレクトリは存在しないので作成を行う。作成完了後に実行ファイルを保存する。

ただしこの場合、アクセス権の問題で管理者のパスワードが必要となるため、通常のユーザでは作成できない。

```
mac$ mkdir /usr/local/bin
mkdir: /usr/local/bin: Permission denied
```
<br>
管理者権限で作成するためにsudoコマンドを利用.
binディレクトリを作成後、コマンド実行ファイルをbinディレクトリに保存。その際も管理者権限が必要となる。

```
mac$ sudo mkdir /usr/local/bin
Password:
mac$ sudo mv composer.phar /usr/local/bin/composer
```
<br>
/user/local/binに保存できれば、どこのディレクトリからも実行が可能.

---
###おまけ
######環境変数を一覧表示(printenv)

```
 % printenv
TERM_PROGRAM=Apple_Terminal
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/5h/bxvtcnj978dfmqwdkr59xvj40000gn/T/
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.FWsThb4MSd/Render
TERM_PROGRAM_VERSION=421.1
TERM_SESSION_ID=A16EEA5A-E4A8-4F62-99B9-2CE967439E34
USER=mac
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.SI0Id5ua6b/Listeners
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
PWD=/Users/mac
LANG=ja_JP.UTF-8
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
SHLVL=1
HOME=/Users/mac
LOGNAME=mac
SECURITYSESSIONID=186a8
_=/usr/bin/printenv
```

######echoコマンドによるPATHの確認
echoコマンドにより個別の環境変数の設定値を確認。

```
％ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
---
参照
https://reffect.co.jp/windows/full_understanding_mac
SceneEditorから追加したSCNActionに、コードからアクセスする

SCNActionはコードからもしくはSceneEditorから追加できます。
SceneEditorから追加する方法はApple Engineさんの以下の記事がわかりやすいかと思います。

[iOS で SceneKit を試す(Swift 3) その15 - Scene Editor の Action Editor を使ってみる](https://appleengine.hatenablog.com/entry/2017/07/04/195535)

SceneEditorで追加したアクションをコードからリピートしたり組み合わせたりしたい時に。

###ノードがアクションを持っているかどうかの確認

```swift
node.hasActions
```

###ノードが持っているアクションのKeyの確認

SceneEditorからアクションを追加した場合、英数字の文字列がデフォルトで割り当てられます。

```swift
node.actionKeys
```

###アクションの取得

たとえば、ノードに割り当てられているアクションの最初のものを取得するには以下

```swift
let actionFromNode = node.action(forKey: node.actionKeys[0])
```

###取得したアクションは、SCNActionとして再利用できる


```swift
anotherNode.runAction(actionFromNode)
```
🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
Swift UIScrollViewの使い方

#`UIScrollView`をコードで実装
独学でアプリ制作しているんですけど、そういえば`scrollView`使ったことないなと思ったので勉強しました！
まず、全く調べずに`scrollView`を使ってみようとしました。
そのコードがこちら

```swift
class ViewController: UIViewController {
    
    private let label = UILabel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let scrollView = UIScrollView()
        
        scrollView.frame = .init(x: 0, y: 0, 
            width: view.frame.size.width, height: view.frame.size.height)
        
        view.addSubview(scrollView)
        scrollView.addSubview(label)
        
        label.text = "hello world"
        label.frame = .init(x: 0, y: 0, width: 100, height: 50)
        label.center = scrollView.center
    }
    
}
```

結果はスクロールできませんでした。
`label`は`scrollView`がちゃんと表示されているか確認するために追加しています。

なんで！？と思い調べてみると`contentSize`というものを指定しないといけないらしい。
`contentSize`はスクロール領域を決めるらしい。
ということで修正したものがこちら

```swift
class ViewController: UIViewController {
    
    private let label = UILabel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let scrollView = UIScrollView()
        
        //scrollViewの大きさを設定。
        scrollView.frame = .init(x: 0, y: 0, 
            width: view.frame.size.width * 2, height: view.frame.size.height * 2)
        
        //スクロール領域の設定
        scrollView.contentSize = CGSize(width:view.frame.size.width * 2, height:view.frame.size.height * 2)
        
        //scrollViewをviewのSubViewとして追加
        view.addSubview(scrollView)
        scrollView.addSubview(label)
        
        label.text = "hello world"
        label.frame = .init(x: 0, y: 0, width: 100, height: 50)
        label.center = scrollView.center
    }
    
}
```

これでどうだ！と思いビルドしましたがスクロールできませんでした。

さらに調べると、`frame`が`contentSize`より小さくないといけないみたい。

```swift
class ViewController: UIViewController {
    
    private let label = UILabel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let scrollView = UIScrollView()
        
        //scrollViewの大きさを設定。
        scrollView.frame = .init(x: 0, y: 0, 
            width: view.frame.size.width, height: view.frame.size.height)
        
        //スクロール領域の設定
        scrollView.contentSize = CGSize(width:view.frame.size.width * 2, height:view.frame.size.height * 2)
        
        //scrollViewをviewのSubViewとして追加
        view.addSubview(scrollView)
        scrollView.addSubview(label)
        
        label.text = "hello world"
        label.frame = .init(x: 0, y: 0, width: 100, height: 50)
        label.center = scrollView.center
    }
    
}
```

結果は...いけたーーーー！！！

#まとめ
`UIScrollView`を使うときは
>`contentSize`を指定しないといけない
`contentSize`は`frame`より大きくないといけない

ということに注意して実装しましょう!

##引用
[[Swift4]スクロールビューの使い方](https://qiita.com/tojo/items/ee054559ae84aaeaae39)
SQLServer ManagementStudioでデータベースを編集する際にやっておいたほうがいいこと

# 1.テーブルの変更ができない
テーブルの列の順序を変えようとすると警告が表示され、何もできないという事象に遭遇。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/3d9f10a2-17a9-15c8-b4f3-c796a044f3cc.png)

## 原因・解決策
1. SQLServer Management Studioにて[ツール]-[オプション]を選択。
2. 左ツリーメニューの[デザイナー]を選択。
3. [テーブルの再作成を必要とする変更を保存できないようにする]のチェックを外し、[OK]をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/3ba058ab-3246-f47c-6c57-52cc2092d3c1.png)

# 2.編集可能な行の上限を増やす
1. SQLServer Management Studioにて[ツール]-[オプション]を選択。
2. 左ツリーメニューの[SQLServer オブジェクト エクスプローラーを選択。
3. [上位<n>行の編集コマンドの値]を200から1000に変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/9f8b4221-ea92-d97c-2c82-1d604bbe5a56.png)
4. テーブル右クリックメニューが[上位1000行の編集]に変わった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/0b383d2c-fb07-53d0-a52a-855afca479fa.png)

多分、データを取ってくる行数と編集表示の上限数は合わせたほうがやりやすいと思われる。

# 参考元

https://docs.microsoft.com/ja-jp/troubleshoot/sql/ssms/error-when-you-save-table

http://masaru1006a.hatenablog.com/entry/2018/01/22/015956
Ceph(Octopus)の構築(準備編 ハードウェア)

##__はじめに__
この記事では、タイトルのとおり現時点(2021.01)で最新である__ceph(octopus)__の構築を目的としています。
また、自分で構築した手順の備忘録を兼ねているので、細かいところで間違いなどあるかもしれません。

基本的には公式のDOCUMENTATIONが必要なことを全て網羅しているので一読しておくことをお勧めします。
Linuxの知識もある程度必要になるので他サイトや書籍などで事前に基本は押さえておくとよいでしょう。

##__関連記事__
Ceph(Octopus)の構築(準備編 ハードウェア)　この記事
[Ceph(Octopus)の構築(準備編 ソフトウェア)](https://qiita.com/iriya_v00v/items/e3268fe75423ba0304b3)
[Ceph(Octopus)の構築(設定編 共通)](https://qiita.com/iriya_v00v/items/d7d9e439cf4159acae2c)
[Ceph(Octopus)の構築(設定編 ブートストラップ)](https://qiita.com/iriya_v00v/items/d7bcf4dfa6324bacd91a)
[Ceph(Octopus)の構築(設定編 mon/mgr/osd)](https://qiita.com/iriya_v00v/items/75eefdefb7ec61d24812)
[Ceph(Octopus)の構築(設定編 cephFS/mds)](https://qiita.com/iriya_v00v/items/931838d6d56e568bd6d8)
[Ceph(Octopus)の構築(設定編 Crush Map)](https://qiita.com/iriya_v00v/items/2a263a7817434e8b91ed)

##__ハードウェア(ノード)__
まずは、cephクラスタを構成するためのパソコンを用意する必要があります。
組みたいcephクラスタの構成により様々になります。
今回は以下の構成で組みました。

|No|ホスト|メモリ|ストレージ|
|:-:|:-:|:-:|:-:|
|1|ceph-mon01|16GB|HDD1(250GB)/HDD2(250GB)|
|2|ceph-mds01|16GB|HDD1(250GB)/HDD2(250GB)|
|3|ceph-osd01|16GB|HDD1(250GB)/HDD2(250GB)|
|4|ceph-osd02|16GB|HDD1(250GB)/HDD2(250GB)|
|5|ceph-osd03|16GB|HDD1(250GB)/HDD2(250GB)|
|6|ceph-mon11|16GB|HDD1(250GB)/HDD2(250GB)|
|7|ceph-mds11|16GB|HDD1(250GB)/HDD2(250GB)|
|8|ceph-osd11|16GB|HDD1(250GB)/HDD2(250GB)|
|9|ceph-osd12|16GB|HDD1(250GB)/HDD2(250GB)|
|10|ceph-osd13|16GB|HDD1(250GB)/HDD2(250GB)|
|11|ceph-mon21|16GB|HDD1(250GB)/HDD2(250GB)|
|12|ceph-mds21|16GB|HDD1(250GB)/HDD2(250GB)|
|13|ceph-osd21|16GB|HDD1(250GB)/HDD2(250GB)|
|14|ceph-osd22|16GB|HDD1(250GB)/HDD2(250GB)|
|15|ceph-osd23|16GB|HDD1(250GB)/HDD2(250GB)|

合計15台の構成となっています。
ただ、(意味があるかないかは別として)物理的には最低1台あればdocker等で仮想化してしまえばcephの動作を確認することはできます。
また、原則osdは物理的に1つのデバイスであることが推奨されているので、OS用のデバイスとは別に構成しています。(HDD2が該当)

##__ハードウェア(ネットワーク)__
レプリケーションやcrush map、PG等の設定次第で必要なものは異なってきます。
今回はホストを5台ずつで3グループ作りたかったので以下の構成としています。

|No|SW種別|ポート速度|用途|
|:-:|:-:|:-:|:-:|
|1|L3|1Gbps|NW全体管理(デフォルトゲートウェイ)|
|2|L2|100Mbps|グループ0用|
|3|L2|100Mbps|グループ1用|
|4|L2|100Mbps|グループ2用|

L3はルータでもよいでしょう。L2はSWHUBでもよいでしょう。
各ネットワークの構成に合った機器を選定してください。
クラスタのトラフィックを捌くことができるスペックのものを用意しましょう。
今回調達したパソコンはクライアント向け(サーバ用途ではない)であったためNICを1つしか備えていません。
そのため、表LANと裏LANの区別なく1つのセグメントで構築しました。NICが2枚以上備わっている場合はネットワークを分けることが推奨されています。

##__おわりに__
今回用意したハードウェアについては以上です。
私が準備したハードウェアと全く同じ数を揃える必要があるわけではありません。
最終的にクラスタの容量や冗長性が異なりはしますが、基本的にはどのようなハードウェアであってもcephを構築することはできます。
まずは手持ちのハードウェアで試してみてもいいと思います。

ソフトウェアについては[次の記事](https://qiita.com/iriya_v00v/items/e3268fe75423ba0304b3)に投稿しようと思います。
shapely環境構築で、OSError: Could not find library geos_c or load any of its variants （略）エラーの解決策


#使用環境
MacbookPro(13-inch 2017)
Big Sur(ver11.1)

#shapeleインストール時
` pip install shapely `で下記エラー発生

##ERROR: Command errored out with exit status 1:

status1でコマンドが中止されたことを示しているよう。
解決策不明。

##OSError: Could not find library geos_c or load any of its variants ['/Library/Frameworks/GEOS.framework/Versions/Current/GEOS', '/opt/local/lib/libgeos_c.dylib', '/usr/local/lib/libgeos_c.dylib']

[shapely公式](https://github.com/Toblerity/Shapely)によるとGeosが必要らしい。
`brew install geos`で解決。

※shapely-wheelsをインストールする解決策も出てきたが、よくわかっていない。
※Windowsだと別途用意されている解決方法があるらしい。
Firebase


```build.gradle(プロジェクト)
buildscript{
    dependencies{
        classpath 'com.google.gms:google-services:4.3.4'
    }
}
```


```build.gradle(モジュール)
plugins{
   id 'com.google.gms.google-services'
}

dependencies{
    implementation platform('com.google.firebase:firebase-bom:26.3.0')
    implementation 'com.google.firebase:firebase-analytics-ktx'
}
```
【Grasshopper】Python script上でデータツリーを作るとき

データツリー 形式で出力させたいときには、ライブラリーの読み込みおよび、若干の処理が必要になります。  

## ①ライブラリーの読み込み  
以下読み込みを行ってください。  

```python
import System
import Grasshopper.Kernel.Data.GH_Path as GH_Path
import Grasshopper.DataTree as DataTree
```

## ②データツリーの出力
今回は[3, 4, 6, 7]のリストデータから1つデータを取り出してツリーを作成します。


```python
list = [3, 4, 6, 7]
tree = DataTree[System.Object]()
for i in range(len(list)):
 path = GH_Path(0, i)
 val = list[i]
 tree.Add(val, path)
a = tree
```

まずデータを格納するツリーオブジェクトを作成します。
データツリーのパス（path）は GH_Path(○○)を使うことで任意のパスが作成できます。
それらデータをAddを使ってツリーに1つずつ入れていけば完了です。

覚えてしまえば簡単ですね。よく使うから上記操作は覚えておくとよいでしょう。
ちなみに出力されるデータツリーは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610425/f6804ee6-7d04-64c1-a0f3-4676b29c8599.png)
【初心者でもわかる】お知らせマークや未読件数をつける方法2選

# どうも7noteです。新着のお知らせなどがあった時に丸いアイコン等を付けてクリックやタップを促す方法

スマホの普及もあり、画像に小さいアイコンがつくようなデザインを多く見かけるようになりました。
さっそく丸いアイコンを付けたいと思います。また数字が入る場合は桁数が増えるも考慮して考えます。

![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/706c5eca-2ed1-7730-0cf5-6b6cedc8181c.png)


## 文字や記号入る場合の綺麗な作り方の例（疑似要素を使用）

```index.html
<div class="news">
  <a href="#">お知らせ</a>
</div>
```

```style.css
.news {
  /* ボタンっぽいデザインを入れる */
  width: 70px;
  padding: 3px 5px;
  border: solid 1px #000;
  border-radius: 5px;
  position: relative; /* 基準値とする */
}
.news::after {
  content: "！";        /* 表示する記号や文字を入れる（1文字） */
  position: absolute;   /* 相対位置を指定 */
  top: -10px;           /* 表示位置を上から-10pxの位置にする */
  right: -10px;         /* 表示位置を右から-10pxの位置にする */
  color: #FFF;          /* 文字色を白色に指定 */
  line-height: 20px;    /* 行の高さを指定 */
  font-weight: bold;    /* 太文字にする */
  text-align: center;   /* 文字を中央揃えにする */
  width: 20px;          /* 幅を20pxに指定 */
  background: #F00;     /* 背景色を赤に指定 */
  border-radius: 50%;   /* 角丸を50%に指定 */
}
```
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/d15e8196-1322-babe-9d14-beb725d1d271.png)


## 文字数や桁数が変動する可能性がある場合の作り方の例

```index.html
<div class="news">
  <a href="#">お知らせ<span class="notice">3</span></a>
</div>
```

```style.css
.news {
  /* ボタンっぽいデザインを入れる */
  width: 70px;
  padding: 3px 5px;
  border: solid 1px #000;
  border-radius: 5px;
  position: relative; /* 基準値とする */
}

.news span {
  position: absolute;     /* 相対位置に指定 */
  top: -10px;             /* 表示位置を上から-10pxの位置にする */
  left: calc(100% - 10px);/* 表示位置を右から内側に10pxの位置 */
  color: #FFF;            /* 文字色を白に指定 */
  font-weight: bold;      /* 太文字にする */
  line-height: 20px;      /* 行の高さを指定 */
  text-align: center;     /* 文字を中央揃えにする */
  background: #E68031;    /* 背景色をオレンジに指定 */
  border-radius: 10px;    /* line-heightの半分の角丸を指定 */
  min-width: 20px;        /* 最低幅を指定 */
  padding: 0 3px;         /* 左右に少しだけ余白を設定 */
  box-sizing: border-box; /* 計算しやすいように */
}
```

![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/eecb89cb-d623-bab3-d93d-565b3dfb4d62.png)


このように、複数桁になった場合でも、左右に半円がついているような見た目をキープすることができます。

もし`border-radius:50%;`を指定してしまうと、桁数が大きくなり横長になったときに楕円形になってしまい美しくありません。

**見栄えが悪い例**

![sample3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/9547aab7-2676-e092-53ad-8be0876d8af1.png)


## まとめ

ちょっとアイコンをつけたりなんかはよくあるので、作り方を覚えておき、
文字数によって違う手法でのアプローチがあることさえ理解していれば綺麗にコーディングすることができます。

参考になれば。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
MacBook Twitter 共有方法

ウェブページのTwitterボタンを使わずにTwitterで共有する方法を紹介します。

1. App StoreでTwitterアプリをインストール、ログインする
1. システム環境設定>拡張機能>共有メニュー>Twitterにチェックマークを付ける
1. ツールバーのファイルを選択
1. 共有を選択
1. Twitterを選択

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/adbc3fbb-09c9-c80c-5750-3d6d72673218.png)
AWS Lambdaでコンテナデプロイする方法

# はじめに
随分前になりますが、AWS Lambdaでコンテナデプロイがサポートされました。
[AWS Lambda now supports container images as a packaging format](https://aws.amazon.com/jp/about-aws/whats-new/2020/12/aws-lambda-now-supports-container-images-as-a-packaging-format/)

今回は、AWS Lambdaにコンテナのイメージをデプロイする方法について紹介します！

## 対象
- AWS Lambdaの新機能について知りたい人
- コンテナデプロイの流れを知りたい人

# YouTube動画
動画で確認したい方は、こちらを利用ください！
*撮影は1ヶ月以上前のものですが、大きく変わったところはありません。
[【YouTube動画】実践！ Lambdaでコンテナデプロイをする方法！！](https://youtu.be/JNzOTwRsIoQ)
[![実践！ Lambdaでコンテナデプロイをする方法！！](https://img.youtube.com/vi/JNzOTwRsIoQ/0.jpg)](https://youtu.be/JNzOTwRsIoQ)

# コンテナのデプロイ条件
Lambdaに、コンテナデプロイがサポートされましたが、コンテナなら何でも良いという訳ではありません。
AWSが提供しているLambda用のRuntime APIに準拠している必要があり、以下のいずれかの方法でコンテナを作る必要があります。

```
方法1: AWS提供のベースイメージを使う
方法2: Runtime APIが入っているイメージを使う
```

以下のサイトから使いたいランタイムを選択して、利用できます。
[Runtime support for Lambda container images](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-images.html)

# 具体例
今回はベースイメージを利用して、実際にLambdaにコンテナデプロイしてみます。
まず、簡単なNode.jsのサンプルを確認して、次に実践的なRubyのサンプルを見ていきます。

## Node.jsのサンプル
簡単なサンプルを書くとこのようになります。

```dockerfile
# ベースイメージの取得
FROM public.ecr.aws/lambda/nodejs:12

# Lambda関数を定義しているapp.jsをLambda実行時のルートディレクトリに置く
COPY app.js ${LAMBDA_TASK_ROOT}

# app.jsのhandler関数を実行
CMD [ "app.handler" ]
```

## Rubyのサンプル
このサンプルはLambdaからMySQLに接続するためのLambda関数を作ります。
コンテナをサポートする前は、native extenstion関連で面倒な手順が必要でしたが、コンテナをサポートしたことで簡単に使えるようになりました。

```dockerfile
FROM amazon/aws-lambda-ruby:2.7

WORKDIR ${LAMBDA_TASK_ROOT}

# MySQL関連で依存しているものをインストール
RUN yum install -y mysql-devel gcc-c++ make

COPY . ${LAMBDA_TASK_ROOT}

RUN bundle config --global silence_root_warning 1
RUN bundle config set path 'vendor/bundle'
RUN bundle install

CMD ["app.App::Handler.process"]
```

## ローカルでLambdaを動かす
コンテナ化したことで、ローカルで実際に試すことができます。

9000番ポートを開放して試したい場合は次のようにします。

```bash
docker run -p 9000:8080 <image name>
```

そして、以下のようにPOSTすることで、実際に確認できます。
ここでの、``/2015-03-31/functions/function/invocations"``は固定です。

```bash
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" \
-d '{"payload":"hello world!"}'
```

# デプロイ
まずはコンテナイメージをAmazon ECRにデプロイする必要があります。
今回は割愛します。以下が詳しいです。
[Docker イメージをプッシュする](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-push-ecr-image.html)

Lambdaの関数の作成方法を確認すると、コンテナイメージという項目ができているので、そちらを選択して使います。
![_2020-12-07_20.20.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/e5abc288-e773-498d-6458-23129f0f794a.png)


# まとめ
今回はAWS Lambdaにコンテナをデプロイする方法について解説しました。
この記事を通してざっくり理解していただくと、自分で設定する時にスムーズだと思います。

また、AWS Lambdaでコンテナを使った場合は、最初の起動で2 ~ 5秒程度かかってしまいますが、それ以降はスムーズに起動します。
AWS Lambdaの利用の幅が広がる新機能なので、ぜひ遊んでみてください！
中学3年生がコロナで暇なので本気で茶コーダーを目指す【競プロ】~2日目~

#シリーズ
**中学3年生がコロナで暇なので本気で茶コーダーを目指す**
[第一話(1/16)](https://qiita.com/hyugo/items/9d18552a3fe203272baa)
[第三話(1/18)](https://qiita.com/hyugo/items/12463805791bb4d45ce4)

※お願い(1/18追記)
数学に関して色々読み進めているうちに色々自分だけではどうしてもわからない部分が出てきていて、、
数学や技術知識を皆様にご教授いただきたいです

Qiitaのコメント欄だけではどうしても限界が出てくる
ということで、Atcorder教えてもらう専用のdiscordサーバーを作成しました。
[こちらの招待リンク](https://discord.gg/YEyxKxCAHq)から参加していただき、
`一言` というスレッドに一言いただけたら助かります。

#1/17 にやったこと
とりあえずABG4bの第一章を一通り読み、関数まではPythonをやっていたこともあり、さらーっと理解できました。

なのでAOJを5時間くらいかけて取り組んでいました。



#今日のAOJの成果
![5B52C429-87EC-4471-8BE1-00608AFFDD40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921821/71a80861-e4db-9103-3aef-8525bfdd9b39.png)

[この問題](https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/5/ITP1_5_D)がめちゃくちゃ難しくて、苦戦し解き終わった頃にはくたくたで次に進む勇気が出ませんでした。

`go to` ってやつなんですが、、、
イメージはチェックポイントみたいな感じで捉えました。
Pythonで競プロ参戦してたらなんのこっちゃってなるんですかね...

まだ1日は終わらないので、
あと3題くらい欲を出して解こうと思います。



#数学できない問題
とりあえず今日は因数分解の復習と、展開の復習をして明日の二次関数に備えました。

未習単位の内積とか微分とか、その辺までを2月中旬までに習得できればなって思っています。

#今日の感想
今まで解読性に優れている言語(python等)を扱ってきたこともあり、一個一個理解するのに時間と頭を使うので投げ出したくもなりますが、プログラムの知識は一生ものなので、勉強して損はないと思うのでこのペースを保って続けようと思います。


その他これやった方がいいよ〜とかのアドバイスを頂けたらめちゃくちゃ嬉しいです！

[前回の記事](https://qiita.com/hyugo/items/9d18552a3fe203272baa)
github上のファイルをコマンドラインから取得する

github上のファイルを取得する場合、GUI上でボタンクリックしても取得可能だが、コマンドラインから取得したい場合がある。

# 方法
- テキストファイルの場合は、`raw`ボタンをクリックするとrawデータが表示されるので、そのURLを以下のように`curl`で指定すれば良い。
- バイナリデータの場合は、`view raw`をクリックして、そのURLを以下のように`curl`で指定すれば良い。(Macの場合は自動ダウンロードが始まるが、ダウンロード一覧から)


（例）
`https://raw.githubusercontent.com/xxx/xxx`のバイナリを`filename`という名前で取得する場合

```
curl --output filename https://raw.githubusercontent.com/xxx/xxx
```

# 参考
[githubからファイルを直接ダウンロード](https://qiita.com/wf9a5m75/items/39528ae6dda687190a3d)
Pygame2 for Multi touch device

Android で python の pygame 動くんだったら、ボタンつけて操作できるとこまでやってみよと...

調べてると、 kivy というのが UI デザイン言語であって、じゃあこれで pygame で Android 向けに作れる、と思いこんでチュートリアルを一個やってみたら、なんかこれ kivy で全部書かないといけないんじゃない？とわかってきた。

ボタンだけ付け足したいのに、 kivy でコーディングするってことになると pygame は使えないからそこでやめて、 pygame でタッチデバイス用に押したりできる関数ないか調べると、あるけど。


あるけど、というか使い方がドキュメントには書いてないので想像がつかない。

でも、できるんだろうなと悶々と3日くらい、でも、でも、できるはずなんだな、ともやもやもやもやしていたが、サンプルコードをつけて本に書いてくれている人がいるのを見つけて、コードを貼って、少し足してやってみた。

https://youtu.be/gWuzEXh3IKw

pygame 4000 book
https://pygame.itch.io/pygame-book/devlog/204497/new-sections-added-to-pygame-book

![IMG_20210117_162723_515.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/6bb689df-c7d3-5120-c766-aec5835bb995.jpeg)


https://www.youtube.com/watch?v=mbaVKVw4A0k&feature=youtu.be

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/c27bf9b7-efbc-3dc7-37a7-f375a3e4d04e.png" width="200">

---
---
追記:1
1 月 17 日から始めて毎日コードを変形して 8 日目の様子。
qiita-private-page
![qr-code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/9d681fb7-7526-2b76-c8f3-a9d48f73a068.png)

https://qiita.com/dauuricus/private/d4589546a58c44f133b3

---

https://youtu.be/pj93EABebI0

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/9fa4507c-32ee-ad6a-5c98-13c6cfbb4498.png" width="100">

Cf.
貼ってみる
https://qiita.com/dauuricus/private/
Android AppCompatActivityクラスは、なぜFragmentActivity型の引数に代入できるのか？（当たり前ではありますが、、、）

　＜日記です。あまり読む価値ないと思います。＞
　金田著「[はじめてのAndroidプログラミング（第５版）](https://www.sbcr.jp/product/4815607968/)」で勉強しています。第８章の「ViewPager2を使う」まで進みました。

　今日の主題は、ポリモフィズムです。

　p255ページに「この(MyAdapter)クラスのコンストラクタはアクティビティ(FragmentActivity)のインスタンスを引数に取ります」と、記述があります。そこでMyAdapterクラスのソースコードを見るとコンストラクタの引数の型は確かにFragmentActivityになっています。

```MyAdapter.kt
class MyAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {    // ＜＝＝ここ
        //省略
}
```

次にMyAdapterクラスのインスタンスを作っている部分を見てみると、

```MainActivity.kt
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        // 省略
        binding.pager.adapter = MyAdapter(this)     // ＜＝＝ここ
    }
}
```

　どうしたことでしょう？MyAdapter(this)の部分をみれば分かるように、MyAdapter()の引数が、“this”になっています。thisとは、この場合MainActivityクラスの中で使っているのだから、自分自身、すなわちMainActivityをインスタンス化したものだよな、、、おかしいな、、MainActivityの親はAppCompatActivityクラスだしな、、その親はきっとActivityクラスなんだろうな、、、思ってしまいました。
　しばらく、思いあぐねた末に思いついたことは、リファレンスを見るべきだと言うことで、見てみると、
![AppCompatActivityクラスの系譜.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/1383d007-9ee6-abab-5497-5bf79037e5ea.png)
AppCompatActivityクラスの親は、しっかりとFragmentActivityクラスでした。

　俺って、まだまだだよな、、、っと、思いました。
adMobの下部バーナー設置方法


```build.gradle(モジュール)
...
dependencies{
    ...
    implementation 'com.google.android.gms:play-services-ads:19.6.0'
    ...
}
```


```AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest/>
    <application>
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-3940256099942544~3347511713"/>
    </application>
</manifest>
```


```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout>
    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        ads:adSize="BANNER"
        ads:adUnitId="ca-app-pub-3940256099942544/6300978111"/>
</RelativeLayout>
```


```MainActivity.kt
class MainActivity : AppCompatActivity(){
    override fun onCreate(savedInstanceState:Bundle?){
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //追加
        MobileAds.initialize(this)
        val adView = findViewById<AdView>(R.id.adView)
        adView.loadAd(AdRequest.Builder().build())
    }
}
```
GitとGitHub

##目的
- エンジニアに不可欠のツールであるGitとGitHubを用いたワークフローを整理する

##ワークフロー
今回は2種類のワークフローについてのまとめ
1.git-flow
2.GitHub Flow

###1.git-flow
####各ブランチと説明
- main…リリース済みのソースコードを管理する
- develop…開発中のソースコードを管理する
- hotfix…緊急の修正を行う、mainから分岐する
- feature…各自の開発を行う、developから分岐する
- release…リリース前の準備を行う、developから分岐する

####ワークフロー
mainからdevelopを切る
↓
developからfeatureを切って各自開発
↓
開発が完了したらdevelopにマージしていき、全体の開発完了後developからreleaseを切る
↓
リリースの準備が完了したらmainとdevelopにreleaseをマージしデプロイ

###2.GitHub Flow
####各ブランチと説明
- main…リリース済みのソースコードを管理する
- feature…各自の開発を行う

####ワークフロー
mainからfeatureを切る
↓
開発完了後pullリクエストを作成してコードレビューを依頼
↓
問題がなければmainにマージしデプロイ
密ですゲームをScratchで作ってみた。その１。

# はじめに
2021年1月7日に菅首相が緊急事態宣言を発令しました。

やっぱり「密」が良くないことだと、改めて思ったのでネットで見かけた名作[「密ですゲーム」](http://gamingchahan.com/mitsudesu/)を勝手に真似してScratchで作ってみました。

＜出来上がりイメージ＞
[こちら](https://scratch.mit.edu/projects/472243306/)のリンクから<b>実際にプレイできます。</b>
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901447/75a9fdf2-9574-a62a-57ca-249c7608b5ea.gif)

# 作り方

## 1. スプライトの準備
準備するスプライトは6つです。
![スクリーンショット 2021-01-17 17.25.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901447/dcd5e866-7b54-1398-6d0b-3b176b9c6b95.png)

- Stars:背景
- 百合子:主人公
- 住民:敵キャラ
   - コスチュームをキャラを変えて複数準備
   - <img width="80" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901447/bedce630-a36a-fe51-423a-d8db9ef941cd.png">
- 当たり判定:当たり判定用のまと
- 密です:百合子の攻撃
- ゲームオーバー:ゲーム終了時に表示する画像

## 2. スクロールする背景の作成

開始の定義をします。スタートのメッセージを受け取って、各スプライトが動作を始められるように最初にしておきます。

[スプライト：百合子]
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901447/209e22e5-1d45-a049-bdac-c9071680e150.png">

Starsのy座標を-1ずつ動かし、端まで行ったら戻るようにします。
また、クローンを作り、対になって動くようにしておきます。
[スプライト：Stars]
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901447/ce5449c2-798a-d157-46a6-5fd866bf5685.png">

## 3. 住民による密の発生

住民は5秒間隔で密を発生させます。

[スプライト：住民]
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901447/923671eb-e5c2-a67f-3006-f80b55c3ac1e.png">

密発生ブロックの中身を書きます。人数と密の中心座標をランダムに定義します。中心座標を中心にランダム離れた場所にクローンを生成させます。クローンを生成するとき、コスチュームを変更することで、密にダイバーシティが生まれます。

[スプライト：住民]
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901447/89d8b0ad-f9b9-9d1a-3308-29b50e13c16c.png">

クローンされた住民は背景と同じスピードでy座標を動かします。また、端に触れたら消えるようにします。

[スプライト：住民]
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901447/b79e9b86-c27d-c89f-8ca4-c0c4e5e8916b.png">

## 4. 「密です」 発砲

マウスが押されたら、そのマウスの座標を取得して、変数に保存します。最前面として表示し、１秒経ったら表示が消えるようにしておきます。

[スプライト：密です]
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901447/fa569154-7c45-cf71-af9c-7716b9d1e0fc.png">

住民は、密ですの触れたら、弾き飛ぶようにします。住民の座標から、密ですの中心との距離分、密ですの反対に移動するように書きます。

[スプライト：住民]
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901447/de001d4a-cc24-37b1-26d1-83de0bc42c19.png">

# 次回に続く

- [密ですゲームをScratchで作ってみた。その２。](https://qiita.com/bicona/items/e5bc8b65a4b8682ae836)
- ここまでの解説動画はこちら
    - [![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/kRJoDUvXKVY/0.jpg)](https://youtu.be/kRJoDUvXKVY)
    - [![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/58J9KyZ-qJY/0.jpg)](http://www.youtube.com/watch?v=58J9KyZ-qJY)
    - [![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/VGLi9E33iqc/0.jpg)](http://www.youtube.com/watch?v=VGLi9E33iqc)
    - [![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/nqlSeNFPhWA/0.jpg)](http://www.youtube.com/watch?v=nqlSeNFPhWA)
opencv.jsの作法 その10

#概要

opencv.jsの作法を調べてみた。
間違い探し、やってみた。

#参考にしたページ

https://qiita.com/mickie895/items/380d00ca4ac283842ccf


#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a0ae9b45-45e8-9869-837a-2747c407395d.jpeg)

#サンプルコード


```
var cvs0 = document.getElementById('canvasInput0');
var cvs1 = document.getElementById('canvasInput1');
var ctx0 = cvs0.getContext('2d');
var ctx1 = cvs1.getContext('2d');
var img1 = new Image();
img1.src = data1;
img1.onload = function() {
	ctx1.drawImage(img1, 0, 0);
}
var img0 = new Image();
img0.src = data0;
img0.onload = function() {
	ctx0.drawImage(img0, 0, 0);
	var src0 = cv.imread('canvasInput0');
	var src1 = cv.imread('canvasInput1');
	var dst = new cv.Mat();
  var imgDiff = new cv.Mat();
	var i;
	var j = 12;
  for (i = 0; i < src0.rows * src0.cols * 3 - j; i += 3)
	{
		src0.data[i] = src0.data[i + j];
	}
	var kernel = cv.matFromArray(3, 3, cv.CV_32FC1, [0.1111, 0.1111, 0.1111, 0.1111, 0.1112, 0.1111, 0.1111, 0.1111, 0.1111]);
	var anchor = new cv.Point(-1, -1);
	cv.filter2D(src0, src0, cv.CV_8U, kernel, anchor, 0, cv.BORDER_DEFAULT);
	cv.filter2D(src1, src1, cv.CV_8U, kernel, anchor, 0, cv.BORDER_DEFAULT);
	cv.absdiff(src0, src1, imgDiff);
	cv.bitwise_not(imgDiff, dst);
	cv.imshow('canvasOutput', dst);
	src0.delete();
	src1.delete();
  dst.delete();
}




```

#成果物

https://embed.plnkr.co/plunk/D99AwsEK057UADo5

以上。
デジタル化する新興国

# 書籍情報
- デジタル化する新興国
- 伊藤亜聖
- 中公新書、2612

# 読んだ目的
- デジタル化に関する書籍を読んだことがなかったため。
- 国際的な目線で「デジタル化」を捉えたことがなかったため。

# 学んだこと・感じたこと
## デジタル化により増長される可能性と脆弱性
- デジタル化が進めば進むほど、可能性と脆弱性の幅は広がっていく。
- 可能性と脆弱性の幅は新興国の方が広く、先進国の方が狭い。
- デジタルへの移行スピードを考えると、先進国は今までに培ってきた基盤があだとなるが、新興国では、電話回線を広げる前に電波とスマートフォンを使って、一足飛びに発展を迎える可能性がある。
- 発展とは別に、脆弱性においては逆に、新たな手口での犯罪や、監視社会の深刻化などが加速度的に拡大する可能性が考えられる。
- 日本の今後の姿勢としては、発展途上国の脆弱性の防止に注力しつつ、投資などを活発化させることで、その可能性を伸ばす手助けを行う立ち位置が取れるかが、今後の発展のカギとなる。

## デジタル化が作り出す仕事
- デジタル化により、無くなる仕事がフィーチャーされる中、デジタル化により新たに創出される仕事も存在する。
- デジタル化により、技術革新される中で創出される仕事を如何に増やしていけるのかが今後の経済規模を維持できるかに大きくかかわってくる。

# 今から何をするか
- まだまだ見識が甘いので、本書の引用書籍の読破を行う。まずは、気になった書籍を、予約する。
- 新興国での技術革新の過程は予想がつかないので、日々新聞でチェックしておく。
.zshrcの設定について

# はじめに
MacOS「Catalina」になってからシェルが`bash`から`zsh`に変更されてまして、ちょっとこの機会に少し設定し直すことにしました。

## もし、「Catalina」以下のOSでzshに変えたい場合

PCに入ってるShell一覧を確認

```
cat /etc/shells 

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```
zshがそもそもなかった場合は`Homebrew`などでインストールして、切り替え。

```
brew install zsh
sudo sh -c "echo '/bin/zsh' >> /etc/shells"
chsh -s /bin/zsh
```

`bash`に戻したい場合はこれ。

```
chsh -s /bin/bash
```

## .bashrcは.zshrcに置き換え

一旦、下記で変更されていることを確認。

``` .zshrc
echo $SHELL
/bin/zsh
```

設定項目は下記

``` ~/.zshrc
PROMPT='%F{green}%m@%n%f %F{cyan}%~%f$ '

# プロンプト複数起動時のhistory共有
setopt share_history

# 重複するコマンドのhistory削除
setopt hist_ignore_all_dups

# コマンドのスペルミスの修正
setopt correct

# Command補完
autoload -Uz compinit && compinit


# ----------------------------------------------------------------------------------------
# alias設定
# ----------------------------------------------------------------------------------------
alias ll="ls -la"
alias v="/usr/local/bin/vim"   # vim
alias his='history -Di | grep' # 引数でhistoryのgrepを行う
alias history='history -Di'


# ----------------------------------------------------------------------------------------
# zsh-completions(補完機能)の設定
# ----------------------------------------------------------------------------------------
if [ -e /usr/local/share/zsh-completions ]; then
    fpath=(/usr/local/share/zsh-completions $fpath)
fi
autoload -U compinit
compinit -u
```
とりあえず、簡単に設定しておく。

```
source ~/.zshrc
```

これで反映完了。

## .zshrcの詳細

```
PROMPT='%F{green}%m@%n%f %F{cyan}%~%f$ '
```
プロンプトの設定はbashの時と違うので、色々参考に変更した。

```
brew install zsh-completions
```
zsh-completions(補完機能)の設定は必須だと思うので、追加。
Homebrewでインストール出来る。設定は.zshrc内を参照。
あとは、下記をいれた。
- **プロンプト複数起動時のhistory共有**
- **コマンドのスペルミスの修正**
- **Command補完**

## . bash_profileは.zprofileに置き換え
今までだと`.bash_profile`から`.bashrc`を呼んでいたのだが、新しいセッションごとに`.zshrc`は呼ばれるようなのでこの設定はいらないみたいだ。なので、`.zprofile`については特に今の所は何も記載していない。今後、何か記載した場合は追記する予定。

まだまだ、`zsh`にはより良い機能がたくさんあるとのことなので、更新していきたい。
TypeScript入門編

もともとflowで型チェックをしていたReactのプロジェクトに、昨年の後半からTypeScriptが導入されました。
色々手こずりながら学んでますが、学んだ事をまとめていこうと思います。本編はまず入門編として知識のみを紹介します。実際のサンプルコードなどは[基本編](https://qiita.com/hisashi_matsui/items/f8423c12b47b68b39b58)を読んでください。

## そもそもTypeScriptとは？
TypeScriptはMicrosoftが開発・提供している`型をつけられるJavaScript`です。JavaScriptでできることはTypeScriptでもできます。つまり`JavaScriptのパワーアップバージョン`です。

TypeScriptは`静的型付け言語`という種別にあたり、変数や定数、関数の引数や戻り値などに「どの型なのか」を指定することができます。

## 静的型付け言語とは？
**静的型付け**＝変数に格納出来る型を固定する事ができ、プログラムを実行前に型検査を行い、型の不整合による不具合の発生を予防することを可能にする。
`例）TypeScript、C++、C＃、Java` 

** 動的型付け**＝変数に格納出来る型を動的に変動するので、意図しない型に変換されて不具合が発生したりする事もあり、安全性という意味では静的型付け言語に劣る。
` 例）JavaScript、PHP、Ruby、Python`


## 型とは？
ざっくり言うと、型はデータの種類の事です。以下Wikiから引用。

> プログラミングにおけるデータ型は、値の種類を示し分類分けするラベルである。データタイプともいう。例えば 0, 1, -42 は「整数」型に、"foo", "Hello" は「文字列」型にラベルづけできる。

例）string, number, boolean, object, arrayなど

普通のプログラミング言語はこのデータ型にとても厳しいらしいのですが、JavaScriptは型がなく（Any型）ゆるゆるとか揶揄されていた。
 
TypeScriptはJavaScriptにコンパイルし、型の整合性がチェックされ、不整合の場合エラーが出る。これにより数値型だと思ったら文字列だったというようなトラブルや、異なる型で変数（値）を比較し実は`"" == 0`でtrueとなっていたというような、気づきにくいトラブルに時間を取られる事が防げます。品質を意識したプログラムを作成したい場合、型による制約（チェック）があるほうが安全なのです。

**このコンパイルエラーを得れる事がTypeScriptの最大の恩恵と言われています。**

以下、[実践TypeScript](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5TypeScript-BFF%E3%81%A8Next-js-Nuxt-js%E3%81%AE%E5%9E%8B%E5%AE%9A%E7%BE%A9-%E5%90%89%E4%BA%95-%E5%81%A5%E6%96%87/dp/483996937X)から引用：

>昨今のJavaScriptプロジェクトは年々規模が増大しています。それに伴い、何かコードを変更するにしても影響範囲の特定が難しい。大規模プロジェクトが可能という観点は、まさにこの**影響範囲を特定しやすいか否か**に直結します。

>**静的型付けに守られる**最大の利点は、１箇所のコード変更により引き起こされる影響範囲の特定です。TypeScriptの需要が年々増す理由はフロントエンドのコードが大規模化してる事に他ならないでしょう。

>そんな現場にとって**コンパイルエラーは進んで勝ち取りに行くもの**なのです。


## なぜTypeScriptを使うのか？その恩恵とは？
コンパイルエラーを得れる事以外にもTSのメリットはたくさんあります。

1. 同じMicroSoft製のVisual Studio Codeを使えば強力な入力補完が使えて楽。
2. 関数にどんなデータを渡せばよいか、どんなデータが返ってくるかが一目でわかる
3. Interface機能によりオブジェクト指向な設計ができ、大規模システムでもメンテナンスコストを下げることができる
4. エラーチェックができる（誤った型のデータを渡したり、渡し忘れたりなど、`型の不整合`を教えてくれるので、人力は気づきにくいミスに簡単に気づける）


以上、TypeScriptの基礎知識をまとめてみました。[基本編](https://qiita.com/hisashi_matsui/items/f8423c12b47b68b39b58)に続く。
[Ruby]文字列で使えるメソッド

##文字列の置換

- 文字列.sub(/変換した文字/,"置き換えたい文字列)・・・一番最初の文字のみ変換

```
irb(main):026:0> str
=> "123123123"
irb(main):027:0> str.sub(/12/,"ab")
=> "ab3123123"
irb(main):028:0> str
=> "123123123"
```
12と言う文字をabと変換したらab3123123と置換された
ただしインスタンス自体は置換されていない



- 文字列.gsub(/変換した文字/,"置き換えたい文字列)・・・対応したすべての文字を変換
gはグローバルの意味

```
irb(main):029:0> str.gsub(/12/,"ab")
=> "ab3ab3ab3"
```
これも同様にインスタンス自体は置換されない

- 文字列.sub！(/変換した文字/,"置き換えたい文字列)・・・元のインスタンス自体の一番最初の文字のみ変えてしまう

 ！は破壊的メソッド・・・インスタンス自体を変換してしまう

```
irb(main):030:0> str.sub!(/12/,"ab")
=> "ab3123123"
irb(main):031:0> str
=> "ab3123123"
```

- 文字列.gsub！(/変換した文字/,"置き換えたい文字列)・・・元の変数自体をすべての文字を変えてしまう

```
irb(main):034:0> str = "123123123"
=> "123123123"
irb(main):035:0> str.gsub!(/12/,"ab")
=> "ab3ab3ab3"
irb(main):036:0> str
=> "ab3ab3ab3"
```

##文字列の検索

- 文字列.index("検索したい文字列”）・・・検索してどこに検索したい文字列があるか教えてくれる



```
irb(main):038:0> "12345".index("2")
=> 1
```

もちろん変数に格納された文字列も検索できる

```
irb(main):041:0> str = "abcde"
=> "abcde"
irb(main):042:0> str.index("c")
=> 2
```

これを見て、”12345”で”２”を検索しているのに”1”っておかしくないと思いましたよね？
格納された要素は添字といった番号を割り振られます
添字は０からスタートするので”12345”と言う文字列は”１”から番号が割り振られるのではなく、”０”から割り振られるます
だから”２”の検索結果が”１”となった訳です

##文字列の削除
- 文字列.delete(”削除したい文字列”)・・・指定された文字列の削除
- 文字列.delete!(”削除したい文字列”)・・・（インスタンスからも）指定した文字列の削除

```
irb(main):044:0> str.delete("cd")
=> "abe"
irb(main):045:0> str
=> "abcde"
```

当然！をつけると破壊的メソッドになるのでインスタンスも変化（削除）されてしまう

- 文字列.chop・・・文字列の行末を削除できる

```
irb(main):049:0> str.chop
=> "abcd"
```

これも！を付けると破壊的メソッドになる

- 文字列.chomp・・・改行コードも削除できる

例えばchomoなしでgetsを利用して文字列入力すると

```
irb(main):054:0> gets.to_s
私の名前は太郎
=> "私の名前は太郎\n"
```

と\nと改行コードが組み込まれてします

それをchompを利用すると

```
irb(main):053:0> gets.to_s.chomp
私の名前はたろう
=> "私の名前はたろう"
```

\nが組み込まれない

##文字の分割して配列を作成

文字列.split

```
irb(main):055:0> "aa bb cc".split
=> ["aa", "bb", "cc"]
```

空白を入れると分割されて配列が作成される
余談ですが、railsでタグ機能を作る時にgemなしの場合splitを使用して複数作ります（経験談）
これは文字を指定して分割する事も可能で、例えば","なら

文字列.split（",")でカンマを指定してして分割出来ます

```
例：
irb(main):058:0> "aa,bb,cc".split(",")
=> ["aa", "bb", "cc"]
```

逆に作った配列を文字列に戻す方法は
配列.joinを使います

```
例：whatの中に先ほどの入れる["aa", "bb", "cc"]が格納されております
irb(main):059:0> what.join
=> "aabbcc"
```

配列.join(" ")と指定してあげると

```
irb(main):061:0> what.join(" ")
=> "aa bb cc"
```
と分割された状態で文字列に戻します

##文字列の変換

文字列.upcase・・・大文字に変換
文字列.downcase・・・小文字に変換


```
irb(main):063:0> length = "aaa"
=> "aaa"
irb(main):064:0> length.upcase
=> "AAA"
irb(main):065:0> length.upcase!
=> "AAA"
irb(main):066:0> length
=> "AAA"
irb(main):067:0> length.downcase
=> "aaa"
irb(main):068:0> length.downcase!
=> "aaa"
irb(main):069:0> length
=> "aaa"
```

文字列.reverse・・・文字列を左右反転

```
irb(main):072:0> length = "abc"
=> "abc"
irb(main):073:0> length.reverse
=> "cba"
```

文字列.slice(範囲）・・・文字列を指定した範囲を切り取ってくれる

```
irb(main):076:0> length = "abcdef"
=> "abcdef"
irb(main):077:0> length.slice(2..4)
=> "cde"
```

2〜４までの範囲の文字列cdeを切り取ってくれました
このslice(2..4)の..は範囲をしているする時に使います

##最後
ノートにあったものを片っ端からまとめてみました
もしかしたら解釈が間違えているかもしれませんのでもしよかったらご指摘お願いします