OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】ファイルの文字コードを自動判定して変換する

「CSVファイルを開いたら変な風に表示されるんだけど（キレ気味）」

 という問い合わせを情シスやサポートチームの方は受けたことあります（断言）  
Windows環境のExcel（文字コード：Shift_JIS）で別のアプリケーションなどから出力されたCSVファイル（文字コード：UTF-8）を開いたために文字化けすることは"あるある"ではないでしょうか。

対処方法はいろいろあると思いますが、Pythonを学び始めたのでPythonで一気にファイルの文字コードを変更したいと思い調べたら、非常にわかりやすいコードがあったので備忘録として残しておこうと思います。


## やりたいこと
- Shift_JISのファイルからUTF-8のファイルに変換したい
- 自動的にオリジナルファイルの文字コードを識別したい


## バージョン
- Python 3.7.6
- chardet 3.0.4


## コード
```python
import os
from chardet import detect

srcfile = './sample_sjis.csv'
trgfile = './sample_utf8.csv'

to_codec = 'utf-8'


# get file encoding typ
def get_encoding_type(file):
    with open(file, 'rb') as f:
        rawdata = f.read()
    return detect(rawdata)['encoding']


from_codec = get_encoding_type(srcfile)

# add try: except block for reliability
try:
    with open(srcfile, 'r', encoding=from_codec) as f, open(trgfile, 'w', encoding=to_codec) as e:
        text = f.read()  # for small files, for big use chunks
        e.write(text)

    os.remove(srcfile)  # remove old encoding file
    os.rename(trgfile, srcfile)  # rename new encoding
except UnicodeDecodeError:
    print('Decode Error')
except UnicodeEncodeError:
    print('Encode Error')
```

参考：[How to convert a file to utf-8 in Python?](https://stackoverflow.com/questions/191359/how-to-convert-a-file-to-utf-8-in-python)


#### 備考1
冒頭の部分は自分が付け足しています。

```python
# srcfile：対象のファイルパス　trgfile：変換&生成されるファイルパス
srcfile = './sample_sjis.csv'
trgfile = './sample_utf8.csv'

# 変換後の文字コードを指定（今回の場合は、「utf-8」）
to_codec = 'utf-8'
```

#### 備考2

少し大きめのファイルであれば22行目のreadでチャンクを指定してあげてもいいと思います。どのくらいが適切なのかはまだ素人の自分にはわかりませんが...

`text = f.read()`

#### 備考3

こちらでは、古いファイルは削除されて、変換された新しいファイルを古いファイル名に変更していますね。もし両方を残しておきたい場合はコメントアウトしておくのがいいかと。

```python
os.remove(srcfile)  # remove old encoding file
os.rename(trgfile, srcfile)  # rename new encoding
```

#### 備考4

[参考ページ](https://stackoverflow.com/questions/191359/how-to-convert-a-file-to-utf-8-in-python)には他の方のコードもあるので、そちらも一見の価値があります！！

<br />

ではでは、よいPythonライフを！

<br />
PDO別ファイルから読み込み

PDOいまだによくわかってないけど
ひとまずこれで動いたよメモ

別ファイルから読み込み

```

------1-1.PHP
require_once("pdo.php");
$pdo=db("DBNAME");　//db名を引数として渡す
$sql ="select * from user";
$stmt= $pdo->query($sql);　//変数なし使用
$i =0;
foreach($stmt as $key => $val){
   $users[$val['id']] = $val['name']; //NAME[ID]にしたかった
   $i++;
}

--------pdo.php(db接続用)
function db($dbname){ //db名を引数として受け取る
        $dsn = 'HOST'.$dbname;'charset=utf8';
        $user = ''; //USER
        $pass = ''; //PASS
        //db接続
        try{
            $dbh = new PDO($dsn,$user,$pass,[
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            ]);
            return $dbh;
        } catch(PDOException $e){
            echo '接続失敗'. $e->getMessage();
            exit();
        };
   }

```
ブラウザバック時にイベントを仕掛けたい

## やりたいこと

ブラウザバック時にイベントを仕掛けたい

ブラウザの戻るボタンを押した時に何かしらのイベントを発生させたい。

## 調べてみる

`window.addEventListener`で`popstate`のイベントを呼べばいいらしい。

[JavaScriptで戻るボタンのイベントハンドラを実装する方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/22422)

## やってみる

同じ階層に下記の３つのファイルを作成。ページ１にページ２へのリンクを設定して、ブラウザバックをしてみます。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>最初のページ</title>
</head>
<body>
  <h1>page1</h1>
  <a href="./index2.html">next</a>
  <script src="./main.js"></script>
</body>
</html>
```

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>次のページ</title>
</head>
<body>
  <h1>page2</h1>
  <script src="./main.js"></script>
</body>
</html>
```

```jsx
window.addEventListener("popstate", (e) => {
  alert('back');
})
```

## 動かない・・・・

ChromeでもSafariでも確認しましたが、戻るボタンを押しても反応がない・・・。

## もう少し調べてみる

## Chromeとかのセキュリティ上の仕様らしい

[](https://11-30am.com/27/?utm_source=qiita&utm_content=article)

どうやら`historyAPI`(閲覧履歴とかの操作ができるAPI)を利用して行う操作がchrome側でブロックされているらしい。

[ブラウザバックをトリガーにしてイベントを発火させる方法](https://zenn.dev/k_kudo/articles/9b3633f4beb0b2)

[ブラウザの「戻る」ボタンをJavascriptで検知するイベント代替案](https://yutaihara.com/archives/512)

## jsを下記に変更してみる

`history.replaceState(null, null, null);`をjsのコードに追加します。

```jsx
history.replaceState(null, null, null);
window.addEventListener('popstate', function(e) {
  alert('ブラウザバックを検知しました。');
});
```

## ブラウザの戻るボタンをクリックしてみる

### Chrome

![127_0_0_1_5500_の内容_と_最初のページ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385211/91cdec96-54df-23e8-d429-56bd7ff47237.png)

### Safari
![次のページ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385211/19b2b29c-f8df-aee8-edb8-d260b5d1a74f.png)


**やった〜〜〜！ブラウザバック時にalertイベントを仕掛けることができました。**

## replaceStateって何？

☝ページを遷移した際に強制的に履歴を変更させる

そもそも**履歴の変更をブラウザが検知できなかった**ため、ブラウザヴバックの**イベントが発火されなかった**。そのため、`replaceState`や`pushState`で強制的に履歴を残すことで、履歴が変更されたことを検知させるようにすることらしい。

### `history.replaceState(stateObj, title, [url])`

[History.replaceState() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/History/replaceState)
Rust+Amethyst+VSCode+CodeLLDBでのデバッグが上手くいかない問題の解決


# 背景

`Amethyst`の`Pong`チュートリアルを`main`ブランチ`(v0.16.0)`でやろうとして、`cargo run`では動くのに`vscode`からは
`Error: Error { inner: Inner { source: None, backtrace: None, error: File(Os { code: 2, kind: NotFound, message: "No such file or directory" }) } }`
エラーを吐いて動かなかった。

# 原因

`utils::application_root_dir`の呼び出しで、`CARGO_MANIFEST_DIR`を参照する。バイナリを直接呼び出す場合、`CARGO_MANIFEST_DIR`が設定されないため、`Application::new`時にアセットのディレクトリを見つけるのに失敗する。

# 結論

`.vscode/launch.json`で`CARGO_MANIFEST_DIR`を設定すればよい。
以下ではついでに`RUST_BACKTRACE`も設定している。

```json:.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug executable 'pong'",
            "cargo": {
                "args": [
                    "build",
                    "--bin=pong",
                    "--package=pong"
                ],
                "filter": {
                    "name": "pong",
                    "kind": "bin"
                }
            },
            "args": [],
            "cwd": "${workspaceFolder}",
            "env": {
                "CARGO_MANIFEST_DIR": "${workspaceFolder}",
                "RUST_BACKTRACE": "1"
            }
        },
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug unit tests in executable 'pong'",
            "cargo": {
                "args": [
                    "test",
                    "--no-run",
                    "--bin=pong",
                    "--package=pong"
                ],
                "filter": {
                    "name": "pong",
                    "kind": "bin"
                }
            },
            "args": [],
            "cwd": "${workspaceFolder}",
            "env": {
                "CARGO_MANIFEST_DIR": "${workspaceFolder}",
                "RUST_BACKTRACE": "1"
            }
        }
    ]
}
```

# 参考

[Stackoverflow: How to run the executable with Rust and Amethyst](https://stackoverflow.com/questions/61409492/how-to-run-the-executable-with-rust-and-amethyst)
リバースプロキシ下のGitlabでgitlab-runnerを使う



私の環境では、SSL終端したリバースプロキシの下にGitlabを下げてある。
Gitlabにはgitlab-runnerという、CIで使うエージェントプログラムがあって、これを適当なマシンで起動しておくと、Gitlabからそのマシンにリポジトリを送り込んでCIを走らせることができる。

しかし、このgitlab-runnerはリポジトリのチェックアウト時に、外向け（つまりリバースプロキシのURL）を使ってチェックアウトしようとする。ネットワークの設定にもよるものの、私の環境では、内部ネットワークからの外向きURLへのアクセスに対してはリバースプロクシを経由せずに直接アクセスするようにパケットを転送している。このような状態でGitlabにアクセスすると、Gitlabはデフォルトで自己署名された証明書を用いるため、gitlab-runnerはSSL検証に失敗してしまう。
具体的には、リポジトリのチェックアウト時に `curl: (60) SSL certificate problem: unable to get local issuer certificate` と言われてしまう。

そこでgitlab-runnerに内部向けのURLを教える必要がある。
そのためには、`/etc/gitlab-runner/config.toml`に対して

```
[[runners]]
clone_url = "http://inner-addr-of-server.local"
```
などと書けば良い。
DXデータアナリスト各データ分析手法


#目的別の様々なデータ分析手法

![名称未設定のデザイン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/9db83818-f7f6-4e9a-8f4f-b49b18c7d1ec.jpeg)


##概要
ビッグデータとは経営上の意思決定や戦略、マーケティングに有用な膨大な量のデータである。
その膨大なビッグデータを分析する職として、データアナリストが存在するが、近年、人材不足が叫ばれる職種の一つである。
なので、分析スキルを身につけておくと他者との差別化人材になることはもちろん、事業においてもライバル企業に優位性をもった戦略を実行できるのである。
では、そのような需要が高いデータアナリストが用いる「分析手法」はどのような内容なのであろうか。

##各データ分析手法
####概要
統計学の基礎的分析手法である本分析手法。
二つのデータの差分は偶然か必然かを分析する際に用いられる。
##◼︎統計的手法
・カイ二乗検定
・t検定
・分散分析

#####概要
統計学の基礎的分析手法である本分析手法。
二つのデータの差分は偶然か必然かを分析する際に用いられる。

#####◼︎カウントデータの際に用いられる「カイ二乗検定」
「美容院に行く人の数」と「男女の数」が独立しているか相関があるかを検定する際などに用いられる。

#####◼︎連続値（平均値が抽出可能）の仮説を検証できる「t検定」
例年の漁獲量より多そうだという標本からくる仮説をもとに今年の漁獲高を例年と比べた検証する際に用いられる手法。

#####◼︎平均値の差を誤差か分析する分散分析
データの持つばらつきが因子（差を生みだした要因）によるものよりも実験誤差によるもののほうが大きいかを検定し、因子によるばらつきの方が大きければ、母平均に差があるとする検定手法として用いられる。

##◼︎代表的手法
・クロス集計
・ロジスティック回帰分析
・アソシエーション分析
・決定木分析
・クラスター分析
・主成分分析

#####◼︎クロス集計
オーソドックスな「THEデータ分析」である手法
クロス集計とは設問を掛け合わせることでデータを細分化することにより傾向を分析する方法を指します。そのため、相関関係や年齢ごとのトレンドなどポピュラーな傾向を把握することなどに長けている。
活用事例：アンケート集計仕、購買予測、世論調査

#####◼︎ロジスティック回帰分析
ロジスティック回帰分析はある事象の「有無」を確認して発生した目的変数と説明変数(目的変数を説明する変数)を関係式として分析して発生確率を分析する手法である。
発生確率を予測する分析手法なので広告の購買効果向上などに使用される。
活用事例：マーケティング、成功確率

#####◼︎アソシエーション分析
アソシエーション分析とはある対象の相関関係を分析する手法である。
マーケットバスケット分析はその一つとなり、買い物カゴに一緒に買われている商品を分析することにより、関連性がなさそうな商品が発見できれば隠れた相関が判明する。
活用事例：POSデータ、ECサイト、マーケティング、商品の関連性を表したレコメンド機能

#####◼︎決定木分析(ディシジョンツリー)
決定木分析とは目的変数(事象)”に影響したとされる説明変数(目的変数を説明する変数)を明確化して樹木状のモデル（ツリー上）を作成する分析手法である。
仮説のPDCAを繰り返して結果のパターンを何通りも予測を行う手法である。
活用事例：マーケティング、リスク管理

#####◼︎クラスター分析
クラスター分析とは多変量解析の一つであり混合したバラバラのデータから類似したデータをグルーピングする分析手法である。セグメンテーションにより分類することにより事象や属性の要因が分析できる。
　活用事例：セグメント分析、企業ブランディング構築


#####◼︎主成分分析
主成分分析は、説明変数をある程度集約させて少数の要因に集約させることである。データを分析させるためにデータを集約化することでり、企業の事業収益が部署ごとに6パターンある場合にA,Bと集約させることである。また、主成分分析はデータの属性で類似性のあるものを集約する。
活用事例：セグメント分析、商機分析、ブランディング


###別段
####RFM分析
小売企業やPOSデータの活用で使用される「RFM分析」はダッシュボード開発で使用される分析手法であり非常に使用する頻度が高い。
Recency<最新購入日>
Frequency<購入頻度>
Monetary<購入金額>
3つの指標で顧客を分類する手法
活用事例：優良顧客抽出、販売促進

以上
【2021年最新版】circleCI2.1 Ruby3.x + Rails6.x + MySQL8.x RSpec〜rubocop【M1Mac】

# はじめに
ずっと前に作ったcircleCIちょっといじったら動くかなってやってみたら全然動かなかったのでいっそ作り直してみた。
定期的にメンテというか動かしてみるのは大事だなと。
100行くらい短くなったのでテンション上がった。
# 実践！
## 動作環境
```
M1 Mac
ruby 3.0.1
Rails 6.1.3.2
Bundler 2.2.19
```
rubocopとRSpecはすでに導入しているものとする。

```ruby
group :development do
  gem "rubocop-rails", require: false
  gem "rubocop-rspec", require: false
end

group :test do
  gem "rspec_junit_formatter"
  gem "rspec-rails"
end
```
## 公式と同じことすればOK
https://circleci.com/developer/orbs/orb/circleci/ruby#usage-ruby_rails_sample_app
## Dockerイメージのバージョン一覧
### Ruby
https://circleci.com/developer/images/image/cimg/ruby#image-tags

```
# バージョン選び方
cimg/ruby:3.0.1-node-browsers
cimg/ruby:3.0.1-node
# だとchromeとかxvfb入ってない
cimg/ruby:3.0.1-browsers
# だとnodeとかyarn入らない
```
### MySQL
https://circleci.com/docs/ja/2.0/circleci-images/#mysql
## 全体像
**.circleci/config.yml**

```
version: 2.1

orbs:
  ruby: circleci/ruby@1.1.3
  node: circleci/node@4.5.1

jobs:
  build:
    docker:
      - image: cimg/ruby:3.0.1-node
    steps:
      - checkout
      - ruby/install-deps
      - node/install-packages:
          pkg-manager: yarn
  test:
    docker:
      - image: cimg/ruby:3.0.1-node
        environment:
          RAILS_ENV: test
      - image: circleci/mysql:latest
        command: mysqld --default-authentication-plugin=mysql_native_password
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: true
    environment:
      BUNDLE_JOBS: "4"
      BUNDLE_RETRY: "3"
      BUNDLE_PATH: vendor/bundle
    steps:
      - checkout
      - ruby/install-deps
      - node/install-packages:
          pkg-manager: yarn
      - run:
          name: Watting stand up database
          command: |
            dockerize -wait \
            tcp://127.0.0.1:3306 -timeout 1m
      - run: mv ./config/database.yml.ci ./config/database.yml
      - run:
          name: Database setup
          command: |
            bundle exec rails db:create db:migrate db:seed
      - ruby/rspec-test
      - ruby/rubocop-check

workflows:
  build_and_test:
    jobs:
      - build
      - test:
          requires:
            - build
```
コード自体はこれでいいのだが、このまま動かすとエラーになる。
## エラー対策
### x86_64-darwin-20⇨x86_64-linuxにせよ！
```
Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform
is x86_64-linux. Add the current platform to the lockfile with `bundle lock
--add-platform x86_64-linux` and try again.
```
これDockerのときも同じようなエラーになったんだよな〜。
M1Macだからかなって思ってたけどBundler 2.2.x以降でエラーになるっぽい。

[参考記事](https://www.autovice.jp/articles/150)

Dockerみたいに`platform: linux/amd64`と記述すると`platform`のキーなんて存在しないって怒られる。

gemfile.lockのplatformのところにx86_64-linuxを追加してあげることで解決

```
$ bundle lock --add-platform x86_64-linux
```
できればcircleCIのconfig.yml内で解決したかったが。。。

### rails6からyarnをインストールせよ！
```yml
- node/install-packages:
  pkg-manager: yarn
```
これを記述してあげてyarnをインストールするようにする。
↑のコードはすでに記述済み

nodeが必要になるのでdockerイメージのバージョン選びはこれのどちらかが無難じゃなかろうか。

```
cimg/ruby:3.0.1-node-browsers
cimg/ruby:3.0.1-node
```

これでOKさ！

# おわり
なんか試行錯誤してたら153行だったのが53行になった！
前が無駄な部分が多すぎたのかもしれない。
`orbs`とか使ってなかったし。
rspecとrubocopの記述が2行でいけるのがびっくり。
ここまで行き着くまでいろんなサイト見てきたけどやっぱ公式が最強だった。
結構沼ったけどうまくいって最後まで通るとやっぱ嬉しいよね〜。
Fatal error: Uncaught PDOException: SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected inにハマった話

```php
<?php

// DSN(データソースネーム）
const DB_HOST = 'mysql:dbname = test_php; host = 127.0.0.1; charset = utf8';
const DB_USER = 'php_user';
const DB_PASSWORD = 'password';

try {
    $pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD,[
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
    ]);
    echo "DBに接続されました";

} catch(PDOException $e){
    echo "DBに接続されていません". "<br>". $e->getMessage();
    exit();
}

$sql = 'select * from contacts where id = 2';
$stmt = $pdo->query($sql); 
$result = $stmt->fetchAll();

var_dump($result);
```
実際に画面を表示してみると「DBに接続されました」と表示されているのに
最後のvar_dumpの出力結果では下記のエラーとなる。

```php
Fatal error: Uncaught PDOException: SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected in
```
・・・なんでだ？？
イロイロ調べた結果、DSNが間違っているのではないかとのこと。
じっくりじっくり調べてもスペルミスではなさそう。。。うーーん :sweat_smile:

【結論】 やっぱりDSNの記述が間違っていた！！！
dbnameの前後にスペースを入れるとスペースも認識されてしまうため、スペースがあるとエラーになるらしい！
あとhostは「127.0.0.1」よりも「localhost」の方が好まれる？みたい。。。
以上、自分用備忘録 :writing_hand_tone1:

```php
//NG（スペースあり）
const DB_HOST = 'mysql:dbname= test_php; host = 127.0.0.1; charset = utf8';

//OK(スペースなし）
const DB_HOST = 'mysql:dbname=test_php;host=localhost;charset=utf8';
```
Firebase Functions トラブルシューティング


# ログに依存パッケージがインストールされていない旨のエラーが表示される。
エラー表示
`Did you list all required modules in the package.json dependencies?`

### エラー解消方法
Functions用のディレクトリで対象のパッケージをインストールする。

### 原因
プロジェクト用のパッケージpackages.jsonとFunctions用は別ファイルで管理されているため、Functions用で別途インストールする必要がある。
Laravelにてidの値を取得できない

Laravelのモデルidに文字列を使うとidを取得した際にidの値が0になる。

```sql:test_model
CREATE TABLE `test_model` (
  `id` varchar(5) NOT NULL,
  `user` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
COMMIT;

INSERT INTO `test_model`(`id`, `user`) VALUES ('id1','user1');

```

TestModelを作成

```php5
php artisan make:model TestModel
```
```php5:TestModel
class TestModel extends Model
{
    protected $table = 'test_model';
}
```
```php5
>>> $obj = TestModel::first();
=> App\Models\TestModel {
     id: "id1",
     user: "user1",
   }
>>> $obj->id;
=> 0
```

モデルに以下を追加するとidが正常に取得できる。
```
public $incrementing = false;
```
Ruby で Google Calendar 情報を読み出す

# TL; DR

 - Google Calendar のイベントを Ruby プログラムから読み出す方法を書きました。IoT ガジェットなどの自作に便利かと思います。
 - [公式 Quick Start](https://developers.google.com/calendar/api/quickstart/ruby) は人間が介在する OAuth2 のやり方だけど、ようはこれの無人版です。あと、この公式ドキュメントは `single_events` パラメタを指定してないので動かない(バグ持ちの)はずです。
 - サービスアカウントというものを作って、それに必要な権限を与え、そのアカウントの秘密鍵を使ってアクセスします。

# カレンダーの準備

既存のものもしくは新規作成した Google Calendar の ID をメモします。IDは設定 &gt; マイカレンダーの設定 から確認できます。

# プロジェクトとサービスアカウント

各種ドキュメントを操作するには当然権限が必要です。プログラムから操作する場合は、大雑把に言って2とおりの権限獲得の手法があります。

 - 一時的に人間の許可を得て、その人間のアカウントで操作
 - 権限を与えられた **機械ようのアカウント** で操作
 
ざっくり言うと前者はインタラクティヴなソフトで使う方法で、後者は自動化システムで使う方法です。今回は後者の方法を使います。ここで「機械ようのアカウント」を [**サービスアカウント**](https://cloud.google.com/iam/docs/service-accounts?hl=ja)と言います。つまり、まずはサービスアカウントを作り、必要な権限を与える必要がります。だいたい以下の手順です。

 1. [GCPのコンソール](https://console.cloud.google.com) に行って、プロジェクトを作ります。
 2. GCPの左上のハンバーガーメニュー > [IAMと管理](https://console.cloud.google.com/iam-admin) > サービスアカウント > サービスアカウントを作成
 3. 入力は必須項目だけで良いと思います。`name@project.iam.gserviceaccount.com` というアカウントができます。
 4. アカウントを作ると秘密鍵 (private key) をダウンロードできると思います。JSON形式でダウンロードしてください。
 5. **このアカウントに対して**、カレンダーの権限を与えてください(=共有してください)。与え方は通常の人間向けの権限操作といっしょです。
 6. ハンバーガーメニュー &gt; APIとサービス &gt; ライブラリ からカレンダーAPIを有効化してください。

# パッケージのインストール

たぶんこれだけでいいはず。

```shell
$ gem install google-apis-calendar_v3
```

# コード

直近の10個のイベントを取得して標準出力に開始時刻と概要を出力します。

```ruby
# coding: utf-8
require 'google/apis/calendar_v3'

KEYFILE = "ダウンロードした鍵.json".freeze
CALENDAR_ID = "「マイカレンダーの設定」にあるID".freeze

service = Google::Apis::CalendarV3::CalendarService.new
service.authorization = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: File.open(KEYFILE),
  scope: Google::Apis::CalendarV3::AUTH_CALENDAR_READONLY,
)

resp = service.list_events(
  CALENDAR_ID,
  max_results: 10,
  order_by:    :startTime,
  time_min:    DateTime.now.rfc3339,
  single_events: true,  # これがないと order_by を "startTime" にできない
)

resp.items.each {|event|
  # 全日の予定は DateTime じゃなくて Date になる
  start = event.start.date_time || event.start.date
  puts "%s %s" % [start, event.summary]
}

```
エンジニアとして働くうえでオススメされたやり方＆ツール

##　はじめに
今回は転職して初めて案件に携わった時先輩エンジニアからオススメされた＆こうしたらよいというアドバイス等をアウトプットしていこうと思います。

よろしくお願いします(｡･ω･)ﾉﾞ
## ブックマークのやり方
まずブックマークのやり方なのですが、最初はそんなことせんでもできるわ！と思ってました。
ただ集めた資料や検索したサイトを管理するにはこのやり方でやるとそこまで辿るのも早いし、整理整頓されて良いとアドバイスを頂きました。
↓こんな感じ
![スクリーンショット 2021-06-19 153512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/bdbcc456-de85-c485-9496-047bb0361b29.png)
このようにフォルダで管理してまたその下にフォルダを作って各種サービスで別けるというやり方でやると整理整頓できるしスッキリしてめちゃいいです。
まだ僕も整理整頓できてない部分はありますが、気づいた点が２つあります。
　
#### ❶その他フォルダを禁止
　僕のを見ると右のほうにありますがあれは完全に仕事とは別のプライベートのブックマークなので気にしないでください。
　あくまで仕事上で使う場合その他フォルダがあると**とりあえずその他フォルダに入れとこ**ってなるので折角整理整頓のためにしてるのに元も子もありません。

#### ❷「後で整理しよ」禁止令
　その他フォルダ禁止と被る部分がありますが、後でやろうっとなると人間やりません（笑）
　掃除と同じですね！！あとでまとめてやるのではなくて今やりましょ！

##　オススメサイト
１：[ネーミングサイト](https://codic.jp/engine)
最近はAWSばかり勉強してるのであまり使う機会はないのですが、このサイト良い感じにネーミングを作ってくれます！！

現在オリジナルアプリケーションを作成または構成を練ってる方にお勧めできるかなと思います！![スクリーンショット 2021-06-19 161139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/3b1df5b8-2dd8-851a-e613-cd338e032402.png)


２：[SlideShare](https://www.slideshare.net/)
Slideshareとはスライドショー形式で資料を公開できる無料サービス！個人や企業だけでなく、米国ホワイトハウスのような政府機関も利用しており、1千800万以上ののスライドが公開されています。
スライドの閲覧・公開は無料であり、気軽な資料公開が可能なのが特徴です。
このサイトの凄い所はこんなん見てもいいの！？っていうプレゼンの資料やドキュメントが転がってます笑
僕の場合は案件でDB設計に携わった際にER図や設計の考え方など色々検索してこんなん無料で見てもいいのかよと思いながら見てました。
![スクリーンショット 2021-06-19 161205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/4c93332a-2666-7941-b6d7-f1aeb3f26ee8.png)


３：[pinterest](https://www.pinterest.jp/)
　平たく言うとGoogle検索のイラストバージョン！！
僕はあまり活用できなかったのですがWeb制作の方は知ってる方も多いし実際に活用されている方も多いと思います！
実際にチラシとか検索してみると色んなデザインのチラシとかが出てくるので、WordPressコースの方々にはオススメできるんじゃないかと思います！！
![スクリーンショット 2021-06-19 161229.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/5831f25c-6f32-2893-c380-6796f59ceac9.png)


４：[翻訳ツール](https://www.deepl.com/translator)
Google翻訳より的確に翻訳してくれると個人的には思ってます！
・・・まぁそれだけですね
![スクリーンショット 2021-06-19 161249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/35856c78-023e-91a1-5605-44996b26ca2c.png)


５：[SQL Fiddle](http://sqlfiddle.com/)
Web上でSQLコマンドをうつことができるサイトです！
実際にデータベースを起動しないでもこれを使えば簡易的にデータベースを構築したりすることができます！
ただ本番環境で動かす！ってやつは実際に本番環境と同じようにしたほうが確実です！！（経験者は語る）あくまで練習用って感じです。
![スクリーンショット 2021-06-19 161309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/6e490f8c-9eeb-8bd6-fcd4-419f196e020e.png)


## 最後に
まだまだ駆け出したばかりなので、こんなの知ってて当り前だろ！とか言われるかもしれません💦
見ていただきありがとうございました！！！！！！！

(｡･ω･)ﾉﾞバイバイ
FileMakerにMBSプラグインを入れてみた(MAC)

# 誰のための記事か
- 開発効率を上げたいすべてのFileMaker開発者

# 何をするか
- MBS　Plugin(https://www.monkeybreadsoftware.com/filemaker/) を入れる。

# 概要
1. MBS Pluginとは何か
1. MBS Pluginの使い方

# MBS Pluginとは何か
>MBS Plugin is easily the most powerful plug-in available for FileMaker today. There are over 6,500 functions that allow FileMaker developers to extend their solutions in some amazing ways. Each function does a little task and in their combination you can unleash the full power of our plugin. MBS Plugin support FileMaker Pro, Server (Scheduled Scripts, WebDirect & PSoS), Runtime, Cloud for AWS, Linux Server and the FileMaker iOS SDK. To learn how to use them together, please check our reference and our more than 600 example databases.     (公式サイトより)
 
↓DeepLで翻訳
>MBSプラグインは、現在入手可能なFileMaker用プラグインの中で最もパワフルなものです。6,500以上の関数があり、FileMaker開発者は自分のソリューションを驚くべき方法で拡張することができます。それぞれの関数はちょっとした作業を行い、それらを組み合わせることでプラグインのパワーを最大限に発揮することができます。MBS プラグインは、FileMaker Pro、Server (Scheduled Scripts, WebDirect & PSoS)、Runtime、Cloud for AWS、Linux Server、および FileMaker iOS SDK をサポートしています。併用方法については、リファレンスや600以上のサンプルデータベースをご確認ください。

　ということで、FileMaker開発をとっても快適にしてくれる道具です^^
 
# MBS Pluginの使い方
## 1. MBS Pluginをダウンロード
公式サイトより使用になられるOSのプラグインをダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184509/0386aff4-e1d7-196e-f6d7-92e565f11608.png)


## 2. FileMakerに設定
### Macの場合
1.  ダウンロードしたディスクファイルを開きPlugin for Macフォルダを開いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184509/eeb97526-7c7c-5033-adb7-157803f91f5e.png)
2. 中に入っているMBS.fmpluginをコピーしてください。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184509/6dbbc915-a8f9-a6f4-d261-dd1365e92bcc.png)
3.  FileMakerフォルダの下にあるExtensionsフォルダに「MBs.fmplugin」をコピー
パスは環境によって変わりますが、ライブラリ→Applicatin Support→FileMaker→Extentionにコピーしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184509/4d0554b7-21bf-408e-8161-47d4b2d4920d.png)

4. FileMakerを開いてみてください。
設定は以上で完了です。計算式フィールドのオプションを開くと、いろんなものが追加されていますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184509/3a368ac4-78be-ca73-37b3-13bf744d68a3.png)

# 使用例
## 計算フィールドのオプションを開いてみよう
なんと計算結果がその場で確認できる.「Execute」をクリックしてみよう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184509/3a368ac4-78be-ca73-37b3-13bf744d68a3.png)
## スクリプトワークスペースが見やすくなってる
スクリプトワークスペースを開くと、そこはまるでモダンコードエディタのよう
シンタックスハイライトに検索機能。感動ですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184509/0a404e31-3678-1465-c3b6-8c4ed741e15f.png)

## リレーショングラフを検索できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184509/a7061790-5f3b-f49f-6896-f92ccdaeeeb7.png)

# まとめ
などなど紹介し切れないほどの機能が充実しています。https://www.monkeybreadsoftware.com/filemaker/
しかも試用無料。。。。。。。。。。。


是非お試しあれ！
[Ruby] AtCoder Beginner Contest 205  C問題

##はじめに
AtCoder Beginner Contest 205のC問題を解いてみました。
様々な答えはあるかとは思いますが、自分の回答を説明していきたいと思います。
問題文は下記リンクから飛んで確認してください。
それではよろしくお願いします！

https://atcoder.jp/contests/abc205/tasks/abc205_c


##問題C-POW


```Ruby
a, b, c = gets.split(" ").map &:to_i
```

まず1行目。a, b, c それぞれに入力された値が順番に受け取れるようにします。
この問題はaもbも、共通してcの数だけ累乗されます。なのでわざわざ計算する必要なく、単純にaとbどちらが大きいかをif文で条件分岐し、適切な出力ができるようにしてやれば問題ないです。

```Ruby
a, b, c = gets.split(" ").map &:to_i
 
if a < b
  puts "<"
elsif a > b
  puts ">"
else
  puts "="
end
```

しかしこれでは問題があります。aとbはマイナスの値も入力される可能性があるので、例えば上記のif文だと
-7 5 2
と入力されたら、bの方が数が大きいので"<"が表示されますね。

しかしながら、この問題はcの数、累乗したらどちらが大きいかを比べないといけないものなので、この例だと本当は
-7 × -7 = 49
5 × 5 = 25 
なので">"と出力されなければ不正解なのです。
つまりcが偶数だと、累乗された時にプラスになるのでこのif文では不十分なんです。

なのでeven?メソッドを使用してcが偶数かどうかを調べます。
もし偶数だった場合はabsメソッドをaとbに使用し、絶対値に変換する処理をします。
そうすることで、もし片方がマイナスで累乗するとその数の方が大きくなるという結果になっても、aとbを比べるだけで適切な出力結果を得ることができます。

先ほどのif文の前に下記のようにもう一つ処理を加えて完成です。

```Ruby
a, b, c = gets.split(" ").map &:to_i
 
if c.even?
  a = a.abs
  b = b.abs
end
 
if a < b
  puts "<"
elsif a > b
  puts ">"
else
  puts "="
end
```

##最後に
もし、この方がわかりやすい！とか、こんな方法でも解けた！とありましたらコメントにて知らせていただけると幸いです！
ありがとうございました！
PDOクラスのqueryメソッドについて勉強してみた

# PDOクラスとは
PDOは PHP Data Object の頭文字をとったもので、
データベースに接続するための機能

# queryメソッドとは
データベースに接続した後、SQL文を発行してデータを取得するが、
queryメソッドではSQL文に変数を割り当てずに（POST,GETなどで取得した値によって動的に処理せずに）固定ページなどにデータベースの値を取得したいときに用いる関数。
返り値はPDOStatementオブジェクトとして返ってくるので、値を取り出すにはPDOStatementクラスで用意されているfetchを使う必要がある。

```php
$sql = 'select * from samples where id = 1';
$stmt = $pdo->query($sql); //$sqlに格納したSQL文が実行される
$result = $stmt->fetchAll(); 

/*
$stmtには返り値としてPDOStatementオブジェクトが入っているので、
PDOStatementオブジェクトにあるfetchAllメソッドでSQL文の結果をとってくる
*/
```

# fetch（フェッチ）で値を取り出す
fetchを直訳すると読み込む、取ってくるという意味がある。
頻繁に使われるのは以下の２つ。
① fetch : 該当データを一行返す
② fetchAll : 該当データを全て配列で返す

【結論】queryメソッドは非変数のSQL文を実行して、その実行結果をPDOStatementオブジェクトとして返す関数
【Ruby】to_i メソッド便利すぎ。共有したい。

## はじめに

Rubyエンジニアであれば一度は使ったことがあるであろう`to_i`メソッドが想像以上に便利だったので共有します。

## to_i メソッドって？

レシーバーの型によりますが、ざっくり整数を返してくれるものです([公式リファレンス](https://docs.ruby-lang.org/ja/))。

```
# レシーバーがString
# 文字列を 10 進数表現された整数であると解釈して、整数に変換します。
"1000".to_i
=> 1000

# レシーバーがFloat
# 小数点以下を切り捨てて値を整数に変換します。
1000.5.to_i
=> 1000

# レシーバーがInteger
# self を返します。
1000.to_i
=> 1000

# レシーバーがTime
# 起算時からの経過秒数を整数で返します。
Time.local(2021,1,1).to_i
=> 1609426800
```

ざっと基本的な使い方でした。ここから便利な点を挙げていきます。

## 空文字でもへっちゃら

空文字の場合は`0`を返します。
中身があるかないかを気にしなくていいので、地味ですがストレスフリーです。

```
"".to_i
=> 0
```

## 変な文字列でもへっちゃら

数値に変換できない文字列に対しても`0`を返します。
そのため、`"00001"`のような0埋めの文字列コードに対する簡易的なチェックができます。

```
"hogehoge".to_i
=> 0

"00001".to_i
=> 1

# (例)数値変換できるかで簡易的なチェックを行いたい
def check_code(code)
  if code.to_i != 0
    p "ok"
  else
    p "invalid"
  end
end

check_code("010000")
=> "ok"
check_code("hogehoge_dayo")
=> "invalid"
```

**注意**

[公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/String/i/to_i.html)にあるように、`整数とみなせない文字があればそこまでを変換対象とする`ため、`10hogehoge`のようなものは数値変換されてしまいます。あくまで簡易的なチェックですね。

```
"10hogehoge".to_i
=> 10
```

## nilでもへっちゃら

nilの場合は0を返します。これがすごいうれしい。
例えばレシーバーが`nil`になるかもしれないときでも、`to_i`メソッドで回避できちゃいます。

```
# (例) hours = minutes / 60

# minutesに数値が入ってればもちろん問題ない
minutes = 60
hours = minutes / 60
=> 1

# minutesがnilだとエラー出る
minutes = nil
hours = minutes / 60
=> NoMethodError: undefined method `/' for nil:NilClass

# ここで to_i メソッドの登場。有能すぎ。
minutes = nil
hours = minutes.to_i / 60
=> 0
```

nilクラスに対する`NoMethodError`を回避するだけなら`&.`でいけますが、数値計算させたいとなるとnilでは困るので0に変換してくれるのは使ってみるとすごい助かります。

# おわりに

簡単にはなりますが`to_i`メソッドを共有しました。
個人的には最後に紹介した数値計算との相性がすごい良くて感動しました。
ありがとう.to_i => 0
terraformでlocal変数をvariables変数のように使う

- localだとvar.envとかで呼んだりできる
- variablesを定義しなくてよくなる

## コード

```tf
provider "aws" {
  region  = "ap-northeast-1"
}

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.36.0"
    }
  }
}

locals {
  variables = {
    development = local.development
    production  = local.production
  }

  variable = local.variables[terraform.workspace]

  development = {
    cidr_block = "10.0.0.0/16"
  }

  production = {
    cidr_block = "10.1.0.0/16"
  }
}


resource "aws_vpc" "main" {
  cidr_block = local.variable["cidr_block"]

  tags = {
    Name = "${terraform.workspace}-vpc-main"
  }
}

```

## development

```bash
terraform workspace new development
terraform workspace select development
terraform init
terraform plan
```

## production

```bash
terraform workspace new production
terraform workspace select production
terraform init
terraform plan
```
Sequel Ace触ってみた

#Sequel Ace
Sequel Proを触ってみようと思ったら、 MySql8に対応していないとか、ゴニョレバ動かせるけど...とのことで、後継(?)のSequel Aceを触ります。危ないところだった。

https://github.com/Sequel-Ace/Sequel-Ace

## 環境構築
詰まることなく完了。
### インストール
[公式の手順](https://github.com/Sequel-Ace/Sequel-Ace#homebrew)にそっていけばOK。

```
// 今回はbrewでインストール
brew install --cask sequel-ace
```

### 起動
Dockerで起動したmysql(ver 8.0.25)に接続。 
![スクリーンショット 2021-06-19 14.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218211/5d65077d-b2cf-2466-3135-26fa6b003388.png)

### .sqlのimport & 触ってみる
今回はモックのsqlデータを http://filldb.info/ で作成する。生成した.sqlをfile > Importから読み込めばOK。

内容のタブ（下記図）からレコードの編集、追加、削除ができる。
![スクリーンショット 2021-06-19 14.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218211/fd2528af-c796-776e-f00f-7a8b852be1af.png)

クエリ実行のショートカットは⌘+R。(参考: [ショートカット集](https://sequel-ace.com/shortcuts.html))。
StoryboardでScrollViewとVerticalStackViewを使用して縦スクロール画面を作る

# 環境
* macOS: BigSur 11.4
* Xcode 12.5

# 手順

1. ScrollViewを親Viewに追加する[^1]
![firststep.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287345/2ff31df6-e034-d872-ead3-989f3ba8025c.gif)

2. ScrollViewに親Viewとの制約(上下左右0)をつける[^2]
![secondstep.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287345/e332fffe-a78e-59b7-15a6-764d23c1518f.gif)

3. VerticalStackViewをScrollViewに追加する
![thirdstep.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287345/1de18615-491e-f9b7-c77b-289769fc5342.gif)

4. VerticalStackViewにScrollViewとの制約(上下左右0)をつける[^3]
![fourthstep.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287345/a7cc8534-7142-915a-b0c6-bf2effcf413c.gif)

5. VerticalStackViewに["Horizontarlly in Container" = 0] の制約をつける
![fifthstep.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287345/d3e477c1-5420-853b-6ad6-3e5043f78c8e.gif)

6. コンテンツを表示するView(以降、"ContentView"と記載)をVerticalStackViewに追加する
![sixthstep.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287345/11ab94f3-bf11-6450-072f-4dc4260b3f77.gif)

7. ContentViewの高さを確定する
![seventhstep.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287345/509c92d4-5a78-083f-2cf9-8c13085a0bbe.gif)

8. 表示するコンテンツの数の分、高さの確定したContentViewをVerticalStackViewに追加する
![eighthstep.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287345/39453a72-0428-092e-34f5-0be4aff5e4c3.gif)

9. 完成

[^1]: ScrollViewはナビゲーションエリアから親Viewに追加できないので注意
[^2]: 今回は大元のViewにScrollViewを追加したので、制約はSafeAreaにつける
[^3]: FlameLayoutGuideがデフォルトの制約紐付け対象になっているので、ScrollViewに切り替える
AtCoder用スクリプト作成ツールを自作してみた



最近競技プログラミングにハマっており、AtCoderのコンテストに参加したり過去問を解いたりしてアルゴリズムの勉強をしています。問題ごとにスクリプトを準備するのが結構めんどくさかったので、自動化してみました。atcoder-toolsを使えばファイル作成だけでなくテストや提出の自動化もできるのですが、私の環境では色々と不都合があったため、モジュールの勉強も兼ねて簡易的なツールを自作しました。現在はAtCoderBeginnerContest向けの実装なので他のコンテストの場合は修正が必要かもしれません。
##概要
このツールでは以下の機能を実装しています。

- 指定した問題のPythonスクリプトを作成
- BeautifulSoupによるタイトルの自動取得
- ブラウザで問題ページを開く

まずコンテスト名と問題名(A~F)を聞かれるので、入力します。

```
Contest(ex. abc123): abc180
Problems: all
```
allまたはa-fを入力すればすべての問題、カンマで区切れば任意の複数問題が指定できます。
するとコンテスト名のディレクトリが作成され、その配下に問題ごとのスクリプトが作成されます。
スクレイピングツールであるBeautifulSoupによって、問題ページのHTMLからタイトル部分を抽出し、スクリプトにタイトルをつけてくれます。

```
Files Created.   File: ABC180/A_box.py
Files Created.   File: ABC180/B_Variousdistances.py
Files Created.   File: ABC180/C_Creampuff.py
Files Created.   File: ABC180/D_TakahashiUnevolved.py
Files Created.   File: ABC180/E_TravelingSalesmanamongAerialCities.py
Files Created.   File: ABC180/F_Unbranched.py
```
スクリプトにはコメントでURLが追記され、webbrowserモジュールによって自動で問題ページが開きます。
URLが書いてあると後で問題を見直したいときに便利です。

```
# https://atcoder.jp/contests/abc180/tasks/abc180_a
```
![問題ページ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1661572/2b553dd4-b9da-b495-842d-0ae18699e8e0.png)



##ソースコード
```python
import os
from typing import List
import requests
import webbrowser as wb
from bs4 import BeautifulSoup


def make_problem_files(_contest: str, _problems: List[str]):
    """
    :param _contest: コンテスト名（大小文字区別なし）
    :param _problems: 問題名（大小文字区別なし）のリスト
    :return: なし
    """
    for p in _problems:
        # URLを指定
        url = 'https://atcoder.jp/contests/{0}/tasks/{0}_{1}'.format(contest.lower(), p.lower())
        # ディレクトリ名を指定
        directory = _contest.upper()
        # HTMLからタイトルを取得
        r = requests.get(url)
        soup = BeautifulSoup(r.text, 'html.parser')
        title = soup.find('title').text.replace(' ', '').replace('-', '_')
        # スクリプト名を指定
        script = '{0}/{1}.py'.format(directory, title)

        if not os.path.exists(directory):
            # ディレクトリが存在しない場合新規作成
            os.makedirs(directory)
        if not os.path.exists(script):
            # ファイルが存在しない場合新規作成
            try:
                with open(script, 'w', encoding='utf-8') as f:
                    # 先頭にURLを追記
                    f.write('# ' + url + '\n')
                print('Files Created.   File: {0}'.format(script))
            except:
                print('ERROR: Files Not Created.   File: {0}'.format(script))
        # ブラウザで問題ページを開く（new=2:新しいタブ）
        wb.open(url, new=2, autoraise=True)


if __name__ == '__main__':
    # コンテスト名の入力
    contest = input('Contest(ex. abc123): ')
    # 問題を指定
    problems = input('Problems: ')
    prob_list = []
    if problems.lower() == 'a-f' or problems.lower() == 'all':
        prob_list = ['a', 'b', 'c', 'd', 'e', 'f']
    else:
        prob_list = problems.split(',')
    # ファイルの作成
    make_problem_files(contest, prob_list)

```
gsutil で rsync するときに特定のファイルやディレクトリを除外したい

ここに書いてあることをそのまま書く。issueの中身を見て満足された方は読まなくてもおｋ。
https://github.com/GoogleCloudPlatform/gsutil/issues/771

gsutil の `-x` オプションに正規表現を指定することができる。

```sh
# 同期の元ディレクトリツリー
tree rsync-test/
rsync-test/
├── dirA
│   └── bar.txt
├── dirB
│   └── baz.txt
├── dirC
│   ├── baq.txt
│   └── dirCA
│       └── bat.txt
└── foo.txt

# dirA と dirCA の文言を含むオブジェクトを除外
gsutil rsync -r -x '^.*dirA.*$|^.*dirCA.*$' rsync-test gs://rsync-test-cball
Building synchronization state...
Starting synchronization...
Copying file://rsync-test/dirB/baz.txt [Content-Type=text/plain]...
Copying file://rsync-test/dirC/baq.txt [Content-Type=text/plain]...
Copying file://rsync-test/foo.txt [Content-Type=text/plain]...
/ [3 files][    0.0 B/    0.0 B]
Operation completed over 3 objects.

# dirA と dirCA の文言を含むオブジェクトは同期されない
gsutil ls gs://rsync-test-cball
gs://rsync-test-cball/foo.txt
gs://rsync-test-cball/dirB/
gs://rsync-test-cball/dirC/

gsutil ls gs://rsync-test-cball/dirB/
gs://rsync-test-cball/dirB/baz.txt

gsutil ls gs://rsync-test-cball/dirC
gs://rsync-test-cball/dirC/baq.txt
```
Windows10でbatファイルを一瞬で起動する方法

# 実現したいこと
Windowsで作成したbatファイルをすぐに起動できるようにしたい

# 環境
OS : Windows10 Home
Version : 20H2

# 実現方法
0. 起動できるようにしたいbatファイルを作成
0. 作成したbatファイルのショートカットを作成
0. batファイルのショートカットをツールバーに登録

## 1. 起動できるようにしたいbatファイルを作成
ここでは、サンプルとしてメモ帳を起動するbatファイルを作成します。

まず、任意の場所にbatファイルを作成し、
（ここでは、D:\qiita\Windows10でbatファイルを一瞬で起動する方法\sample.bat）
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561074/7c4dc481-2c71-ef58-69a6-45da91f0f4bc.png">

batファイルからメモ帳を起動するようにスクリプトを書きます。

```bat:sample.bat
@echo off
start "" notepad
```

## 2. 作成したbatファイルのショートカットを作成

作成したbatファイルを右クリックし、「ショートカットの(S)作成」を選択すると、
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561074/5ae06e95-6120-2122-af37-845aba9040b9.png">

ショートカットが作成されます。
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561074/7a018f52-8bb6-f82d-2bf6-bf7320d2d7f8.png">

## 3. batファイルのショートカットをツールバーに登録

まず、事前準備として、コマンドプロンプトの実行ファイルの場所を確認します。

コマンドプロンプトを起動し、ツールバーに表示されているコマンドプロンプトのアイコンを右クリックし、「コマンドプロンプト」を右クリック、「プロパティ(R)」を選択します。
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561074/14cb9ad4-be3c-49bd-a382-876d2317f5d2.png">

「ショートカット」タブの「リンク先(T)」の内容をメモしておきます。
私の場合は、「%windir%\system32\cmd.exe」
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561074/7574749a-c18a-f030-f79e-2470647b2c84.png">

では、batファイルのショートカットをツールバーに登録していきます。

2で作成したbatファイルのショートカットを右クリックし、「プロパティ(R)」を選択します。
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561074/af905284-a47a-c13b-3121-4823f4965242.png">

「ショートカット」タブの「リンク先(T)」を編集します。

+ 編集前
「リンク先(T)」には、「D:\qiita\Windows10でbatファイルを一瞬で起動する方法\sample.bat」と書かれています。
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561074/cb8da353-372a-1f32-6aa7-33354711afc9.png">

+ 編集後
「リンク先(T)」の先頭に「%windir%\system32\cmd.exe /c 」を追加し、「%windir%\system32\cmd.exe /c D:\qiita\Windows10でbatファイルを一瞬で起動する方法\sample.bat」とします。
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561074/1fe399f9-3204-3af3-aea6-3bef90737a5d.png">

「適用」を押下し、「OK」を押下します。
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561074/14ab13aa-86af-a554-a0fe-795edc570477.png">

最後にbatファイルのショートカットを右クリックし、「タスクバーにピン留めする(K)」を選択すれば、タスクバーに登録完了です。
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561074/42084643-943d-38b7-afb5-4cfc0492a34b.png">

タスクバーに登録した後は、元のショートカットは削除しても問題なしです。

# (参考)タスクバーから起動する方法

タスクバーに登録したbatファイルは、1クリックで起動もできますが、キーボードショートカットを使用しても起動できます。

仮にタスクバーが
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561074/c4658580-3d01-e37a-9f24-07298e717726.png">
のようになっているとすると、今回作成したbatファイルは左から4番目にあるので、Win + 4で起動できます。

# まとめ
今回の手順と同じようにやるとアプリも一瞬で起動できるようになるので、普段よく使用するものはツールバーに登録し、ショートカットキーを使用して起動できるようになる。
デスクトップにショートカットを置いたり、Windowsのショートカットキーを知らないと、いちいちマウスを動かしたりと面倒くさかったが、かなりストレスフリーになった。

もっと良い方法等あればコメントください。
インタープリタを作る その28

#概要

インタープリタを作ってみた。
avrインタープリター書いてみた。
練習問題やってみた。

#練習問題

zundokoをやれ。

#考え方

レジスタ１６は、カウンタ
乱数を求めて、１２６以下なら、カウンタアップ、zun表示
違うなら、カウントクリア、doko表示
カウンタが４なら、kiyoshi表示

#サンプルコード

```
avr.ldi(16, 0xea)
avr.ldi(17, 0x05)
avr.ldi(18, 0x00)
avr.ldi(19, 0x00)
avr.mul(16, 17)
avr.mov(16, 0)
avr.inc(16)
avr.cpi(16, 0x80)
avr.brcc(12)
avr.ldi(19, 0x7a)
avr.out(0, 19)
avr.ldi(19, 0x75)
avr.out(0, 19)
avr.ldi(19, 0x6e)
avr.out(0, 19)
avr.ldi(19, 0x20)
avr.out(0, 19)
avr.inc(18)
avr.cpi(18, 0x04)
avr.breq(13)
avr.jmp(4)
avr.ldi(18, 0x00)
avr.ldi(19, 0x64)
avr.out(0, 19)
avr.ldi(19, 0x6f)
avr.out(0, 19)
avr.ldi(19, 0x6b)
avr.out(0, 19)
avr.ldi(19, 0x6f)
avr.out(0, 19)
avr.ldi(19, 0x20)
avr.out(0, 19)
avr.jmp(4)
avr.ldi(19, 0x64)
avr.out(0, 19)
avr.ldi(19, 0x6f)
avr.out(0, 19)
avr.ldi(19, 0x6b)
avr.out(0, 19)
avr.ldi(19, 0x6f)
avr.out(0, 19)
avr.ldi(19, 0x20)
avr.out(0, 19)
avr.ldi(19, 0x6b)
avr.out(0, 19)
avr.ldi(19, 0x69)
avr.out(0, 19)
avr.ldi(19, 0x79)
avr.out(0, 19)
avr.ldi(19, 0x6f)
avr.out(0, 19)
avr.ldi(19, 0x73)
avr.out(0, 19)
avr.ldi(19, 0x68)
avr.out(0, 19)
avr.ldi(19, 0x69)
avr.out(0, 19)
avr.ldi(19, 0x20)
avr.out(0, 19)
avr.ldi(19, 0x21)
avr.out(0, 19)
avr.ldi(19, 0x21)
avr.out(0, 19)


```

#結果

```
zun zun doko zun doko doko doko doko zun doko zun zun doko doko doko doko zun zun doko doko zun doko doko zun zun doko doko doko doko doko zun zun zun zun doko kiyoshi !!
```

#成果物

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


以上。
gsutil で GCS から S3 にファイルを移動したい



# 準備

## サービスアカウント用意

該当するGCSにアクセスできるサービスアカウントを用意する。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3134323236332f34643866396235322d613233362d626163362d643363322d3234653764613266646437322e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142263/012864cd-e42b-884c-67f1-f926303d6878.png)


鍵ファイル(JSON)を作成しダウンロード。`/tmp` にでも置いとく。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3134323236332f30313939383334352d393838332d616435382d343162652d3034383962333830396265632e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142263/755d3cb2-3c4b-f62c-2304-ce77c2d55003.png)



```sh
cp ~/Downloads/test-gcs-to-s3-key.json /tmp
```

## Botoファイル用意

gsutil コマンドに AWS のクレデンシャルを読ませる必要があるので Boto ファイルを用意。
これも `/tmp` にでも置いておく。

```sh
less /tmp/.boto
[Credentials]
aws_access_key_id = xxx
aws_secret_access_key = yyy

[s3]
use-signv4=True
host=s3.ap-northeast-1.amazonaws.com
```

言わずもがな上記のクレデンシャルは移動先のS3へアクセスできる権限が必要。
発行手順は割愛。

# やってみる

## GCPにログイン

サービスアカウントの鍵を使ってGCPにログイン。

```sh
gcloud auth activate-service-account --key-file /tmp/test-gcs-to-s3-key.json
gcloud config set project my-project
```

## gsutil 実行

BOTO構成ファイルのパスを環境変数に設定して gsutil コマンドを打てばオケ。

```sh
export BOTO_CONFIG=/tmp/.boto

gsutil -m rsync -rdc \
  gs://my-gcs-bucket/subdir \
  s3://my-s3-bucket/subdir
```

おわり。
【学習メモ】cakePHP3 ＃1

環境Xampp
■基本
《記法》
クラス名やメソッド名はキャメル記法（例：sendFormあるいはSendFormという形式）で命令されますが、
クラスに関連しないファイル名は「アンダースコア記法」と呼ばれる形式で命名されます（例：send_form）。

《アクセス時》
「HelloController.php」という名前でsrc内のControllerにコントローラを用意すると
localhost/アプリ名/helloでアプリ名ディレクトリのHelloControllerにアクセスできる。

《initializeメソッド》
クラス全体に影響する処理を書く。
これはクラスのインスタンスが作成される前に自動的に呼び出されるので、
それぞれのアクションに対応するメソッドが呼び出されるのは、このinitializeが実行された後になる。
逆を言えば、クラス内のすべてのメソッドが呼び出される際には必ず実行済となっている。

《$autoRender》
アクセスする→controllerにいく→$autoRenderがtrueの場合、ビューテンプレートを読み込んで
レイアウトを作成し画面に表示する

《テンプレート》
＜html＞だのといったタグは不要です。
通常＜body＞＜/body＞の内部だけを記述する。
※実際にWebページとして画面に表示されている部分。
テンプレートに値を渡すには$this->set(変数名,値);を使う。
※コントローラのsetメソッドはエレメントの利用に限らずさまざまなシーンで利用される。「コントローラからテンプレートに値を渡す際の基本メソッド」として理解する。

《デフォルトのレイアウト》
場所
src/Template/Layout/defaltctp

《スタイルシート》
格納場所はwebroot/css

《文字コードの設定とヘルパー》
<?=$this->Html->charset(); ?>
これは$thisに用意されているHTMLプロパティに設定されたcharsetメソッドを呼び出し、そこで得られた値を書き出している。
※$thisに用意されているHTMLというものは「HTMLヘルパー」というビューの入力を支援する機能。
ここで返されるのは
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
---------------------------------
スタイルシートは$thisのHTMLにあるCSSというメソッドで設定します。
指定するとwebroot内のcss内からそのファイル読み込んで使用する。
echo $this->Html->css('cake.hello');
---------------------------------
JavaScriptのスクリプトファイルのロードは$this->Htmlにあるscriptメソッドを使う。
echo $this->Html->script('cake.hello');
※'cake.hello'を指定した場合、webrootのjs内から「cake.hello.js」というファイルを読み込むためのタグを生成する。

《fetch》
<?= $this->fetch('title') ?>
fetchはCakePHPに保管されている「ブロック」と呼ばれる値を取り出す。
ここではtitleという表示するページで使われる各種の値やコンテンツなどのことをいう。
コントローラ側で設定した$nameの値がそのまま利用される。
------------------------
<?= $this->fetch('meta') ?>
<?= $this->fetch('css') ?>
<?= $this->fetch('script') ?>
これらはCakePHPのシステムで用意されているメタタグ、スタイルシート、JavaScriptスクリプトの
読み込み、出力している。
------------------------
<?=$this->fetch('content') ?>
ここでビューテンプレートのレンダリングした結果を出力しています。ビューテンプレートから読み込まれたソースコードはレンダリングされ、その結果が「content」というブロックに収められます、
これを書き出せばここにビューテンプレートで作成したコンテンツが表示されるというわけです。

《コントローラの設定》
$this->viewBuilder()->layout('Hello');の場合
viewBuildern()のlayoutというメソッドが呼び出される。
これはこのコントローラで使用されるレイアウトの名前を指定するためのもの。
上記の場合、Layoutフォルダからhello.ctpという名前のレイアウトファイルを読み込んで利用するようになります。
これを指定しないとデフォルトのdefault.ctpが自動的に設定される。
※レイアウトを設定したくないならautoLayoutを使う。
個人の困りごとと開発速度

# 目的
開発現場で起こっている開発速度が遅くなる仕組みを示し、
どんな対応をしたらよいかを模索する。

# 登場するモノ
### ベロシティ
決められた期間の中で、あるチームが届けることができる要求の量のこと

### バックログ
今後着手すべき作業などを期限や優先度などとともに列挙にしたもののこと (e-words)
プロダクトバックログや懸念点リストなど、プロジェクトで対応できないものも含む。

### 困りごと
作業を進める上での足りないものや足りないスキルなど。

# 起こっていること

![スクリーンショット 2021-06-19 13.31.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176596/0b53a96c-a929-10d8-556c-a1b393e6a233.png)

# ベロシティを落とさないための対応策
## 困りごとを早く分離する
 - 困りごとをチャットやグチでつぶやく
 - ”調子どう？”と聞いてみる

## わからないを減らす
 - 用語集や手順書を作る(wikiなど)
 - 小さな相談会や勉強会をする

## できないを減らす
* 作業量が大すぎる
 - 作業を分割する
 - 作業する順序を見直す
* スキル不足
 - 対応する作業を適正レベルにする（再割り当て or 作業分割）
 - （長期的に見て）次につながる基礎的な作業をする
* リソース不足
 - 不足リソースを用意する
 - リソースがある担当に割り当てを変える

# 参照リンク
[Velocity (software development)@wikipedia](https://en.wikipedia.org/wiki/Velocity_(software_development))
[ベロシティに対する誤解](https://www.ryuzee.com/contents/blog/4802)
[スクラムとは](https://www.fujitsu.com/jp/group/fst/about/resources/featurestories/about-agile-02.html)
[バックログとは(e-words)](https://e-words.jp/w/%E3%83%90%E3%83%83%E3%82%AF%E3%83%AD%E3%82%B0.html)
[プロダクトバックログ: 究極の行動リスト](https://www.atlassian.com/ja/agile/scrum/backlogs)
[困りごと(weblio)](https://thesaurus.weblio.jp/content/%E5%9B%B0%E3%82%8A%E3%81%94%E3%81%A8)
[スクラムにおける朝会の目的は進捗共有ではないよという話](https://qiita.com/getty104/items/35ccb10ce660e7487ef8)

## イベント
エンジニアによるマネジメント - エンジニアだからこそ発信できるマネジメントの知識を発信しよう
https://qiita.com/official-events/c826cda7a9514df143cb

--
インタープリタを作る その27

#概要

インタープリタを作ってみた。
avrインタープリター書いてみた。
練習問題やってみた。

#練習問題

fizzbuzzをやれ。

#考え方

レジスタ１６は、カウンター、１から１００まで、回す。
１５の剰余を求め、０ならfizzbuzz表示
５の剰余を求め、０ならbuzz表示
３の剰余を求め、０ならfizz表示
その他は、数値表示


#サンプルコード

```
avr.ldi(16, 0x00)
avr.ldi(18, 0x00)
avr.inc(18)
avr.mov(16, 18)
avr.ldi(17, 0x0f)
avr.cpi(16, 0x0e)
avr.brcs(22)
avr.cpi(16, 0x00)
avr.breq(1)
avr.jmp(31)
avr.ldi(19, 0x66)
avr.out(0, 19)
avr.ldi(19, 0x69)
avr.out(0, 19)
avr.ldi(19, 0x7a)
avr.out(0, 19)
avr.ldi(19, 0x7a)
avr.out(0, 19)
avr.ldi(19, 0x62)
avr.out(0, 19)
avr.ldi(19, 0x75)
avr.out(0, 19)
avr.ldi(19, 0x7a)
avr.out(0, 19)
avr.ldi(19, 0x7a)
avr.out(0, 19)
avr.ldi(19, 0x20)
avr.out(0, 19)
avr.jmp(72)
avr.sub(16, 17)
avr.jmp(5)
avr.mov(16, 18)
avr.ldi(17, 0x05)
avr.cpi(16, 0x04)
avr.brcs(14)
avr.cpi(16, 0x00)
avr.breq(1)
avr.jmp(51)
avr.ldi(19, 0x62)
avr.out(0, 19)
avr.ldi(19, 0x75)
avr.out(0, 19)
avr.ldi(19, 0x7a)
avr.out(0, 19)
avr.ldi(19, 0x7a)
avr.out(0, 19)
avr.ldi(19, 0x20)
avr.out(0, 19)
avr.jmp(72)
avr.sub(16, 17)
avr.jmp(33)
avr.mov(16, 18)
avr.ldi(17, 0x03)
avr.cpi(16, 0x02)
avr.brcs(14)
avr.cpi(16, 0x00)
avr.breq(1)
avr.jmp(71)
avr.ldi(19, 0x66)
avr.out(0, 19)
avr.ldi(19, 0x69)
avr.out(0, 19)
avr.ldi(19, 0x7a)
avr.out(0, 19)
avr.ldi(19, 0x7a)
avr.out(0, 19)
avr.ldi(19, 0x20)
avr.out(0, 19)
avr.jmp(72)
avr.sub(16, 17)
avr.jmp(53)
avr.out(1, 18)
avr.cpi(18, 0x64)
avr.breq(2)
avr.jmp(2)



```

#結果

```
1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 17 fizz 19 buzz fizz 22 23 fizz buzz 26 fizz 28 29 fizzbuzz 31 32 fizz 34 buzz fizz 37 38 fizz buzz 41 fizz 43 44 fizzbuzz 46 47 fizz 49 buzz fizz 52 53 fizz buzz 56 fizz 58 59 fizzbuzz 61 62 fizz 64 buzz fizz 67 68 fizz buzz 71 fizz 73 74 fizzbuzz 76 77 fizz 79 buzz fizz 82 83 fizz buzz 86 fizz 88 89 fizzbuzz 91 92 fizz 94 buzz fizz 97 98 fizz buzz 
```

#成果物

https://embed.plnkr.co/plunk/9fekrD6L8aO4W38n


以上。
要素を横に並べる(CSS Grid Layout)

## 備忘録

- webページを作っているとき、要素がいい感じに横並びになってくれない
- 「左右中央揃え」で検索しても結局よくわからない

こんな困ったときにGrid Layout 機能を利用する

## CSS Grid Layoutとは

> __CSS Grid Layout__（グリッドレイアウト）は、__2次元レイアウト__ を、HTML/CSS を使って簡単・自由に操作できる、CSSの新しい機能です。
格子状のマス目のグリッドに好きな順番に配置したり結合したりすることで、様々なレイアウトが可能になります。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/f4b33cef-7974-109f-165b-49bee630b144.png)

引用元は [こちら (CSS Grid Layout を極める！（基礎編）)](https://qiita.com/kura07/items/e633b35e33e43240d363)
## Example

具体例として、ボタンを横に3個並べたときの実行結果とコードを残しておく。

- 実行結果

![btn.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/6802808f-5492-0563-b384-620706a9d9cd.png)

- コード

htmlファイルを作成し、コードをコピペして確認してください

```
<!DOCTYPE html>
<html lang="ja">
    <style>
        #container {
            margin-top: 200px;
            margin-left: 200px;
            display: grid;
            grid-template-rows: 50px;
            grid-template-columns: 200px 200px 200px;
        }
        #itemA, #itemB, #itemC{
            text-align: center; /*ボタンを中央寄せ*/
        }
        #itemA{
            grid-column: 1 / 2;
        }
        #itemB{
            grid-column: 2 / 3;
        }
        #itemC{
            grid-column: 3 / 4;
        }
        .btn-square {
            display: inline-block;
            height: 30px;
            width: 70px;
            padding: 0.5em 1em;
            text-decoration: none;
            background: #668ad8;/*ボタン色*/
            color: #FFF;
            border-bottom: solid 4px #627295;
            border-radius: 3px;
        }
        .btn-square:active {
            /*ボタンを押したとき*/
            -webkit-transform: translateY(4px);
            transform: translateY(4px);/*下に動く*/
            border-bottom: none;/*線を消す*/
        }
    </style>
    <body>
        <div id="container"> <!-- コンテナ -->
            <div id="itemA"><a href="javascript:void(0)" class="btn-square">BUTTON</a></div> <!-- アイテム -->
            <div id="itemB"><a href="javascript:void(0)" class="btn-square">BUTTON</a></div> <!-- アイテム -->
            <div id="itemC"><a href="javascript:void(0)" class="btn-square">BUTTON</a></div> <!-- アイテム -->
        </div>
    </body>
</html>
```

## 参考

- [使用したボタン](https://saruwakakun.com/html-css/reference/buttons#section1)
- [aタグの無効化](https://freeladay.com/?p=2273)
- [javascript:void(0);はカッコ悪い?](https://techplay.jp/column/559)