OmniAICreator/Qiita-1.07M huggingface dataset:
【プログラミング初心者】Swift練習問題~九九表示~

#問題
引数、戻り値を取らず呼び出すと、以下実行結果のような九九の表をコンソールに表示する関数を作成してください。

```swift
func printMultiplicationTable() {
    ...
}
printMultiplicationTable()
```
```:実行結果
+-------------------------------+
|     1  2  3  4  5  6  7  8  9 |
|  +----------------------------|
| 1| 01 02 03 04 05 06 07 08 09 |
| 2| 02 04 06 08 10 12 14 16 18 |
| 3| 03 06 09 12 15 18 21 24 27 |
| 4| 04 08 12 16 20 24 28 32 36 |
| 5| 05 10 15 20 25 30 35 40 45 |
| 6| 06 12 18 24 30 36 42 48 54 |
| 7| 07 14 21 28 35 42 49 56 63 |
| 8| 08 16 24 32 40 48 56 64 72 |
| 9| 09 18 27 36 45 54 63 72 81 |
+-------------------------------+
```

【補足】
`Int`から`String`の変換方法は以下です。

```swift
let str = String(数値)
または
let str = "\(数値)"

(例)
let number = 1
let str1 = String(number)  // "1"
let str2 = "\(number)"     // "1"
```

回答例は[こちら](https://qiita.com/euJcIKfcqwnzDui/items/802573bf25349e383009)

#最後に
別の問題は以下に掲載しています。
また本記事とは別でプログラミング未経験からiOSアプリ開発が行えるようになることを目的とした記事を連載しています。
連載も以下にまとめていますのでそちらも是非もご覧ください。
http://naoyalog.com/
【プログラミング初心者】Swift練習問題~九九表示~回答例

#九九表示
##回答例
```swift
func printMultiplicationTable() {
    let tableWidth = 9 * 3 + 5 + 1
    
    // +-------------------------------+
    var topSeparator = ""
    for index in 0..<tableWidth {
        if index == 0 || index == tableWidth - 1 {
            topSeparator += "+"
        } else {
            topSeparator += "-"
        }
    }
    print(topSeparator)
    
    // 九九の列の数字
    var columnNumber = "|   "
    for column in 1...9 {
        columnNumber += "  \(column)"
    }
    columnNumber += " |"
    print(columnNumber)
    
    // |  +----------------------------|
    var innerTopSeparator = ""
    for index in 0..<tableWidth {
        if index == 0 {
            innerTopSeparator += "|"
        } else if index > 0 && index < 3 {
            innerTopSeparator += " "
        } else if index == 3 {
            innerTopSeparator += "+"
        } else if index == tableWidth - 1 {
            innerTopSeparator += "|"
        } else {
            innerTopSeparator += "-"
        }
    }
    print(innerTopSeparator)
    
    // 計算結果表示
    for row in 1...9 {
        var multiplication = "| \(row)| "
        
        for colmun in 1...9 {
            let number = row * colmun
            var numberStr = String(number)
            
            if number < 10 {
                numberStr = "0" + numberStr
            }
            
            multiplication += numberStr + " "
        }
        
        multiplication += "|"
        print(multiplication)
    }
    
    // +-------------------------------+
    var bottomSeparator = ""
    for index in 0..<tableWidth {
        if index == 0 || index == tableWidth - 1 {
            bottomSeparator += "+"
        } else {
            bottomSeparator += "-"
        }
    }
    print(bottomSeparator)
}
```
##解説
基本的には力技で表示しています。

`print()`関数は表示するとき改行されるため、１行を表す`String`の変数をそれぞれの行で作り表示します。

`let tableWidth = 9 * 3 + 5 + 1`で表の横幅を定義します。
九九のデータが「半角スペース＋2桁の数字」なので9×3。
右側の「| 1|」が5文字、最後の「|」が一文字なので横幅は「9×3+5+1」となります。

あとは適宜`for`文を回してそれぞれの行を完成させます。
たまに「+」などが表示されるので、該当するタイミングで`if`文を使って場合分けします。

計算結果で、結果が一桁の場合「01」などと表示する必要があるので計算結果を確認し、一桁の場合は頭に「0」の文字列を追加しています。

このように複雑な表示をする場合には`for`と`if`を使って地道に実装することもあります。
【VSCode】Emmetが自動補完しないを解決する方法

#【VSCode】Emmetが自動補完しないを解決する方法

##どんな方向け
VSCodeにEmmetを入れたはいいものの、自動補完してくれない人向け

##実行環境
Windows
VSCode　1.45.1

##大まかな設定方法
①設定を開く
②拡張機能からEmmetを選択
②Trigger Expansion on Tabにチェックを入れる

##細かい具体的な設定方法
- 設定を開く
    - Ctrl+「,」（カンマ）で設定画面を開く
- 拡張機能からEmmetを選択
    - ユーザタブ→拡張機能→Emmetを押下
- Trigger Expansion on Tabにチェックを入れる
    - チェックをいれると左側に線が入ります。

##確認
- 適当なHTMLファイルを作成
- divを入力後、tabボタンを2回押下
- 	```<div></div>
```と表示されれば成功

##!のあとにtabボタン２回押しても面白いよ
Nginx on AWS EC2

# リバースプロキシー

```
sudo vi /etc/nginx/conf.d/default.conf
```

参考
https://tech-waplus.com/programming/20190410-nginx-node-js-web/





エラー処理

https://itneko.com/nginx-ssl-deprecated/

# SSH証明書 設定
ポイントは各会社の中間証明書の存在を認識しておくこと。

https://www.bestssl.net/faq/install-nginx/
【AWS】デフォルトVPCを削除してしまった

#デフォルトVPCを削除してしまったら
公式を参照すると、以下の通りになっていた。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/default-vpc.html#create-default-vpc
Amazon VPC コンソールを使用してデフォルト VPC を作成するには
1.Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) を開きます。
2.画面左枠のナビゲーションペインで、[VPC] を選択します。
3.[Actions]、[Create Default VPC] の順に選択します。
4.[作成] を選択します。確認画面を閉じます。


#デフォルトVPC実際に作ってみた
設定値などは設定しなくていいのか？と思っていつつ、開いてみた。

デフォルトVPCの作成を押す。
<img width="1219" alt="スクリーンショット 2020-06-14 15.05.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/dc31e70b-2bf4-68a3-1600-baf22660a83b.png">

デフォルトVPCの作成画面が出てくる。作成をクリック。
<img width="1214" alt="スクリーンショット 2020-06-14 15.06.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/3f0dd9af-ec7f-df79-f387-653f32b438bc.png">

特に設定もせずに作成できるようだ。
<img width="1214" alt="スクリーンショット 2020-06-14 15.06.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/e52cd96f-08ec-659c-fceb-338290683d38.png">


下記のURLの情報を見ると、一部サービスでデフォルトVPCでないと怒られるようですが、他のVPC選べば問題ないとのこと。
https://blog.putise.com/%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88vpc%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E3%81%A8%E5%95%8F%E9%A1%8C%E3%81%8C%E8%B5%B7%E3%81%8D%E3%82%8B%EF%BC%9F/
Rubyのインスタンスメソッドとクラスメソッドの違いをわかりやすく。

##はじめに
今までRubyの重要概念であるインスタンス,クラスについて明確にわかっていなかったので例を挙げながら説明していきます。Ruby使う上で絶対にわかっていなければならないことだと思うのですが、理解が甘かったので。

##本記事の対象
・Ruby初めての方
・クラス、インスタンスが曖昧になっている人

##インスタンス・クラスとは
例として、twitterのようなサービスで、Tweetクラスのもと、下のようにuserたちがidが1~3の投稿をしていることとします。
![Tweet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617418/1663baa7-80d0-b1d3-f6a9-27d782a833f0.png)

このとき黒い四角でかこった一つ一つの投稿は**インスタンス**です。インスタンスはクラスの型から生成されたオブジェクトといわれます。そしてTweetは**クラス**です。インスタンスがクラスに属しているイメージです。
Rubyの重要概念です！！

##コードで理解


```ruby
class Tweet
  #クラスメソッド
  def self.tweet
    puts "tweet"
  end

  #インスタンスメソッド
  def post_tweet(user,about)
    puts "#{user}さんが#{about}について投稿しました"
  end
end

#実行
Tweet.tweet

new_tweet = Tweet.new()
new_tweet.post_tweet("choco","プログラミング")
```
実行後

```ruby
tweet
chocoさんがプログラミングについて投稿しました
```

#クラスメソッド => クラスに対して行われるメソッド。
・classの外で　「クラス名.メソッド」　で呼び出す。(上の例だとTweet.tweet)
・selfを削ると怒られる。（**selfでクラスメソッドだと宣言する**)
=>クラスの中で　**self.メソッド名　~~ end** で定義できます。
・all,newなどはあらかじめ定義されているクラスメソッドで、クラスに対しての操作ができます。（allはクラスのインスタンスを全部取得、newはクラスに新しいインスタンスを作成)


#インスタンスメソッド=>インスタンスに対して行われるメソッド。
・classの外で　「インスタンス名.メソッド」で呼び出す。(上の例だとnew_tweet.post_tweet)
インスタンスはクラスに属すため、**クラス名.new**でインスタンスを作成して、そのインスタンスに対してメソッドを実行します。
・基本的に実装中はインスタンスメソッドを使うことが多いと感じます。


#おわり
この記事を書いていて、Rubyがすごくわかりやすく・直感的な設計なのだと思いました。これからもう少しちゃんとインスタンス・クラスを強く意識してメソッド定義していこうと思います。

読んでくださった方、ありがとうございました。
ご指摘がありましたらよろしくお願いします。
local(手元)でcircleciのlocalstackコンテナをデバックする

## 紹介する内容
- circleciに構築したlocalstackコンテナをデバックする方法共有です
  - Primaryコンテナはpythonコンテナです、localstackコンテナはPrimaryコンテナではありません
- circleciの`docker executor`を使います


## 結論
- circleciをlocalで動かしているものはdockerです。よってPrimaryコンテナではないコンテナに`docker attach`で張り付くとコンテナの出力が見えます

- しかし、circleciのコンテナはコンテナの名前が指定できません
  - このせいで人がコンテナ名を手動で確認した後に、`docker attach 手動で確認したコンテナ名`することが最善です
  - こちらが使用可能なオプションですが、コンテナ名を設定するオプションはなさそうです
     - https://circleci.com/docs/2.0/configuration-reference/#docker 



## 紹介始めます
当記事のプロジェクトは`circleciにlocalstackをterraformで構築する`記事のプロジェクトをそのまま使用中です。
circleciにlocalstackをterraformで構築する詳しい内容はこちらで確認できます。
https://qiita.com/cheekykorkind/items/8da683934d7a3233d724

### 構築実験環境
#### Linux
- CentOS Linux release 7.7.1908 (Core)

#### Docker Compose
- VERSION : 1.24.1

#### Docker
- VERSION : 19.03.5

#### local circleciをインストールします
https://circleci.com/docs/2.0/local-cli/#installation


#### ディレクトリ構成
全体ソースコードは https://github.com/cheekykorkind/circleci-localstack で確認できます

- 全体図
![treeD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/d3ac489f-761a-73d3-0e6a-d7d6c1ec854e.png)


- circleci config部分
![circleciD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/16e7d886-4d2d-e63f-ad9f-e011d4b15c48.png)


#### circleciで実行される作業の順番を伝えます。
1. `circleci local execute --job test`でcircleciをlocal実行します
2. circleci/python:3.7-buster-nodeコンテナ(Primaryコンテナ)が作られます
3. localstackコンテナが作れます
4. Primaryコンテナのstepが実行されます
   - `name: Wait for localstack` stepで少なくともportが開けるまで待ちます
   - pythonのpackageをディレクトリ`/home/circleci/project/sam-lambda/hello_world/packages` に指定し、インストールします
   - `$LAMBDA_ZIP_PATH`に置きます
   - terraformをインストールしあます
   - terraformファイルがいる `$TERRAFORM_PATH` に移動します
   - terraform initします
   - terraform applyします。同時にterraformでlambdaのzipパス(`$LAMBDA_ZIP_PATH`)とcircleciのデフォルトhost名を入れたを`$COMMON_NETWORK`を渡します
   - terraformによってlambdaが作られます

上で伝えた実行の内、`Primaryコンテナのstepが実行されます` の前までずっと手動で`docker ps`を打つことになります。


#### デバック方法を見せます
これで、localstackコンテナの出力が見えるようになって、circleciでlocalstackを使う時に
localstackのエラーなのか、localstackがそもそも起動してなかったのかが確認できます。
![dockerAttach.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/190cd587-15d8-8e7e-c458-be96902f5d24.gif)
要素の数が n の集合のべき集合（に相当する配列）を得る

# はじめに

- 要素の数が `n` の集合の[べき集合](https://ja.wikipedia.org/wiki/%E5%86%AA%E9%9B%86%E5%90%88) を得るコードを書きました。
- 使用したプログラミング言語はJavaScriptです。
- 数学の集合の代替として、コードでは配列を使っています。
- 要素数が `n` の集合を表す配列としては、`[0, 1, 2 ... n-1]` を使います。

# 仕様

非負の整数 `n` を受け取り、べき集合に相当する配列を返す関数 `powerSet` を作成しました。

```javascript
powerSet(n)
```

`powerSet(n)` の仕様は以下です。

- 引数の `n` として非負の整数を受け取る。それ以外の場合は、Error をスローする。
- 以下は、`n` が 0以上2以下の場合の、`powerSet(n)` が返す配列の例になります。
  - `powerSet(0)`： 空集合Φのべき集合を表す配列 `[ [] ]` を返す。
  - `powerSet(1)`： 要素が1個の集合 `{ 0 }` のべき集合を表す配列 `[ [], [0] ]` を返す。
  - `powerSet(2)`： 要素が2個の集合 `{ 0, 1 }` のべき集合を表す配列 `[ [], [0], [1], [0, 1] ]` を返す。
  - `powerSet(3)`： 要素が3個の集合 `{ 0, 1, 2 }` のべき集合を表す配列 
`[ [], [0], [1], [2], [0, 1], [0, 2], [1, 2], [0, 1, 2] ]` を返す。
- また、`powerSet(n).length` は、要素数`n`の集合のべき集合の要素数なので、2の`n`乗になります。
 


# コード

再帰を使って以下のように実装しました。

```javascript
const powerSet = (n = 0, sorting = false) => {
  if (!Number.isInteger(n) || n < 0) {
    throw new Error('parameter must be non-negative integer');
  }
  if (n === 0) {
    return [[]];
  }
  const prev1 = powerSet(n-1),
        prev2 = prev1.map(a => [...a, n-1]);
  return sorting ? [...prev1, ...prev2].sort(arrayCompare) : [...prev1, ...prev2];
}
```

- 上記のコード内で、ソートの比較関数として使っている`arrayCompare`　は以下です。

```javascript
const arrayCompare = (a1, a2) => {
  const lenDiff = a1.length - a2.length;
  if (lenDiff) {
    return lenDiff;
  }
  const i =  a1.findIndex((e, j) => e - a2[j] !== 0);
  return i >= 0 ? a1[i] - a2[i] : 0;
}
```

`arrayCompare`を使って、`powerSet` のほうで、

```javascript
return sorting ? [...prev1, ...prev2].sort(arrayCompare) : [...prev1, ...prev2];
```

と、引数の `sorting` が true のときにソートをした結果を返しているのは、結果として得られる配列を、要素数の少ない配列要素から順に、要素数が同じならば、要素の配列が、より小さい数が先にくるものが、先頭に近いほうにくるように並べたいためです。


# 実行例

```javascript
for (let n=0; n <=4; ++ n) {
  console.log(JSON.stringify(powerSet(n, true)));
}
```
上記にて、以下のように出力されます。

```shell-session
[[]]
[[],[0]]
[[],[0],[1],[0,1]]
[[],[0],[1],[2],[0,1],[0,2],[1,2],[0,1,2]]
[[],[0],[1],[2],[3],[0,1],[0,2],[0,3],[1,2],[1,3],[2,3],[0,1,2],[0,1,3],[0,2,3],[1,2,3],[0,1,2,3]]
```

- [上記を確認するためのCodePen](https://codepen.io/jun68ykt/pen/RwrRzww?editors=0012)

# 応用例

6個の数値、`100`, `１20`, `170`, `240`, `330`, `430` から、少なくとも3個以上、最大で6個すべての数字を取り出して合計値を作る。

- `100`,`170`, `330`　の３つを選ぶと、合計は `600`(=100+170+330)
- 6個すべてを選ぶと、合計は `1390`(=100+120+170+240+330+430)
- `100`と `１20` の２つだけ選ぶということはできない。最低3つ選ぶ。

このとき、すべての選び方について、選んだ値の合計値を小さい順に並べた配列は、先述の`powerSet` を使って以下で得られる。

```javascript
const values = [100, 120, 170, 240, 330, 430];
const choices = powerSet(values.length, true).filter(ary => ary.length >= 3).map(a => a.map(i => values[i]));
const totals = [...new Set(choices.map(ary => ary.reduce((s,v) => s + v)))].sort((v1, v2) => v1 - v2);

console.log(totals)
```

- [上記を確認するためのCodePen](https://codepen.io/jun68ykt/pen/XWXKLmB?editors=0012)


上記により、以下が表示されます。

```shell-session
[
   390,  460,  510,  530,  550,  600,  620,
   630,  650,  670,  690,  700,  720,  740,
   770,  790,  820,  840,  860,  880,  890,
   930,  940,  960,  980, 1000, 1030, 1050,
  1060, 1100, 1120, 1150, 1170, 1220, 1270,
  1290, 1390
]

```
以上
Qiitaに予約投稿する仕組みを作る【ログイン編】 ~1日10行コーディング ~

## 7日目

今回からまた、新しいものを作りたいと思います。
この毎日投稿なのですが基本的に前日くらいにかきあげて、それを次の日の20時とかに手動で投稿してるのですが、普通に投稿し忘れたりするので自動化できれば...と常に思っていたのでそちらを作りたいと思います。
一旦今日のところは自分のページにログインする部分の処理を書きたいと思います。

### 【技術テーマ】
Qiitaのスクレイピング

### 言語
* Ruby

### 目標成果物
Qiitaにログインするコードを書く

### コードと資料

#### ログイン処理の実装

前回同様ログイン系の処理なのでmechanizeを使います。

Gemfile

```Gemfile
source 'https://rubygems.org/'

gem 'nokogiri'
gem 'mechanize'
```

crawler.rb

```crawler.rb
require 'nokogiri'
require 'mechanize'

agent = Mechanize.new
login_page = agent.get("https://qiita.com/login")

doc = Nokogiri::HTML.parse(login_page.body, nil, 'utf-8')
token =  doc.css('.loginSessionsForm')[0].css('input')[0]['value']
agent.post("https://qiita.com/login",{
  identity: 'メールアドレス',
  password: 'パスワード',
  authenticity_token: token
})

```

tokenが無いと500で起こられてしまったのでログインページで取得しておいてそれをpostしてあげます。
試しにこのしたに

```
page = agent.get("https://qiita.com/drafts/9854bdc1a4086754e4ab")
doc = Nokogiri::HTML.parse(page.body, nil, 'utf-8')
p doc
```
とか書いて下書きページにいくと下書きページが取得できていることがわかります。
https://qiita.com/drafts/9854bdc1a4086754e4ab
は動的な値なのかもしれないので要検討ですが....


一旦今日のところはこれで完了です。
(QiitaにQiitaのスクレイピングについて載せたら消されるのだろうか...🤔)
これだけは覚えておきたいS3の用語と概念

####前置き
AWSを学習し始めて2瞬間ほどしかたっていませんが、S3でこれだけは(個人的に)覚えておきたいと思った用語を並べていきます。

この記事書いてる途中に上位互換発見しました。記事はせっかく書いたので残しますが、こちらの記事を見ていただければここに書いてある内容はすべて載っています。
https://qiita.com/iron-breaker/items/f35c1d54887c434a321a

#S3とは
Amazon Simple Storage Serviceの略で、AWSで良く使われるストレージサービス。

#用語、概念
###バケット
データを入れるコンテナのこと。言葉からイメージしやすいですね。
S3を使用する時は、まずバケットを作ることから始まります。

###オブジェクト
S3に格納される基本エンティティ(=独立した１つの要素)。**オブジェクトデータ**と**メタデータ**から構成されます。

**オブジェクトデータ**
格納するデータ。写真だったり、コードだったり、テキストファイルだったりetc...
普通にデータと言われたら思い描くものです。

**メタデータ**
オブジェクトの作成日とか、オブジェクトのサイズはいくらだとかを表すデータ※。オブジェクトを作成したらユーザーが変更することは出来ないのが特徴。

※正確にはシステムで定義されたオブジェクトメタデータと言います。もう一つユーザー定義のオブジェクトメタデータというのがありますが、詳しくは[こちら](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingMetadata.html#object-metadata)からどうぞ。

###キー
バッケット内のオブジェクトを区別するための識別子。1つのオブジェクトには必ず1つのキーを被らないように設定します。
例えば、`user_name.txt`というファイルを`User`というディレクトリにそのままの名前で保存すると、`User/user_name.txt`がキーとなります。

###データ整合性モデル
オブジェクトを作成したり更新したりした後にそのオブジェクトを見にいくとどうなっているのか、というのがデータ整合性モデルです。

####オブジェクトを作成した時
**"書き込み後の読み込み" 整合性**です。これは、作成した直後にオブジェクトを見ると問題なくオブジェクトが見れるということです。

####オブジェクトを更新した時や削除した時
**結果整合性**です。これは、作成した直後にオブジェクトを見ると、更新される前のオブジェクトのままだったり削除されていなかったりすることがあるよということです。

AWSの試験でたまに整合性について聞かれることがあるらしいので覚えておくといいかもしれません。

#最後に
曖昧だった知識を整理できたのでよかったです。

参考
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Introduction.html

ググらなくても公式ドキュメント読めるようになりたい...
Maximum-Cup 2018 C 嘘つきな天使たち

##問題
https://atcoder.jp/contests/maximum-cup-2018/tasks/maximum_cup_2018_c
##見た感じ
最初、$A_i$がそれぞれ違うことに気づいてなくて、めちゃくちゃ悩んだ。でも、気づいてしまえば、ただ矛盾するかどうかを確認するだけの問題なので、簡単。
二分木にできるかどうかの観点と
unionfind木を使った矛盾するような組み合わせができてないかの観点から矛盾を判定した。
##解法
矛盾していれば-1
してなければ(n+1)/2　を返す。
##ソースコード
- 二分木version

```c++
const int N_MAX=100005;
vint v;
int n,col[N_MAX];

int main(){
    int x,y;
    //入力
    cin>>n;
    rep(i,n){
        cin>>x;
        v.pb(x-1);
    }
    //処理
    rep(i,n){
        if(col[i]!=0)continue;
        int now=i;
        col[now]=1;
        while(true){
            if(col[v[now]]==col[now]){
                cout << -1 <<endl;
                return 0;
            }else if(col[v[now]]!=0)break;
            col[v[now]]=-col[now];
            now=v[now];
        }
    }
    //出力
    cout << (n+1)/2 <<endl;
}
```
- unionfind木version

```c++
struct uftree{
    int cou;
    vector<int> parent;
    vector<int> rank;
    vector<int> _size;
    uftree(int nn){
        parent=vector<int>(nn);
        rank=vector<int>(nn,0);
        _size=vector<int>(nn,1);
        cou=nn;
        rep(i,nn){
            parent[i]=i;
        }
    }
    int root(int i){
        return parent[i]==i?i:parent[i]=root(parent[i]);
    } 
    bool same(int i,int j){
        return root(i)==root(j);
    }
    void merge(int i,int j){
        i=root(i);j=root(j);
        if(i==j)return;
        cou--;
        if(rank[i]>=rank[j]){
            parent[j]=i;
            _size[i]+=_size[j];
        }else{
            parent[i]=j;
            _size[j]+=_size[i];
        }
        if(rank[i]==rank[j])rank[i]++;
        return;
    }
    int count(){
        return cou;
    }
    int unitsize(int i){
        return _size[root(i)];
    }
};
const int N_MAX=200005;
int n,a[N_MAX],b[N_MAX];


ll solve(){
    uftree tree(2*n);
    rep(i,n){
        tree.merge(i,a[i]+n);
        tree.merge(i+n,a[i]);
        if(tree.same(i,i+n)||tree.same(a[i],a[i]+n)){
            return -1;
        }
    }
    return (n+1)/2;
}

int main(){
    int x,y;
    //入力
    cin>>n;
    rep(i,n){
        cin>>x;
        a[i]=x-1;
    }
    //処理
    ll ans=solve();
    //出力
    cout << ans <<endl;
}
```
Table WidgetのRow/Column Span設定

Table Widget（Traditional Web）には、Column Span、Row Spanというプロパティがあり、セルの水平、垂直方向の結合を指定できます。

HTMLのtd、thタグにある、rowspan、colspanと同じ設定。

# 結合する操作
## 行方向
Cell WidgetにはColumn Spanプロパティがあるものの、グレイアウトされていて入力できません。
代わりに、

1. MergeしたいCell Widget（同じRow内で横並びのもの）をCtrlキーを押したまま複数選択
2. 右クリック
3. Table > Merge Cells（下の例では、3つのセルの内、先頭2つにたいしてMergeしている）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/dd16a256-77c4-cb71-f6d3-c98eecca88ad.png)

選択したCell Widgetが結合して1つになります。また、そのCell WidgetのColumn Spanに選択していたセル数が自動設定されます。

マージしたセルはこのように1つになり、もともと選択していたセル数が、Column Spanプロパティに設定されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e814b9f9-8eaa-67f2-48f9-22ee980e6e07.png)

実行時に出力されるHTML。Service Studio上での設定ときちんと対応しているので、特に説明は必要なさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/9e881edb-fc08-a096-5c03-ac88e983ee4e.png)

## 列方向
こちらは、Cell WidgetのRow Spanです。
手順は、行方向と基本的に同じで、

1. MergeしたいCell Widget（列位置が同じで縦に並ぶもの）をCtrlキーを押したまま複数選択
2. 右クリック
3. Table > Merge Cells

# 結合を解除する操作
## 行方向
1. Column Spanに値が入っているCell Widgetを選択
2. 右クリック
3. Table > Split Cell

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/384948b6-d260-fdac-00c7-429b9c1c881c.png)


## 列方向
1. Row Spanに値が入っているCell Widgetを選択
2. 右クリック
3. Table > Split Cell

# 公式ドキュメント
Cell Widgetのドキュメント。プロパティの説明は記載されているのですが、設定方法は載っていません。
https://success.outsystems.com/Documentation/11/Reference/OutSystems_Language/Traditional_Web/Web_Interfaces/Designing_Screens/Cell_Widget
Cloud Storageトリガーで OpenCVを使い画像のリサイズをするCloud Functions

GCP の Cloud functions で Cloud storage トリガーを使用して、アップロードされた画像のサムネイルを作りたい時のpythonを使用したサンプルです。

- GCSトリガーはこのスクリプトがアップロードしたオブジェクトでも起動するので、ループしないためのロジックを組み込む必要がある
- このバケットに入ってくるオブジェクトは全て画像、みたいな前提。他のファイルが入ってくるなら、はじいたりするロジックがいる
- cv2.imwrite() は拡張子がないとうまく動かないのでファイル名に設定しておく必要がある
- サムネイルなので、縦横が300pxの正方形で…みたいな要請はありがちだと思うが、それはサイズをしているときのロジックをいじったりすればよい


```requirements.txt
google-cloud-storage==1.28.1
opencv-python==4.2.0.32
```

```python
# -*- coding: utf-8 -*-
import tempfile
import os
import cv2
from google.cloud import storage


NEW_FILE_PREFIX="thumbnail_"
client = storage.Client()


def main(event, context):
    """Triggered by a change to a Cloud Storage bucket.
    Args:
         event (dict): Event payload.
         context (google.cloud.functions.Context): Metadata for the event.
    """
    name = event['name']
    bucket = event['bucket']

    _, _name = os.path.split(name)
    if _name.startswith(NEW_FILE_PREFIX):
        print(f"Blob {name} is already resized.")
        return

    file_name = download(bucket, name)
    resize(file_name)
    upload(bucket, name, file_name)

    os.remove(file_name)


def download(bucket, blob_name):
    blob = client.bucket(bucket).blob(blob_name)
    _, _ext = os.path.splitext(blob.name)
    _, temp_local_filename = tempfile.mkstemp(suffix=_ext)
    blob.download_to_filename(temp_local_filename)
    print(f"Blob {blob_name} downloaded to {temp_local_filename}.")
    return temp_local_filename


def upload(bucket, blob_name, file_name):
    _dir, _name = os.path.split(blob_name)
    new_file_name = os.path.join(_dir, NEW_FILE_PREFIX + _name)
    new_blob = client.bucket(bucket).blob(new_file_name)
    new_blob.upload_from_filename(file_name)
    print(f'New image uploaded to: gs://{bucket}/{new_file_name}')


def resize(file_name):
    img = cv2.imread(file_name)
    height = img.shape[0]
    width = img.shape[1]
    print(f"Old blob width {width}, height {height}")

    dst = cv2.resize(img, (int(width/2), int(height/2)))
    cv2.imwrite(file_name, dst) # requierd ext
    print(f"New blob width {dst.shape[0]}, height {dst.shape[1]}")
    return file_name
```

参考にしたもの
- [オブジェクトのアップロード](https://cloud.google.com/storage/docs/uploading-objects?hl=ja)
- [オブジェクトのダウンロード](https://cloud.google.com/storage/docs/downloading-objects?hl=ja#storage-download-object-python)
- [ImageMagick のチュートリアル](https://cloud.google.com/functions/docs/tutorials/imagemagick?hl=ja)
- [Image Processing using Google Cloud Functions](https://medium.com/google-cloud/image-processing-using-google-cloud-functions-26bffc290c9e)
Xcodeで画面遷移とともにデータを渡す

何度も調べているので、自分用にまとめます。
ここに記したもの以外にもいくつか方法はあります。

##やりたいこと
`commentTextView`に書かれたものを画面遷移先で使いたい！

##手順
1. 遷移のきっかけ(?)となるボタン(以下ボタンA)と遷移先のViewControllerを繋ぐ。
2. storyborad上のsegueにidentifierをつける(例"next")
3. ボタンAをswiftファイルに@IBActionで結びつける。'performSegue'メソッドの引数'withIdentifier'には2で入力したものを入れる
 
```Swift
@IBAction func next(_ sender: Any) {
        performSegue(withIdentifier: "next", sender: nil)
        
    }
```
ここまでで遷移自体はできます。以下から値渡しになります。
4. 遷移先のViewControllerに渡したい値を型に持つ変数を定義する。

```Swift
var nextString1 = String()
var nextString2 = ""
```
5.遷移前のViewControllerで`prepare`メソッドをオーバーライドする。
引数`for segue`には遷移前のViewController名を入れる。

```Swift
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let nextVC = segue.destination as? NextViewController
        NextVC?.nextString1 = commentTextView.text
       }
```
これで値渡し自体はできています。
あとは遷移先のViewControllerがロードされた時にラベルに貼り付けるのような操作を加えれば終了です。

6.遷移先のViewControllerの`ViewDidLoad`メソッドに代入する操作をかく

```Swift
override func viewDidLoad() {
        super.viewDidLoad()
        nextLabel.text = nextString1
    }
```


以上です。調べればわかりますが、**このサイトに4回アクセスしています**みたいなのはストレスなんですよね〜
解の範囲に制限を付けて連立方程式を解く【備忘録,R,重回帰,最小二乗法】


#ほんとに備忘録なんで期待無しで

でもこういう細かいスクリプトとかって共有されないから検索しても引っかからないのよね。

#目的


```r

library(tidyverse)
library(dplyr)
library(RCurl)

#行為に対して所要時間がついている
#ローカルにDLしたなら
#prob <- read.csv("0.csv",encoding="UTF-8",stringsAsFactors=F)

github_data <- getURL("https://raw.githubusercontent.com/amazongodman/open_folder/master/Simultaneous_equations_2020_06_10.csv")
prob <- read.csv(text = github_data,encoding="UTF-8",stringsAsFactors=F)

prob
```

```
  m1 m2 m3 mean
1  A          1
2  B          3
3  A  B       4
4  A  B  C    9
5  C  D      13
6  B  D      11
7  A  D       6
8  A  D      10
9  A  B  D   12
```


```r
##空白はNODATAに置き換える
prob$m1[nchar(prob$m1)==0] <- "NODATA"
prob$m2[nchar(prob$m2)==0] <- "NODATA"
prob$m3[nchar(prob$m3)==0] <- "NODATA"

##要素をマトリックスにする
mat4 <-matrix(c(prob$m1,prob$m2,prob$m3),nrow = length(prob$m1),ncol = 3)

mat4
```

```
      [,1] [,2]     [,3]    
 [1,] "A"  "NODATA" "NODATA"
 [2,] "B"  "NODATA" "NODATA"
 [3,] "A"  "B"      "NODATA"
 [4,] "A"  "B"      "C"     
 [5,] "C"  "D"      "NODATA"
 [6,] "B"  "D"      "NODATA"
 [7,] "A"  "D"      "NODATA"
 [8,] "A"  "D"      "NODATA"
 [9,] "A"  "B"      "D" 
```



```r
##連立方程式になおす
df <- data.frame(rows=seq_len(nrow(mat4))[row(mat4)], values=c(mat4)) %>%
  mutate(a=1) %>%
  pivot_wider(id_cols="rows", names_from="values", values_from="a", values_fn=list(a=length)) %>%
  mutate_all(~ +!is.na(.)) %>%
  select(-rows) %>%
  select(sort(colnames(.)))
```

```
      A     B     C     D NODATA
  <int> <int> <int> <int>  <int>
1     1     0     0     0      1
2     0     1     0     0      1
3     1     1     0     0      1
4     1     1     1     0      0
5     0     0     1     1      1
6     0     1     0     1      1
7     1     0     0     1      1
8     1     0     0     1      1
9     1     1     0     1      0
```


```r

#行為の無かったNodata列に数字が入っているのは厄介なので列ごと消す
df2 <-df[,colnames(df)[colnames(df) != "NODATA"] ]
df2$y = prob$mean

```

連立を解くために最小二乗法を使う。

```r
f<-function(param, x, y){
  sum((y - t(param) %*% t(x))^2)
}
```


```R
#重回帰で解けないような場合や、重回帰で係数が0以下になってほしくない場合にはoptimを使う

#係数の最低値を0.1にする制約を付ける
para <- optim(par=rep(0, 4), lower = 0.1,method = "L-BFGS-B",fn = f, x=df2[,-5], y=as.numeric(df2$y) )
```

```
[1] 0.6585317 3.3089433 5.1951257 7.6422791
```


```R
#係数の最低値を1にする制約を付ける
para2 <- optim(par=rep(0, 4), lower = 1,method = "L-BFGS-B",fn = f, x=df2[,-5], y=as.numeric(df2$y) )
```

```
[1] 1.000000 3.166669 5.166660 7.499996
```


#制約を付けないと重回帰と結果は同じになる


```r
para3 <- optim(par=rep(0, 4),method = "L-BFGS-B",fn = f, x=df2[,-5], y=as.numeric(df2$y) )
```





```
[1] 0.6585322 3.3089432 5.1951255 7.6422789
```

```R
#切片なしの重回帰で係数を探す
summary(lm(data=df2,y~.+0,conf.int = TRUE))
```

```
Coefficients:
  Estimate Std. Error t value Pr(>|t|)    
A   0.6585     0.7096   0.928 0.395970    
B   3.3089     0.7194   4.600 0.005842 ** 
C   5.1951     1.0035   5.177 0.003534 ** 
D   7.6423     0.7194  10.624 0.000128 ***
```






#以上
CarrierWave複数画像のアップロード

#前提
carrierwave用のカラム image:stringがある状態

```ruby:teminal
$ rails g model Post title:string body:text image:string
$ rails db:migrate
```
#実装

###Gemインストール
```ruby:Gemfile
gem 'carrierwave'
```

```ruby:terminal
$ bundle install
```

###CarrierWaveのアップローダー作成

```ruby:terminal
$ rails g uploader image
```

app/uploaders/image_uploader.rb に下記ファイルが作成される。

```ruby:image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  # include CarrierWave::MiniMagick

  # Choose what kind of storage to use for this uploader:
  storage :file
  # storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  # def default_url(*args)
  #   # For Rails 3.1+ asset pipeline compatibility:
  #   # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  #
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  # end

  # Process files as they are uploaded:
  # process scale: [200, 300]
  #
  # def scale(width, height)
  #   # do something
  # end

  # Create different versions of your uploaded files:
  # version :thumb do
  #   process resize_to_fit: [50, 50]
  # end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  # def extension_whitelist
  #   %w(jpg jpeg gif png)
  # end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  # def filename
  #   "something.jpg" if original_filename
  # end
end
```

Postモデルに先ほど作成したImageUploaderと紐付け。

```ruby:post.rb
  # 追加
  mount_uploaders :image, ImageUploader
  serialize :image, JSON
```

####controllerの編集
ストロングパラメーターに複数ファイルのアップロード属性を許可する

```ruby:posts_controller.rb
  def post_params
    params.require(:post).permit(:title, :body, { image: [] })
  end
```

####viewの編集
複数枚選択できるようにする。

```ruby:new.html.erb
 #追加 multiple: true
 <%= f.file_field :image, multiple: true %>
```

最後に複数枚表示できるようにする。

```ruby:index.html.erb
 <% @post.image.each do |image| %>
   <%= image_tag(image.url) %>
 <% end %>
```
【備忘録】Office365のOWAで、宛先候補に正しくない情報が表示される

「メール（OWA)の宛先に、正しくない名前が表示されるんですけど～」という問い合わせが立て続けに来たので、備忘録を兼ねてちょっとまとめてみる。同じパターン、結構多いかもしれない。

OWAで表示される宛先には3パターンある。

1.グローバルアドレスリスト
2.個人用の連絡先
3.ユーザーの宛先キャッシュ

#グローバルアドレスリスト

テナントユーザー全体共通の連絡先リスト。
テナント内・外の連絡先を、テナントユーザーに一律に適用できる。

情報が誤っている場合は、管理者で変更する必要があり、ユーザーではメンテナンスできない。

#個人用連絡先

アカウントごとに設定できる、連絡先。
テナント内・外の連絡先を、アカウントだけで使える連絡先リストで管理できる。
権限を与えれば、別のユーザーに見せることも可能。

情報が誤っている場合は、ユーザー自身でメンテナンスできる。

#宛先キャッシュ
OWAで何度かやり取りしていると、Office365側で自動で保持してくれる連絡先。

利用頻度or最後に送った宛先からソートして表示してくれてる（っぽい）
メールのヘッダー情報から自動的に表示名とか反映してくれる（っぽい）
基本的には便利。

メールアドレス間違ちゃった、でも保持してくれるし
先方で表示名がかわってもキャッシュした情報を保持してくれる（っぽい）

#宛先の表示名の保持先と、修正方法


M365管理センターで表示されているのと同じなら、おおむねグローバルアドレスリスト。
複数のユーザー、特にそのメールアドレスに送ったことがないユーザーの連絡先に表示されるなら、グローバルアドレスリスト。

管理者に言って、修正してもらう。

--

ほかのユーザーでは正常or表示されないなら、個人の連絡先か、宛先キャッシュ。
個人の連絡先で検索して表示されて、編集ボタンが表示されるなら、個人の連絡先。

ユーザーが自分で修正すれば解消する。


--

個人の連絡先で検索して「編集」ボタンがないときは、宛先キャッシュ。

宛先キャッシュから削除したい場合はOWAで宛先候補を表示した状態で、Deleteする。
ただし、宛先キャッシュから即時反映されるわけではない。
Deleteしたあと、一晩程度待ちましょう。

待てないときは、個人の連絡先に登録すれば、上書きされる。
どうも、ユーザーの連絡先のほうが、宛先キャッシュよりも優先れる仕様に見える。


#まとめ

複数のアカウントで検索してもすべて同じ結果が返ってくるならグローバルアドレスリスト。
そうでないならユーザーの連絡先か、宛先キャッシュなど、ユーザーのアカウントに関連で間違いない。

上記で切り分けすれば、解消できるはずです。
【Scrum】３匹の子豚レトロスペクティブをやってみた

# 3匹の子豚レトロスペクティブ
## 背景
最近、レトロスペクティブを楽しめていない。
KPTも飽きた。
けど、新しいメンバーが入ってきたから、基本のKPTに近い感じのことをしたい。

## ちなみに３匹の子豚とは
童話に出てくる、３匹の子豚です。
親に「家を立て1人で暮らすこと」というストーリーを与えられた子豚メンバー３匹が
それぞれインクリメントとしての自分の持ち家を立てる。
しかし、狼という難敵が現れた事により
「安全に住める家である」というDefinition of Doneがそれぞれで守れない話。
それぞれのAcceptance Criteriaである

* 家の材質はワラである(長男)
* 家の材質は木である(次男)
* 家の材質はレンガである(三男)  

を満たしたにも関わらず、狼という生き物の吐く息の強さを計算できず、レンガの家の豚以外悲惨な事になりました。

## ルール説明
1. それぞれの豚/家に今週の振り返りのアイディアを集める(付箋で書いて良い)
    * ワラの家の豚は「できてそうに見えるけど今にも失敗しそう」の例え
    * 木の家の豚は「だいたいイケてるけど、もっと改善ができる」の例え
    * レンガの家の豚は「強固に作られている」の例え
1. それぞれの豚に貼られた意見を共有する
2. それぞれに貼られた意見がどうすれば隣のより強固な物になるか、対策を考える
3. 考えた対策を優先順位付けし、次のスプリントの課題とする

※今後の動きとして考えている事
毎スプリント実施し、過去スプリントで出た意見を蓄積する事で
どんどん木の家、レンガの家に改善されていった付箋が溜まっていくはず
その溜まっていった付箋を見る事で、チームの成長を確認する
iPadだけでKaggleにチャレンジできるんじゃ？

個人的に、iPadで何かをすることが多く、コードもかけないかと色々試行錯誤をしていて
theiaで無理やりコーディングの環境を構築した流れで、Kaggle投稿の環境も作ってみました。

[「Pythonを使わずにKaggle タイタニック号乗客の生存予測モデルを作ってみる」](https://qiita.com/NierR/items/4e11c955fb2ed2c70bfb)の記事の通り、
せっかくGUIでKaggleに参加できたのでiPadでもいけるんじゃ？と思って試してみました。
ちなみに、この記事もiPadから書いています。



#コンペへの参加とファイルのダウンロード

タイタニックコンペにiPadから参加してみます。
iPadからKaggleにログインしてデータセットをダウンロードします。
＊ちなみに、コンペへの参加は省いていますが気になる方は↑の記事を参照してください。

![19C10267-5131-4A2C-A9C0-A9EB293EFBA5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15496/e6435139-202c-e997-f149-1208569f0d64.jpeg)


ダウンロードしたファイルは、iPadの「ファイル」アプリを開くとダウンロードフォルダに入っているので、解凍します。

#VARISTAで予測モデルを作る

Safariに戻り、VARISTAを開きます。
[VARISTAはここ。](Https://www.varista.ai/)

VARISTAを開いたら、プロジェクトを新規作成します。

ファイルは、先ほどダウンロードしたフォルダから「train.csv」を選択します。

![F15285C5-7CEE-499A-B5C9-F9A33115EA74.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15496/384eaeeb-d5fc-c389-5257-301ad4821bbb.png)

学習設定は前回の記事同様にレベル3、検証データの割合を5％、交差検証の分割数を10、ランダムシードを123にして学習を開始します。

![A1BFDD0A-10C8-4D2F-88E8-727FD73D5FC9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15496/7cf730ef-ee38-66c1-5491-b352f9c5985e.png)


学習が終わったら、モデルから「このモデルで予測」を選択して、削除する列を選択します。

![819D4EC8-A316-4559-B8C1-E9C55AC3031E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15496/9ad507bd-acec-f2cf-913b-0cacd018d866.png)

Submissionに必要な項目はPassengerIdとPredictedなので、それ以外は削除します。

![E58DD83C-16C8-4BEC-9845-ECB16091B426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15496/281bb1da-0ecb-5795-33a7-9e4199e20bb8.png)

あとは、予測する列の形式をフラグに変更します。

![0D8CF19F-C579-473C-8C83-FC4532281C25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15496/fb1f8e08-21f0-2fec-47e6-4ed5ead9ae6c.png)

続いて「test.csv」を予測ファイルとしてアップロードします。

![8C83D193-A554-4A46-855E-D0660964D8FE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15496/fab06ef6-d671-f888-9641-656446710c80.png)


予測が完了したら、ファイルをダウンロードして最後にKaggleにSubmitしましょう。

KaggleのSubmi Predictionをクリックしてブラウズからダウンロードしたファイルを選択します。
![A3920AE7-3CA5-4234-A359-9CA2A4A7C710.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15496/aa94bbf3-6d1e-6472-8db7-8126f5f40e9e.jpeg)


あとはMake Submissionをすれば完了です。
![CB3A036E-20AA-408A-A705-240FC819260B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15496/67097daa-37c6-d5f4-8d0e-6e7b4929359a.jpeg)


列の連結とかはできないので、numbersを使う必要がありますがデータの簡単な内訳などは見れるのでとりあえずは、簡易的に使うことができそうです。
さくっとデータの中身を見るにはいいかも。

![3E32D406-5348-4043-91D5-D9F202FE29A1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15496/7af64f69-b6c8-11a6-2d52-e408c4325209.png)

![3994A47A-FF25-4285-B424-4884077A9249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15496/2762faf6-ad35-7469-5ec9-cddbc2f612cd.png)

VARISTAは見た目がかっこいいのでいいですね。

---
参考

VARISTA: [https://www.varista.ai](https://www.varista.ai)
Kaggle: [https://www.kaggle.com](https://www.kaggle.com)
Nuxt.js(Vue.js)で良くある【Component template should contain exactly one root element. 】の対処法

Nuxt.js(Vue.js)で良くやってしまう【Component template should contain exactly one root element. 】の対処法です。
 
```
Component template should contain exactly one root element.
If you are using v-if on multiple elements, use v-else-if to chain them instead.
```
<img width="1128" alt="スクリーンショット 2020-06-09 10.58.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/38f3f121-a860-63d2-245c-1c6bfbbff108.png">

ビルド時に上記のエラーが出る時は`<template>`タグが原因です。

```vue
<template>
  <p>name</p>
  <input type="text">
  <p>email</p>
  <input type="email">
</template>
```
templateタグの中は一度全体を親要素で囲う必要があります。
上記のコードでは、親要素で囲わずに並列で書いてしまっているのでエラーになります。

```vue
<template>
  <div class="user">
    <p>name</p>
    <input type="text" />
    <p>email</p>
    <input type="email" />
  </div>
</template>
```
`div`タグで全体を囲むとエラーが解消されます。

nuxtやvueに慣れるまで良く出るエラーなのでメモとして残しておきます。
WordPressメモ

#WordPressとは
Webサイト（ブログ・ホームページ）を作成する、オープンソースのブログソフトウェアである。
=CMS(コンテンツ・マネジメント・システム)・・・Webサイトを作成・運営するための便利なソフトウェア

PHPで開発されており、データベース管理システムとしてMySQLを利用している。

▼世界のシェア
【2020年1月時点での世界のCMSシェア】　６２％
【2020年1月時点での日本のCMSシェア】　８２％

#特徴
プログラムを書かずとも、デザインの変更や機能の追加を行うことができる。

・テンプレート（テーマ）で、デザインを変更することができる。
・プラグインが豊富である。（セキュリティや、SEO，管理画面のデザイン変更など）

#AWSのEC2サーバで実際にワードプレスを使用する例
https://blog.codecamp.jp/wordpress-aws-ec2
【Scrum】Core-Scrumに書いてあるレビューの日本語訳(と言うか解釈してみた)のメモ

# Sprint Review
## 参考
[Core-Scrum](https://www.scrumalliance.org/ScrumRedesignDEVSite/media/ScrumAllianceMedia/Files%20and%20PDFs/Learn%20About%20Scrum/Core-Scrum.pdf)
## 概要
スプリントの最後に、スクラムチームとステークホルダーはプロダクトのインクリメントの結果をレビューする。
タイムボックスは1週間スプリント毎に1時間。(2週間スプリントの場合は2時間)

議論の焦点は「プロダクトのインクリメントがスプリント中に完成されているか」。
ステークホルダーは結果に対して重大な意思決定を行う。その意思決定は良いアイディアであり、スクラムチームの助けになるので、会議に出席させることが望ましい。
会議中には、チームの現在地や前進するためにどのように協力して行ったのかを見定める。全員がスプリントレビューでインプットがある。
最終的にはPOが今後の方針やプロダクトバックログの更新などの最終決定を行う。

開発チームはスプリントレビューを進めるために、下記のような共通のコンポーネントについて話す
* プロダクトインクリメントの概要
* プロダクトインクリメントのデモ
* 開発チームによるスプリント中の観察結果、思いついたプロダクトのアイディア
* プロダクトバックログの状態、完了可能日付、とその日時までに何が終わる想定か
* プロダクトバックログの更新
Qiita登録

# GitHubとの連携
入力テストも兼ねて記載。
QiitaにはGitHubとの連携があるようだが、GitHub自体をもっぱら使ったことない。
自宅でも業務でもSVNしか利用したことない
## 参考サイト
そんなGitHubって日本語説明ないからよく分からないっていう人（自分）が
検索をかけたら同じQiitaに載せている人~~いた。~~を、私同様に参照している方がいた。
こちらを参考
↓
[GitHub おじさん スターターキット](https://hoshimureinforcement.hatenablog.com/entry/2017/06/03/154749)

---
うん。面倒くさくなってきたので、また今度やろう。
といった感じで、参照先見つけたり何かしら解決した時などに記載していこう。
備忘録＆自分のように分からない事をGoogle検索かけてよくQiitaを見かける！って方（がいるかわからないけど）との共有用に残していきます。
　
　
あと、アウトプットの機会を増やすということで、頑張って続けていきたいです。

※PCのより再編集で前の投稿に戻した。スマホのSafari,Chromeからだとどうも「投稿する」が表示されない
[メモ]Web開発者のための大規模サービス技術入門の覚書

[Web開発者のための大規模サービス技術入門](https://www.amazon.co.jp/dp/4774143073/)を読んだ覚書。

- OSSでできる冗長化。
 - LVSとkeep alive。

- 負荷の確認。
 - まずはロードアベレージの確認。
  - 問題ない場合は、ソフトウェアの設定、不具合、ネットワーク、リモートホストを疑う。
 - CPU起因、I/O起因か確認する。
  - CPUに負荷がかかっているのはディスク、メモリーがボトルネックになっていないあるいみ理想的状態。
  - またはプログラムの暴走。

- OSの仮想メモリ機構。
 - ページごとにプロセスへ渡す。
 - ページキャッシュ。
  - OSは動かし続けた方がはやくなる。
  - メモリーが足りなくなった場合はLRUなのでDBも動かし続ければ負荷が減る。
  - DBサーバーをそのままスケールアウトしても、メモリにデータのらないので遅いまま効果あまりない。
  - メモリーを増やすか、データを分割してスケールアウトする。
  - データ量が物理メモリより小さくなるように。
  - メンテなどで再起動した場合、キャッシュなっていないので大量のI/Oが発生する。

- アクセスの種類で割り振るDBを変えることでキャッシュに乗りやすくする。
 - テーブルごとに分割。
 - ユーザーごとに分割。
 - ユーザー、クローラーで分割。
 - テーブル分割するとjoin出来なくなる。


- 圧縮。
 - バイナリ符号Visual Basic符号。
  - 符号化の方法でもデータ量を減らせる。
 - 数値を前の数値との差分で持つ。
ssh証明書

```
sudo openssl genrsa -des3 -out sample.pem -2048 -sha256
```

sha256方式で作成

```
sudo openssl req -new -sha256 -key sample.pem -out sample.csr
```

中身を確認

```
cat sample.csr
```
# 参考
https://qiita.com/nekakoshi/items/2b5d065a65f5e1017208
https://ex-cloud.jp/support/question/q-719
https://www.geotrust.co.jp/support/ssl/csr/apache_openssl_new.html

postfix でサーバー上でメールを受け取れるようにする。
https://dev.classmethod.jp/articles/ec2-postfix-local-delivery/

http://co-akuma.directorz.jp/blog/2010/03/postfix%E3%81%A7%E5%A4%96%E9%83%A8%E3%81%8B%E3%82%89%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E5%8F%97%E4%BF%A1%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/

https://hacknote.jp/archives/37497/

https://ikatakos.com/pot/programming/web_development/server/aws/postfix

```
sudo service postfix start
```
メールの確認
https://qiita.com/ayumi_imai/items/a773f7762355313ac3f2
git addを取り消すには

##git resetで、インデックスをHEADの状態へ戻す
ファイルを修正後、git addしたが、やっぱり取り消したいと思ったときは、git resetコマンドを利用します。

```
git reset HEAD
```

特定のファイルのaddだけを取り消したい場合は、ファイル名を指定します。

```
git reset HEAD [ファイル名/ファイルパス]
```
これはステージング情報の取り消しなのでファイルの変更内容そのものは残ります。
文字列を円形に切り取る


```index.html
<!DOCTYPE html>                                                                 
<html lang="ja">
<head>          
  <meta charset="UTF-8">
  <link rel="stylesheet" href="stylesheet.css">
  <title></title>
</head>         
<body>          
  <p>           
    Lorem ipsum Enim do velit exercitation fugiat cillum labore et dolore ad minim dolor amet tempor nisi sunt Excepteur voluptate laborum et Duis labore cupidatat officia laboris minim cupidatat sit ad incididunt dolor in nulla elit sint do sit aliqua eu ut irure commodo exercitation dolore consequat est laborum Duis in dolore esse est dolore voluptate amet fugiat cupidatat Duis proident consequat nostrud Excepteur ea minim nisi eiusmod sed amet irure id ut officia occaecat nisi elit velit qui aliquip adipisicing consequat adipisicing aute laboris do consectetur sit officia elit in tempor aute eiusmod nulla dolore non sint in fugiat adipisicing amet quis in velit sit sunt Duis culpa deserunt Duis sed elit veniam exercitation Ut pariatur magna et id esse dolor dolore aliquip et in cillum commodo commodo et quis veniam magna irure laborum commodo enim tempor dolore velit ut adipisicing consequat dolore enim sunt eiusmod irure aliquip Duis magna laboris non in aliquip magna dolor dolore nulla nisi proident cupidatat laboris eu commodo adipisicing adipisicing ut aliquip eu aute veniam sint magna mollit nostrud ut sed consectetur et tempor consequat nisi nostrud dolore et officia adipisicing labore id enim nisi reprehenderit sunt fugiat ea Ut dolore sed eu in id velit esse et est labore eiusmod culpa adipisicing quis ea consectetur ea fugiat in culpa magna do laboris.
  </p>       
</body>         
</html>
```
```stylesheet.css
p {
height: 400px;
width: 400px;
border: solid 10px black;
border-radius: 50%;
overflow: hidden;
}
```
Sourcetree経由でGithubに登録したSSHキーで組織下のリポジトリにアクセスできない

## 環境

```
macOS Catalina
10.15.4
```

## 課題

SourceTree使ってて、Github Organization以下のリポジトリをクローンしようとしてリポジトリが無いと言われる。

```sh
& git clone git@github.com:ruby-inc/hogehoge
Cloning into 'hogehoge'...
ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

一応SSHキーを確認する

```sh
ssh -T git@github.com
Hi fukmaru! You've successfully authenticated, but GitHub does not provide shell access.
```

パーソナルのリポジトリであれば、クローンできる。なんでー :sob:

## 解決方法

ssh-keygen から再度作成して、[ssh 🔑 ](https://github.com/settings/keys)の登録。

## 原因

このSSHキーはSourcetreeで、作成して登録していて、OAuth Appのアクセス制限により制限がかかっていて、パーソナルなリポジトリ（NOT Organization下のリポジトリ）のみアクセスできるように制限がかかっていた。（どういった条件でこれが発動するのかわからない・・・調査不足ですみません）

<https://help.github.com/ja/github/creating-cloning-and-archiving-repositories/error-repository-not-found>

> リポジトリが Organization に属し、OAuth App によって生成された SSH キーを使用している場合、OAuth App へのアクセスは Organization のオーナーによって制限されている可能性があります。 詳しい情報については、「OAuth App のアクセス制限について」を参照してください。
Chromium EdgeでWindows認証に失敗する場合の対処方法

### 現象

Windows認証が有効なASP.NETアプリケーションで以下の現象が発生した。

- Chromium Edge（またはGoogle Chrome）でアクセスすると、「Windowsセキュリティ このサイトにアクセスするにはサインインしてください」というダイアログが出る。
 - 有効なWindowsユーザー名/パスワードを入力し「OK」を押しても、再度同じダイアログが表示され、サイトにアクセスすることができない。
- 旧バージョンのEdgeやInternet Explorerでは問題なくアクセスできる。

### 対処方法

1. IISでアプリケーションの「Authentication」を開く。
2. 「Windows Authentication」を右クリックし「Providers」を開く。
3. 「Negotiate」を削除し、「NTLM」だけの状態にする。

なお、この操作によってWeb.configのsystem.webServer内に以下の設定が追加される。

```xml
<security>
    <authentication>
        <windowsAuthentication>
            <providers>
                <clear />
                <add value="NTLM" />
            </providers>
        </windowsAuthentication>
    </authentication>
</security>
```
IISで操作する代わりに、直接Web.configを編集し、この設定を追記してもよい。
【備忘録】Javascript : Symbol型について


## 概要
JavascriptのES2015から出現したプリミティブデータ型。
下記コードを見てもらうと分かるが、シンボルの実体は「唯一無二の何か」であり、
決して競合しないユニークなキーのようなもの。


```javascript.js

const sym1 = Symbol();
const sym2 = Symbol();

console.log(sym1 === sym2)  // false
 ```

※ Symbol型は初期化する際にnew演算子は不要

## 用途
Symbolは唯一無二なところからプロパティのキーとして使用し、使うメリットとしては名前の衝突などを防ぐことができるのだそう。
以下、使い方のコード例です。

### 1,プライベートメンバを定義する

```Javascript.js

const SECRET_PROP = Symbol();

class App{
  constructor(hoge,foo,secret){
    this.hoge = hoge;
    this.foo = foo;
    this[SECRET_PROP] = secret; 
    // シンボル型プロパティを定義する際には定義したいオブジェクトに対して[]をつける必要がある
  }

  checkValue(val){
    return this[SECRET_PROP] == val;
  }
}

let newApp = new App("hogehoge","foofoo","this is secret");

for (let key in newApp) {
  console.log(key); // hoge , foo => ただキーを参照するだけではSECRET_PROPを取得できない
}

console.log(JSON.stringify(newApp)); // {"hoge":"hogehoge","foo":"foofoo"} => Json文字列でも同様

console.log(newApp[SECRET_PROP]); // this is secret
console.log(newApp.checkValue("this is secret")); // true 
// => クラス内部のメソッドを使用するか、定数経由でアクセスすることが可能

```

### 2, 名前の衝突回避
下記のような使い方をすることで機能の拡張時に名前の衝突を避けられます。

```sample1.js

const sample = Symbol('sample');
Object.prototype[sample] = function(){
  return this.prop;
}

export {sample as default};

```

```sample2.js

const sample = Symbol('sample');
Object.prototype[sample] = function(){
  return "this is sample2"
}

export {sample as default};

```

```index.js

import sample1 from "sample1.js"
import sample2 from "sample2.js"

let obj = {
  prop: 'this is sample1'
}
console.log(obj[sample1]()); // this is sample1
console.log(obj[sample2]()); // this is sample2

```

上記のコードはモジュールを定義している`sample1.js`と`sample2.js`を`index.js`でimportしています。`sample1.js`と`sample2.js`には無名関数が同じ名前のプロトタイプ(`Object.prototype[sample]`)に代入されています。モジュールの要素はそれぞれ一つのみなのでこれらを`export default`しています。

もしシンボルを使っていないモジュールを複数インポートし、同じメソッド名を使っていたとしたら`index.js`でimportした際に後にimportされた`sample2.js`のメソッドで上書きされてしまいますが、一番最初に申し上げたようにシンボルは唯一無二のものとして使用が可能なので同じメソッド名で同じシンボル(実際は違う)を使ってもim上書きされずにすむ。

<br><br>
言葉だけじゃ伝わりにくいので上書きされてしまう例も載せます。下記参考

```sample1.js

Object.prototype.getProp = function(){
  return this.prop;
}

export {sample as default};
```

```sample2.js

Object.prototype.getProp = function(){
  return "this is sample2"
}

export {sample as default};
```

```index.js

import sample1 from "sample1.js"
import sample2 from "sample2.js"
// sample2のgetPropメソッドで上書き(Objectが何であろうと「this is sample2」としか返さない)

let obj = {
  prop: 'this is sample1'
}
console.log(obj.getProp()); // this is sample2
console.log(obj.getProp()); // this is sample2

```

### 3,互換性に対応する為
下記の記事がわかりやすいのでこちら[ECMAScript6にシンボルができた理由](https://qiita.com/naruto/items/312adeb6145eb6221be7#%E7%90%86%E7%94%B1%E3%81%AF%E4%BA%92%E6%8F%9B%E6%80%A7)の一読をお勧めします。

以上

## 参考
[ECMAScript6にシンボルができた理由](https://qiita.com/naruto/items/312adeb6145eb6221be7)
[JavaScript初級者から中級者になろう](https://uhyohyo.net/javascript/16_4.html)
[JavaScript互換性の要！Symbol（シンボル）について](https://analogic.jp/symbol/)
repo initでのエラー


# 事象
```
$ repo init
Downloading Repo source from https://gerrit.googlesource.com/git-repo
fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle
fatal: error unknown url type: https
fatal: cloning the git-repo repository failed, will remove '.repo/repo' 
```

# 原因（上記事象が出たときの要確認項目）
SSL関連の設定が悪さをしている可能性がある。

repoのコード（python）に以下を埋め込んだら、うまくいった。

```
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
```

```
$ repo init
Downloading Repo source from https://gerrit.googlesource.com/git-repo
remote: Finding sources: 100% (11/11)
remote: Total 11 (delta 2), reused 11 (delta 2)
Unpacking objects: 100% (11/11), done.
...
```
order_by('-created_at')←”ー”って何？？？【初学者が参考書片手にpython学習】

## はじめに
[大高隆・著「動かして学ぶ！Python Django開発入門」](https://www.amazon.co.jp/dp/B07YY5RDPC/ref=cm_sw_r_tw_dp_U_x_TCsYEbRH6SF0V)を使用して
python・Djangoの学習を始めた初学者です。

ruby・railsを使用して4ヶ月ほどプログラミングの勉強をしていましたが、
エンジニア転職にあたり、pythonを使用することになったのでこの本を片手に勉強を始めました。

ド級の素人なので、補足・ご指摘等コメントいただけると大変助かります。

## 概要
【参考書該当箇所】
Chapter11 08 日記一覧ページにページネーションをつける(Kindle の位置No.3995)リスト 11.11

【詰まった点】

```
order_by('-created_at')
```

'-created_at'のハイフンって何？？どういうこと？？

## 結果

昇順、降順を表すようです。
ASC,DISC族としては驚き。

↓昇順(古い日付→新しい日付)

```
order_by('created_at')
```

↓降順(新しい日付→古い日付)

```
order_by('-created_at')
```

## 参考文献
[大高隆・著「動かして学ぶ！Python Django開発入門」](https://www.amazon.co.jp/dp/B07YY5RDPC/ref=cm_sw_r_tw_dp_U_x_TCsYEbRH6SF0V)
VueでClipboardにコピーできるようにする


## やりたいこと
- VueでClipboardにコピーできるようにする

## 前提
- Vue 3.10

## 対応策
- 以下のパッケージを使用する
    - [vue-clipboard2](https://www.npmjs.com/package/vue-clipboard2)

## 手順
- インストール
    - `npm install --save vue-clipboard2`
- main.jsに以下を記載する

```js
import Vue from 'vue'
import VueClipboard from 'vue-clipboard2'

Vue.use(VueClipboard)
```
​
- Sample記述

```html
<div id="app"></div>
 
<template id="t">
  <div class="container">
    <input type="text" v-model="message">
    <button type="button"
      v-clipboard:copy="message"
      v-clipboard:success="onCopy"
      v-clipboard:error="onError">Copy!</button>
  </div>
</template>
 
```

```js
<script>
new Vue({
  el: '#app',
  template: '#t',
  data: function () {
    return {
      message: 'Copy These Text'
    }
  },
  methods: {
    onCopy: function (e) {
      alert('You just copied: ' + e.text)
    },
    onError: function (e) {
      alert('Failed to copy texts')
    }
  }
})
</script> 
```
- Sample2

```html
<div id="app"></div>
 
  <template id="t">
    <div class="container">
    <input type="text" v-model="message">
    <button type="button" @click="doCopy">Copy!</button>
    </div>
  </template>
 ```
 ```js
  <script>
  new Vue({
    el: '#app',
    template: '#t',
    data: function () {
      return {
        message: 'Copy These Text'
      }
    },
    methods: {
      doCopy: function () {
        this.$copyText(this.message).then(function (e) {
          alert('Copied')
          console.log(e)
        }, function (e) {
          alert('Can not copy')
          console.log(e)
        })
      }
    }
  })
  </script>

```
​
## 補足
- Cordova + Vue　のアプリでiOS、Android実機で動作を確認済み
APIGatewayでURLパラメータを必須チェックさせる

# URLクエリ文字列パラメータを設定する
「リクエスト本文」に作成したモデルを設定して必須チェックや妥当性チェックは元々やっていたがGETメソッドによる、URLパラメータはやったことがなかった。

URLパラメータの場合は「メソッドの実行」の「URL クエリ文字列パラメータ」でモデルを作成などは無く、そのまま指定するだけ。

![query.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653123/cfead71d-ca0e-fe8a-8ad2-e13d89318952.png)


開発者ガイドではこのように解説されている
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-request-validation-set-up.html#api-gateway-request-validation-setup-in-console
Railsを起動しようとするとRubyのバージョンエラーが出る。

###  <font color='lightblue'>背景</font>
ある日Railsを起動しようとすると、以下のエラーが発生しました。

```
[\W staff@term]rails s
Your Ruby version is 2.6.3, but your Gemfile specified 2.5.1
```

###  <font color='lightblue'>環境</font>
Rubyは変更後のバージョンになります。

| 項目              |               内容 | 
|:-----------------|:------------------:|
| OS.Catalina      |           v10.15.4 |      
| Ruby             |            v2.5.1 |  
| Ruby On Rails    |           v5.2.4.3 |       


###  <font color='lightblue'>内容</font>
**対応１）インストール出来るバージョンを確認し、指定のバージョンをインストールする。**

```
[\W staff@term]rbenv install --list
2.5.8
2.6.6
2.7.1
（省略）
[\W staff@term]rbenv install 2.5.1
```

**対応２）rubyバージョンを切り替える**
`cmd>rbenv local 2.5.1`

```
[\W staff@term]sudo rbenv versions    
  system
  2.3.1
* 2.5.1 (set by /Users/ichikawadaisuke/projects/krown/.ruby-version)
  2.6.3
```
上記の通り変わっているのに…

```
[\W staff@term]rails s
Your Ruby version is 2.6.3, but your Gemfile specified 2.5.1
[\W staff@term]ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin19]
```
なぜか。
ここから本題です。


**対応３）rubyの参照先を変更する。**
※実行する前に必ず、envコマンドで結果を控えておいて下さい。

```
[\W staff@term]which ruby
/usr/bin/ruby
```

`CMD>export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"`

環境変数が変更されていることを確認しました。

```
[\W staff@term]env
PATH=/Users/ichikawadaisuke/.rbenv/shims:~/.rbenv/shims:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
```
最後にruby環境をリセットします。
`CMD>eval "$(rbenv init -)"`

以下の通りに変更されて、railsも起動出来ました。

```
[\W staff@term]which ruby            
/Users/ichikawadaisuke/.rbenv/shims/ruby
[\W staff@term]ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin19]
[\W staff@term]
```

以上で対応は完了です。