OmniAICreator/Qiita-1.07M huggingface dataset:
画像一覧表示で指定の枠内でスクロールさせる方法

現在スクールにてプログラミングを学習中
目標は４週間の間でフリマアプリを完成させる

開発環境
rails 5.2.4.1
ruby  2.5.1

初学者向けに記述してます
アウトプット練習の為でもあります。

実装したいこと
画像を指定の範囲内でスクロールさせる。

完成イメージ
https://i.gyazo.com/55340c88a724b2e46eee6ed3254fbef6.mp4
写真は動物ですがあくまでテストイメージです。
予めご了承ください。

実装にあたりhamlの記述は終えているものとします。
書きにはSCSSの記述のみ載せます。

まずはスクロールさせたいブロックの枠のクラスに下記を記述（👉部分）
---
    &__lists {
      width: 800px;
      padding: 26px 0;
      margin: 0 auto;
      display: flex;
    👉overflow-x: scroll;
----

次にスクロースさせたい子要素の.scssに記述を追記
---
    .item_list {
    👉min-width: 250px;
      height: 245px;
      color: #000000;
      background-color: #ffffff;
      display: inline-block;
      position: relative;
      margin: 0 10px;

widthにmin-を追加する記述で最低の枠の大きさを固定でき
指定した大きさの枠内でクスロールしてくれる。

これでスクロール完了です。
Unityのスクリプトテンプレートのカスタマイズとオーバーライド

# スクリプトテンプレートをカスタマイズしたい！
下記はUnityでスクリプトを生成すると出力されるものです。
暫く使っていると自分好みのテンプレートにカスタマイズしたくなりませんか？

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

```

## カスタマイズ方法は2通り
1. Unity Editorがインストールされたディレクトリ内のScriptTemplatesを修正する
2. Assets/ScriptTemplatesを設置する

1は良い記事を見つけたので[こちら](https://qiita.com/murapong/items/bb6697708f420ba91100)の記事をご覧下さい。　
今回は2の説明です。1との違いはインストールディレクトリを触らないので気軽に使えます。プロジェクトによって変更することもできるので汎用性が高いです。

### 2. Assets/ScriptTemplatesを設置する
<img width="531" alt="スクリーンショット 2020-02-26 19.18.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/63d17f18-e2dd-d4fc-ecd8-132f74ff3d6d.png">
1. Assets/ScriptTemplatesディレクトリを作成
2. 下記テキストを **81-C# Script-NewBehaviourScript.cs.txt** という名前で上記ディレクトリに設置
3. 自分好みに修正 [注意] **#SCRIPTNAME#**は変更しない
4. エディタを再起動

```text
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class #SCRIPTNAME# : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        #NOTRIM#
    }

    // Update is called once per frame
    void Update()
    {
        #NOTRIM#
    }
}
```

## 最後に
ちなみに僕は下記のようにカスタマイズしました。　
IL2CPPで出力するiOS/Androidアプリなどはできる限り~~`sealed class`にすると良いですよ。~~

[追記]
新しいコンパイラの影響でCppコードの内容が変わりsealedをつけても直接メソッドを呼んでくれなくなったぽいです。今後どうなるか分からないのでとりあえず引き続き`sealed`はつけようと思います。

[[il2cpp] Is `sealed` Not Worked As Said Anymore In Unity 2018.3?](https://forum.unity.com/threads/il2cpp-is-sealed-not-worked-as-said-anymore-in-unity-2018-3.659017/)

```text

using UnityEngine;

public sealed class #SCRIPTNAME# : MonoBehaviour
{

}

```
Pythonで一番小さい値 (paizaランク D 相当)を解く

# 初めに
paizaのレベルアップ問題集を解いていたのですが、模範解答がなかったので自分で作ってみました。
言語はPython3です。

# 問題
Paizaのスキルチェック見本問題 一番小さい値 (paizaランク D 相当)
https://paiza.jp/works/mondai/skillcheck_sample/min_num?language_uid=python3
ログインしないと問題文が見れませんでした。
登録は無料ですぐにできるので、とりあえず登録してみることをおススメします。

# 解答コード
min関数を使っては面白くないかなと思い、あえて冗長な書き方をしてみました。

```python:min_num.py
# 入力された値を保存する
n_1 = int(input())
n_2 = int(input())
n_3 = int(input())
n_4 = int(input())
n_5 = int(input())

# 一番小さい数字を見つける
ans = n_1
if n_2 < n_1:
    ans = n_2
if n_3 < ans:
    ans = n_3
if n_4 < ans:
    ans = n_4
if n_5 < ans:
    ans = n_5

# 答えを出力する
print(ans)
```

# 解答コード　その２
先ほどのをfor文とリスト構造を用いて少し見やすくしてみました。

```python:min_num.py
# 入力された値を保存する
n = [int(input()) for i in range(5)]

# 一番小さい数字を見つける
ans = n[0]
for i in range(4):
    if n[i+1] < ans:
        ans = n[i+1]

# 答えを出力する
print(ans)
```

# 解答コード　その３
min関数を使ってみました。

```python:min_num.py
# 入力された値を保存する
n = [int(input()) for i in range(5)]

# 一番小さい数字を見つける
ans = min(n)

# 答えを出力する
print(ans)
```

# 参考
https://qiita.com/KoyanagiHitoshi/items/3286fbc65d56dd67737c

# 最後に
分からないところがあれば気軽にコメントしてくださいね。
できるだけ答えますよ！
websocketとwebsocket_clientの競合でうまくimportできないのを解決する

# 達成したいこと
- import websocketしたい
- websocket.create_connection()したい


# やったこと

### importできない

```sumple_ws.py
from websocket import create_connection
```
↓

```
Traceback (most recent call last):
  File "sumple_ws.py", line 10, in <module>
    from websocket import create_connection
ImportError: cannot import name 'create_connection' from 'websocket' (unknown location)
```
:thinking: 


### websocket_clientとかいうやつがある
サーバ側とクライアント側で使うべきパッケージが違うらしい

今回のケースでは誤り

```shell
$  pip install websocket
```

こっちが正解

```shell
$  pip install websocket-client
```

なのにimportするときはどっちも`websocket`
リーダブルコード読んできてください


### websocket_clientを導入したのにimportできない

はい完璧

```shell
$  pip install websocket-client
$  pip uninstall websocket

$  pip freeze | grep websocket
websocket-client==0.57.0
```

が 再現

```sumple_ws.py
from websocket import create_connection
```
```
Traceback (most recent call last):
  File "sumple_ws.py", line 10, in <module>
    from websocket import create_connection
ImportError: cannot import name 'create_connection' from 'websocket' (unknown location)
```

### import websocketの名前空間がおかしい

対話モードで確認

```python
>>> import websocket
>>> dir(websocket)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
```
:thinking: :thinking: :thinking:

### websocket_clientも再インストールする

```
$  pip uninstall websocket-client
$  pip install websocket-client

対話モード
```python
>>> import websocket
>>> dir(websocket)
['ABNF', 'DEFAULT_SOCKET_OPTION', 'STATUS_ABNORMAL_CLOSED', 'STATUS_BAD_GATEWAY', 'STATUS_GOING_AWAY', 'STATUS_INVALID_EXTENSION', 'STATUS_INVALID_PAYLOAD', 'STATUS_MESSAGE_TOO_BIG', 'STATUS_NORMAL', 'STATUS_POLICY_VIOLATION', 'STATUS_PROTOCOL_ERROR', 'STATUS_STATUS_NOT_AVAILABLE', 'STATUS_TLS_HANDSHAKE_ERROR', 'STATUS_UNEXPECTED_CONDITION', 'STATUS_UNSUPPORTED_DATA_TYPE', 'WebSocket', 'WebSocketAddressException', 'WebSocketApp', 'WebSocketBadStatusException', 'WebSocketConnectionClosedException', 'WebSocketException', 'WebSocketPayloadException', 'WebSocketProtocolException', 'WebSocketProxyException', 'WebSocketTimeoutException', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_abnf', '_app', '_cookiejar', '_core', '_exceptions', '_handshake', '_http', '_logging', '_socket', '_ssl_compat', '_url', '_utils', 'continuous_frame', 'create_connection', 'debug', 'dump', 'enableTrace', 'error', 'frame_buffer', 'getdefaulttimeout', 'isEnabledForDebug', 'isEnabledForError', 'isEnabledForTrace', 'recv', 'recv_line', 'send', 'setdefaulttimeout', 'sock_opt', 'trace', 'warning']
```

今度こそ完璧

### 要因
インストールとアンインストールのタイミングのせいでなんやかんやあったと思われる

これが

```
$  pip install websocket-client
$  pip uninstall websocket
```

この順番ならよかったはず

```
$  pip uninstall websocket
$  pip install websocket-client
```
jasmineでメソッドとプロパティを持つspy objectの作り方

Jasmin3.3

メソッドを定義したオブジェクトにプロパティを手動で追加するだけ
定義してないプロパティに対して、spyOnPropertで追加すると怒られる、、。

```javascript:test.spec.ts
let spy = jasmine.createSpyObj('Spy', ['testFunc', 'testFunc2']);
spy.testProperty = '4';
```



#参考（spy関連）
[jasmineで例外をテストする](https://qiita.com/nanocloudx/items/8188ea6c1e11da5e595c)
[[JavaScript] jasmine spy（いわゆるテストダブルあるいはモック） レシピ集](https://qiita.com/sengoku/items/c4a04995aae43d953961)
Pythonで掛け算 (paizaランク D 相当)を解く

# 初めに
paizaのレベルアップ問題集を解いていたのですが、模範解答がなかったので自分で作ってみました。
言語はPython3です。

# 問題
Paizaのスキルチェック見本問題 掛け算 (paizaランク D 相当)
https://paiza.jp/works/mondai/skillcheck_sample/multiplication?language_uid=python3
ログインしないと問題文が見れませんでした。
登録は無料ですぐにできるので、とりあえず登録してみることをおススメします。

# 解答コード
```python:multiplication.py
# 入力される値を変数に保存する
a = int(input())
b = int(input())

# aとbを掛け合わして答えに保存する
answer = a * b

# 答えを出力する
print(answer)
```

# 参考
https://qiita.com/KoyanagiHitoshi/items/3286fbc65d56dd67737c

# 最後に
分からないところがあれば気軽にコメントしてくださいね。
できるだけ答えますよ！
ターミナルからプルリクをさっと開く

[GitHub CLI の gh pr create](https://cli.github.com/manual/gh_pr_create) を使って、ターミナルからプルリクをさっと開いて効率アップした話です💪

## インストール

お馴染みの brew で簡単インストールです 🎶

```:console
$ brew install gh
```

## 試す
これまでは feature ブランチにて `git add` と `git commit` を済ませたら、該当のリポジトリをブラウザのタブから探したりしてプルリクを作っていましたが、プルリクを作るまでをターミナルでやっちゃいます。

```:console
$ gh pr create -w
```

これで、`git add` 、`git commit` の流れでぱっとブラウザ上にプルリクエストが作成されたものが立ち上がります🖥✨

## エイリアスにして更に時短
試してみて感動しましたが、このコマンド自体を忘れてしまうのでまた調べてたら意味がない...ということで、エイリアスにします。
bash なら `.bash_profile` 、zsh なら`.zshrc`などに追加してみて下さい！

```:.zshrc
alias pr="gh pr create -w"
```

これで、`pr`と打つだけでプルリクが開いてくれるので快適になりました😆

## オマケ: bash_profile の簡単な書き方

私は以前、`.bash_profile`の開き方すら分からず、vim での書き方も分からなかったので、私的に一番簡単だと思う方法を載せておきます🙆‍♀️

ホームディレクトリで

```:console
$ open .bash_profile
```

そんなファイルないよと言われたら作ってあげてから開く

```:console
$ touch .bash_profile
$ open .bash_profile
```

エイリアスを書いたら、ターミナル再起動か、`.bash_profile` を読み込んであげる

```:console
$ source ~/.bash_profile
```

さっとプルリク、楽ちんなのでみんなも是非してみて下さい✌️
Pythonで足し算 (paizaランク D 相当)を解く

# 初めに
paizaのレベルアップ問題集を解いていたのですが、模範解答がなかったので自分で作ってみました。
言語はPython3です。

# 問題
Paizaのスキルチェック見本問題 足し算 (paizaランク D 相当)
https://paiza.jp/works/mondai/skillcheck_sample/addition?language_uid=python3
ログインしないと問題文が見れませんでした。
登録は無料ですぐにできるので、とりあえず登録してみることをおススメします。

# 解答コード
```python:addition.py
# 入力された値を保存する
a, b = (int(x) for x in input().split())

# 値の足し算を計算して答えに保存する
answer = a + b

# 答えを出力する
print(answer)
```

# 参考
https://qiita.com/KoyanagiHitoshi/items/3286fbc65d56dd67737c

# 最後に
分からないところがあれば気軽にコメントしてくださいね。
できるだけ答えますよ！
Railsでゲームを作成してバックエンドを学ぶ①　アクセス（通信）する

# はじめに
これは、普段Web系やAndroidなどフロントエンド中心に開発を行っており、びっくりするほどバックエンドのことが分からなかった筆者が、バックエンドの知識を付ける目的で、Railsで◯×ゲーム（三目並べ）を作成した時の記録である。
いくつかの段階に分けて取り組んだので、記事も分けることにする。

# ①アクセス（通信）する
今回はWebサーバにアクセスして画面を表示させられるようにするところまで行う。
## 実現したいこと
Webサーバにアクセスして、ブラウザに画面を表示させる。
ここではとりあえず、Hello, Worldなどの何かしら簡単なオブジェクトが表示されているようにする。

## 実現するうえでの不明点
- Webサーバへのアクセスの仕方が分からない（忘れた）  
→手順としては`rails server`でサーバを立ち上げてからブラウザでアクセスするだけ  
　[Railsチュートリアルの1.3](https://railstutorial.jp/chapters/beginning?version=5.1#sec-the_hello_application)に全部書いてある。

# 開発手順
ほぼ全てRailsチュートリアルの1.3に則って進めた。
## Railsサーバの起動
Railsアプリケーションのディレクトリで`rails server`する（`rails s`というエイリアスあり）。
自分は別マシンにssh接続して開発しているため、`-b`オプションでホストを指定している。
`$ rails s -b <ssh先のホスト>`
`rails server`コマンドを打つと、PumaというWebサーバが起動する（ https://railsguides.jp/command_line.html#rails-server ）。

```
$ rails s
=> Booting Puma
=> Rails 5.0.7.2 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.2-p47), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
```

## 画面の表示
上記でサーバを起動したので、ブラウザからアクセスする。
デフォルトは`localhost:3000`で、指定したホスト（`-b`オプションで指定できる）やポート番号（`-p`オプション）に適宜書き換える。
アクセスするとデフォルトのRailsページが表示される。~~Hello, Worldより遥かに豪華~~

## 画面に別の物を表示させる
上記で接続した画面に"Hello, World!"を表示して原始的にすることにする。
### アクション追加
コントローラに「文字列を描画する」というアクションを追加する。
`app/controllers/application_controller.rb`に`hello`アクションを追加した。

```ruby
  def hello
    render html: "Hello, World!"
  end
```

### アクションを使う
上記で作成した`hello`アクションを使うようにして、実際に画面に表示されるようにする。
`config/routes.rb`に`root 'application#hello'`（`'<コントローラ名>#<アクション名>'`）を追加する。
これで晴れて"Hello, World!"が画面に表示されるようになった。
![スクリーンショット 2019-07-24 10.17.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124752/c1120c52-f4bf-4445-b17e-d8d5e7b3e706.png)


# エラーや詰まった箇所
## Gem::LoadError
`rails server`を起動してブラウザでアクセスすると、`Gem::LoadError`というエラーが発生した。
`sqlite3`というgemの最新バージョン（1.4.x）がActiveRecordに対応していないことによるエラーらしい。
`sqlite3`のバージョンを指定してインストールしなおすことで解消した。

参考: [sqlite3のgemでGem::LoadErrorが出てしまう](https://qiita.com/RyuGotoo/items/345c3e65dfebdeeb6ef1)

## ActiveRecord::ConnectionNotEstablished
上記のgemのエラーを解消したらこのエラーが発生した。
アプリがActiveRecordを使わない設定で作られていたのが原因らしい。
`config/application.rb`に`require 'active_record/railtie'`を追加すると解消した。

参考: [Railsで ActiveRecord::ConnectionNotEstablished: No connection pool with 'primary' found. がでたら確認すること。](https://qiita.com/masayuki14/items/27ca4764d0bcae4affea)


# 補足
## Railsアプリケーションの作成
`rails new`する。自動的に`bundle install`もされる。

## Gitの導入
`git init`する。
`git add`と`git commit`をするとローカルに`master`ブランチができるので、あとはいつもGitを使っている感じでブランチを切ったりできる。

# まとめ
- Webサーバにアクセスして、自分で指定した文字列を画面に表示させた。
- Railsが頑張っているおかげでWebサーバを容易に利用できる。
楽天市場のページへのアクセス制限変更点(2020.02.26)【未解決】

# 起こったこと
2020.02.25の夜あたりから、
楽天市場の商品ページへのプログラムからのアクセスができなくなった。

curlコマンドやphpのfile_get_contentが、503エラーを返す様になった。


# 調査内容
curlコマンドを用いて、色々と環境を変えたりオプションを変えたりして、
状況を確認。

## ユーザーエージェントによる制限？（違った）
スマホのUAだと問題なかったが、スマホサイトだけは特別だったよう。
PCサイトに接続するUAだといくつか試したがどれも変わらず。

## IP制限がかけられた？（違った）
IPが同一の社内環境でも、アクセスできないPCとアクセスできるPCがあった。

## 接続の回数制限？（違った）
一回目のアクセスで繋がらないサーバもあれば、
何回接続しても繋がるサーバもあったので。

## アクセスプロトコルが、HTTP/1.1が☓でHTTP/2は◯？ ~~（正解！！）~~
curlコマンドに `-vvv` をつけて詳細ログを見てみると、

問題ない環境だと、

```
Using HTTP2, server supports multi-use
Connection state changed (HTTP/2 confirmed)
```

という記述があり、問題のある環境だと、

```
GET /up-t01/it001/ HTTP/1.1
：
HTTP/1.1 503 Service Unavailable
```

という記述が。。。

~~こ、これだっ！！！！~~

hTML/2の通信にしても503エラーになる環境アリ。

### 対応
HTTP/2のプロトコルが使えるコマンドに変更する。

curlだと、7.43以上。
ただし、nghttpの2 1.0.0以上も必要。

nghttp2ライブラリをインストールするには、
libnghttp2-devが必要なのだが、OSが古いとそもそもこれを入れられない場合があるので注意。
（ubuntu14の私の環境とか。。）

PHPもたぶん5.5.24以上が必要。

curlはインストールしただけだとはdisableなので注意。
`./configure` 後に

```
HTTP2:            disabled (--with-nghttp2)
```

となっていたら未だdisableなので要確認。

詳しくは参考サイトを参照ください。

## 根本原因未だ不明・・
鋭意調査中。。。

# 後記
そもそもなぜ503エラーになるのか。。。
普通は、まずHTTP/1.1で接続を試みて、対応してる場合はHTTP/2に切り替えるという流れで、
繋がらなくなることは無いみたいなのに。。。
（詳しくは[こちら]([https://knowledge.sakura.ad.jp/7734/)）

# 参考
- [curl エクステンションで HTTP/2 リクエストを送信する](https://qiita.com/masakielastic/items/f563437c44b0d4c04f87)
- [PHP curlでHTTP/2リクエストを実行するための設定 on CentOS 7](https://inaba-serverdesign.jp/blog/20171011/php_curl_http2_centos7.html)
- [【図解】HTTP/2って？HTTP/1.1との違いと導入メリット・課題まとめ](https://www.kagoya.jp/howto/webhomepage/http-2/)
トークン更新を自前でやってみた

# はじめに
まずはじめに結論を言うと、 `Timer` の使い方の一つを紹介するという内容になります。
トークンの更新処理などは SDK などに委ねるのが一般的なので、処理方法の参考としてご覧ください。

# 自動更新処理
```swift
final class NetworkManager {
    private enum Const {
        /// 10 minutes ago
        static let timeGap: TimeInterval = -60 * 10
    }

    public var token: String {
        _token
    }

    private var _token = ""
    private var timer: Timer?
    private var expiration: Date = Date() {
        didSet {
            timer?.invalidate()
            // 期限の10分前にトークンの更新をリクエスト
            timer = Timer(fire: Date(timeInterval: Const.timeGap, since: expiration), interval: .zero, repeats: false) { [weak self] _ in
                self?.updateToken()
            }
            if let timer = timer {
                // Timer を init して生成している関係で必要になる処理
                RunLoop.main.add(timer, forMode: .default)
            }
        }
    }

    deinit {
        // Class が破棄される時に Timer も無効にする
        timer?.invalidate()
    }

    private func updateToken() {
        createToken(
            success: { [weak self] info in
                self?.expiration = info.expiration
                self?._token = info.token
            },
            failure: { error in
                debugPrint(error)
            }
        )
    }
}
```

```swift
extension NetworkManager {
    public struct AuthInfo {
        let token: String
        let expiration: Date
    }
    // サーバとの通信処理を再現
    public func createToken(success: @escaping (AuthInfo) -> Void, failure: @escaping (Error) -> Void) {
        let token = "E9rF7M3xgCE1taG6Qz7t" // SAMPLE
        let tomorrow = Date(timeIntervalSinceNow: 60 * 60 * 24) // SAMPLE
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            success(AuthInfo(token: token, expiration: tomorrow))
        }
    }
}
```

# さいごに
「SDKから常に期限が切れていない Token を取得できるから便利！」という処理の裏の実装方法として、このようなパターンも考えられます。
ただ、端末の時間が間違っていると、正常に動作しない問題を抱えていることに気がつくと思います。
はじめにも書きましたが、処理手法の参考としてみていただければと思います。
Excel出力を[xls]から[xlsx]に切り替えた時のエラー

# 遭遇したエラー
　'<ファイル名>' には読み取れない内容が含まれています。このブックの内容を回復しますか ?
　ブックの発行元が信頼できる場合は、[はい] をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346005/acb210f6-2432-6571-f02b-8418eb271d63.png)

はい(Y)をクリックすると

「読み取れなかった内容を修復または削除することにより、ファイルを開くことができました」
という内容の ['<ファイル名>' の修復]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346005/7707251d-b59a-9c74-accb-a1d530b7b7c2.png)

xlsの時にはなかったがxlsxでは発生する。

# 違う解決策

Microsoftサポートでこのエラーについての原因と解決策が提示されていた。
[こちら](https://support.microsoft.com/ja-jp/help/2874393)

## 原因
セルの枠線上に、[サイズとプロパティ] を [セルに合わせて移動やサイズ変更をする] に設定している Line オブジェクトがある状態で行または列の追加をすると、OpenXML 形式で情報を保持する際の "線の位置情報" に不整合が生じます。
xlsx 形式のファイルを開くときに表示されるファイルが破損している旨のメッセージは、この "線の位置情報" の不整合を検知して表示されています。

(ふむふむ、何を言っているのか分からなかった。)

## 解決策
Excel 2013

Excel 2013 でこの問題を解決するには、Office 2013 の Service Pack 1 をインストールします。
Office 2013 の Service Pack 1 について参照するには、次のサポート技術情報をクリックしてください。

　2817430　Description of Microsoft Office 2013 Service Pack 1 (SP1)

Excel 2010

Excel 2010 でこの問題を解決するには、Excel 2010 の修正プログラム パッケージをインストールします。
修正プログラム パッケージについて参照するには、次のサポート技術情報をクリックしてください。

　2825798　Description of the Excel 2010 hotfix package (Excel-x-none.msp): October 8, 2013

Excel 2007
 
Excel 2007 につきましては、メインストリーム サポートが終了しているため、修正プログラムはございません。

(Office365を使用しているためこれらに該当するのか分からなかったがエラー内容見る限りこの辺りで間違えないだろうとおもっていた。)

# 本当の原因
いろいろ調べる中でこのエラーに苦しむ人が多く、おまけに情報量がとてもすくなかったので
今回その中の一つになればと思っています。

今回のエラーの原因は
シートの命名が原因でした。

シートにはいろいろと使用できない文字が決められており
今回はそれに変な形でぶつかった。

「 」スペースがexcelのシートに含まれていたのでよくわかないがエラーが起きていた。
手動でスペースを空けてシートに入力する分にはエラーは発生しないが
プログラムでexcel出力を行うとなぜかエラーがおきる。

プログラムの方でスペースを排除したら
異常なくexcelファイルが出力された。

おそらく
「xls」と「xlsx」でのシートの命名規則に違いがあり
今回それに引っかかったのかなと思う。

# まとめ
エラーの内容とMicrosoftの提示していることが違いすぎて
かなり迷走してしまった。

提示している事象でもおそらく同じエラーが出るのかなと思う。
エラーに対しての原因と解決策が一致していなさそうなので

もしこのエラーについて調べてこの記事に出会った方は
「シートの命名」がもしかしたら・・・

かもしれないので検証してみてください。

ありがとうございました。
MAC OS CatalinaでiPhoneの通信をキャプチャする方法

MAC　OSがCatalinaになってからiPhoneの通信キャプチャの方法が変わったのでメモがてら

#今回使用したデバイス
MacBook Pro [10.15.2 Catalina]
iPhone X

#使用ソフト
[WireShark](https://www.wireshark.org/download.html)

#キャプチャの手順
##手順１　iPhoneとMACを接続
LightingケーブルでiPhoneとMACを接続します。
このiPhoneは信頼しますか？的なのが出てくるので、とりあえず信頼しておきましょう。

##手順２　iPhone UUIDのコピー（Catalina以前のOSの場合異なる）
Catalinaからは、iTunesではなく、Finderを使用していきます。

まずFinderを開き、さっき信頼したiPhoneを選択する（ここでも信頼しておきましょう）
<img width="1440" alt="スクリーンショット 2020-02-26 18.09.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256408/2e057b43-3223-0083-0dcf-7d970d8bb56b.png">

次に、写真の部分をクリックします。
<img width="1440" alt="スクリーンショット_2020-02-26_18_10_41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256408/33c128b3-ad22-6a9d-aea4-97f6317bd3c2.png">

クリックすると、シリアル、UUIDなどが表示されるので、右クリック→コピーしましょう
<img width="1440" alt="スクリーンショット_2020-02-26_18_11_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256408/cd728888-712e-bf72-63e7-c71a7dacaef7.png">

##手順３　ターミナルから、iPhoneを仮想認識させる（Catalina以前のOSの場合異なる）
ターミナルを開き、以下を入力しEnterします。(Catalinaの場合）
※UUIDUUIDUUIDUUIDUUIDUUIDUUIDUUIDUUID部分はさっきコピーしたUUIDが入ります。
`sudo /Library/Apple/usr/bin/rvictl -s UUIDUUIDUUIDUUIDUUIDUUIDUUIDUUIDUUID`

EnterするとPCのパスを聞かれるので入力してください。
成功すると[SUCCEEDED]が表示されます。

一応、Catalina以前のOSの場合のコマンド
`rvictl -s UUIDUUIDUUIDUUIDUUIDUUIDUUIDUUIDUUID`
方法は同じです。

## 手順４　WireSharkを起動しキャプチャする
手順３が無事成功したあとに、WireSharkを起動します。
成功している場合、以下のrvi0を選択するとiPhoneのコマンドをキャプチャできます。
<img width="1161" alt="スクリーンショット_2020-02-26_18_16_52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256408/aacb4caf-5003-ce7a-b814-ff0c1f7a86d8.png">
Python3 Webスクレイピング 実践入門

https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406
この記事を参考にしたところ、python2ではめっちゃ動いて助かったけど、python3では微妙な違いで動かなかったので。
微妙な違い：print文とurllib2のところ。

#

## python3のpipでbeautifulsoupをインストール
```
pip3 install beautifulsoup4
```

##日経新聞のタイトルを取ってる来るコードの件
```getNikkeiWebPageTitle.py
#!/usr/bin/env python3.6.9
# -*- coding: utf-8 -*-
# ref 1. https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406
# ref 2. https://qiita.com/rmanzoku/items/3bf4eb2b8b499ecb3dcf
import urllib.request
from bs4 import BeautifulSoup

# アクセスするURL
url = "http://www.nikkei.com/"

# URLにアクセスする htmlが帰ってくる → <html><head><title>経済、株価、ビジネス、政治のニュース:日経電子版</title></head><body....
html = urllib.request.urlopen(url)

# htmlをBeautifulSoupで扱う
soup = BeautifulSoup(html, "html.parser")

# タイトル要素を取得する → <title>経済、株価、ビジネス、政治のニュース:日経電子版</title>
title_tag = soup.title

# 要素の文字列を取得する → 経済、株価、ビジネス、政治のニュース:日経電子版
title = title_tag.string

# タイトル要素を出力
print(title_tag)

# タイトルを文字列を出力
print(title)
```

## result
```
sharo@kirima:~$ python3 getNikkeiWebPageTitle.py 
<title>日本経済新聞</title>
日本経済新聞
```
おけまる水産。

## reference
- ref 1. https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406
- ref 2. https://qiita.com/rmanzoku/items/3bf4eb2b8b499ecb3dcf
Pythonでmod7占い (paizaランク S 相当)を解く

# 初めに
paizaスキルチェック基本問題を解いていたのですが、模範解答がなかったので自分で作ってみました。
言語はPython3です。

# 問題
Paizaの練習問題 mod7占い (paizaランク S 相当)
https://paiza.jp/works/mondai/skillcheck_sample/mod7?language_uid=python3
ログインしないと問題文が見れませんでした。
登録は無料ですぐにできるので、とりあえず登録してみることをおススメします。

# ダメな解答コード
- 三重ループ
- 計算量: O(n^3)
- 大規模データではタイムオーバーで失敗してしまいます。

```python:mod7_v1.py
n = int(input())
cards = [int(input())%7 for i in range(n)]

total = 0
for n1 in range(len(cards)):
    for n2 in range(n1+1,len(cards)):
        for n3 in range(n2+1, len(cards)):
            if (cards[n1]+cards[n2]+cards[n3])%7==0:
                total+=1
                
print(total)
```
#  ダメな解答コードその２
上記と同じ理由でダメです。

```python:mod7_v2.py
import itertools

n = int(input())
cards = [int(input())%7 for i in range(n)]

total = 0
for num_set in itertools.combinations(cards, 3):
    if sum(num_set)%7==0:
        total += 1

print(total)
```


# 解答コード
- 足す前に剰余を取っても、結果は同じ
 - (A+B+C)%7 は、(A%7 + B%7 + C%7)%7 と等しい
- 0~6の値のみ与えられたと考えてよい。
- 3つの値を選ぶ組み合わせは7*7*7 = 343

```python:mod7.py
n = int(input())
cards = [int(input())%7 for i in range(n)]
total = 0
for n1 in range(7):
    for n2 in range(7):
        for n3 in range(7):
            if (n1 + n2 + n3) %7 == 0:
                c1 = cards.count(n1)
                c2 = cards.count(n2)
                c3 = cards.count(n3)
                if n2 == n1:
                    c2 -= 1
                if n3 == n1:
                    c3 -= 1
                if n3 == n2:
                    c3 -= 1
                pat = c1*c2*c3
                total += pat
print(total//6)
```

# 参考
https://www.slideshare.net/paiza_official/mod7-note

# まとめ
いろいろ試行錯誤した結果、かなりシンブルになったので一人で感動してました。
今はこの感動を誰かに伝えられる語彙力と解説力が欲しいです。
スクラムにおけるストーリーポイントの整え方

## 概要
スクラムをやっていてこんな経験ないですか？
　「ストーリーポイントの妥当性が分からない（指標が無い）」
　「ストーリーからタスクを起こすと元が同じポイントでもブレまくる」
スクラム開発を始めて間もない方に多い事象だと思います。

そんな方にストーリーポイントを整える１つの方法をご紹介したいと思います。

## ストーリーポイントの整え方


ストーリーポイントを考える際に「要件」と「技術」の２つの軸で考えます。
要件の場合は確度が低ければ低いほど高くなり、技術の場合は難易度が高いほど高くなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153582/06f76a7b-48a3-c710-44b3-eda9d1e1b510.png)

ストーリーポイントの基準等はプロジェクトにも依るのであくまで参考ですがこんな感じになります。

|要件|技術|状態|ポイント|
|:--|:--|:--|:--|
|固定|簡単・安定|単純|1|
|たまに変わる|簡単・安定|複雑|2～5|
|たまに変わる|わりと簡単|複雑|8～13|
|ころころ変わる|むずかしい|複合的な複雑|20～|
|不明|不明|カオス|見積り不能|

状態の複雑度が高いと見積り精度が低い（ブレやすい）ので、プロダクトバックログリファインメントで要件を明確にしたり、必要に応じてストーリー分割を行うことで状態を単純に近づけていくことで、見積りの際のブレ幅も少なくなるはずです。

## 最後に
[認定プロダクトオーナー研修（CSPO®）を受講して学んだこと](https://qiita.com/takeday/items/d593251214e4076f6a67)の一部ではあるのですが、個人的に納得感がありましたのでご紹介しました。
仕事のタイミングの問題で私もまだ実践できていないので今後試していきたいと思っています。
少しでも参考になれば幸いです。
ASP.NET Core MVC クライアント検証に関するメモ

####環境
ASP.NET Core2.1 MVC

####デフォルトで使用されている検証用プラグイン・ライブラリ
・jQuery Validation Plugin
・jquery-validation-unobtrusive　←　MicrosoftのOSS

**ライブラリの読み込み設定箇所**
Views/Shared/_ValidationScriptsPartial.cshtml

**使い方**


```html:view.cshtml
@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
```



####表示メッセージの上書き

```html:view.cshtml
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}

<!--　上記より後に書くことで、エラーメッセージの上書きができる -->
<script>
	jQuery.extend(jQuery.validator.messages, {
		number: "数字を入力してください。",
		min: "1以上を入力してください。",   // ← <input type="number" min="1">のメッセージを上書きできる。
	});
</script>
```
https://stackoverflow.com/questions/2457032/jquery-validation-change-default-error-message



####要素の動的追加後の検証有効化
```js
$("form").removeData("validator")    // Added by jQuery Validate
	.removeData("unobtrusiveValidation");   // Added by jQuery Unobtrusive Validation
	
$.validator.unobtrusive.parse($("form"));
```

####検証の実行

```js

$("form").validate().form();
```

####エラーがあるか確認

```js
if ($("form").validate().errorList.length == 0) {
    // エラーなし
}else{
    // エラーあり
}
```



### カスタム検証実装
基本的には[このサイト](https://docs.microsoft.com/ja-jp/aspnet/core/mvc/models/validation?view=aspnetcore-2.1)を見れば全て書いてある。

#####よく使いそうなものを抜粋

1. [[Remote]属性を使う](https://docs.microsoft.com/ja-jp/aspnet/core/mvc/models/validation?view=aspnetcore-2.1#remote-attribute)
**使い方**：プロパティに[Remote]属性（アノテーション）を追加して検証可能。
**特徴**：検証する際にサーバー(指定時のController)と通信を行う。DBの値と入力内容を比較する際に便利。
**注意点**：クライアント側でしか処理が実行されないので、サーバーでは再度処理を実装する必要がある。

2. [カスタム属性を使う](https://docs.microsoft.com/ja-jp/aspnet/core/mvc/models/validation?view=aspnetcore-2.1#custom-attribute)
**使い方**：プロパティに独自の属性（アノテーション）を追加して検証可能。
**特徴**：新規でclassを作成しないといけないので、DBとの内容チェックは適していない気がする。クライアントとサーバー両方で検証が行われる。サーバーでの検証はpostされた際に他の検証と一緒に検証される。
**注意点**：クライアント側での検証は、一度サーバーでの検証が実行されないと有効にならないような気がする。

3. [カスタムクライアント側検証を使う](https://docs.microsoft.com/ja-jp/aspnet/core/mvc/models/validation?view=aspnetcore-2.1#custom-client-side-validation)
 **使い方**：クライアント側にjavascriptのコードを追加する。
 **特徴**：クライアント側だけに検証を追加したい際に便利。
Docker Compose でホストとクライアントの両方にて Rails を起動したいそこのあなた！

# なにこれ？
あんまりいないとは思うけど、Rails で Docker Compose を使用しているときにホスト側とクライアント側で Rails server を起動したいときはありませんか？自分の場合だと、System Test がどうしても Docker 環境のみで動作させる方法が見つけ出せなかったので、自分の場合 Rails を Ubuntu 環境でシステムテストを走らせて、それ以外は Docker 内のコンテナで動作させたいと思ったのでこういう環境が必要になった。そんなことをしようとしていると困るのが、(Rails のルート)/tmp/ に作られるファイルがホスト側とクライアント側で競合して、同時に起動できないという問題だった。そんなときに読んで解決できる糸口となったのが「[DockerでVolumeをマウントするとき一部を除外する方法](https://qiita.com/suin/items/e53eee56da23d476addc)」だったので、自分もココにその軌跡をのこしておくことにする。

# なにするの？
要は Rails 同時に起動できない原因は tmp フォルダが存在するからである。こいつさえなければ、ポートの競合とかはともかく、起動できるのだ。要はお互いが疎な関係になればいい。つまり、クライアントとホストの tmp フォルダが同期しなければいい。以下のコードは tmp フォルダだけはホストと動悸しないようにしてある。

```yaml
version: '3'

volumes:
  rails_tmp_data:
    
services:
  as:
    build:
      context: ./
    ports:
      - 3333:3000
    volumes:
      - ./:/usr/src/app/
      - rails_tmp_data:/usr/src/app/tmp/
    command: 
      /bin/sh -c "yarn install --check-files && bundle install && rails db:create && rails db:migrate && rm -f /usr/src/app/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0' --early-hints"

```
なお上記のコードは、要点だけに絞っている。そのため、コピペでは動かないのは、予めご了承いただきたい。

# これでおしまい
ポートの設定を端折ってしまった。そこらへんは、ココでは記事にしない。途中で記事を書くのがめんどくさくなったからね。ググるかなにかしてください。そんじゃねー。

# タイトルについて
スタパ斉藤マジリスペクト、というわけでなく、冗談抜きでこんなタイトルしか思いつかなかった。
Ubuntuのtofuを日本語環境に直す

# はじめに

日本語が文字化けして、四角に表示される（俗に言う、Tofu 豆腐 ）であったため、日本語表示の環境を設定する。

# 環境

Ubuntu 16.04.5 LTS
Windows10
Vagrant

# 手順

環境変数を確認すると、英語環境であるため、環境変数を日本語に変更する

```cmd
echo $LANG
en_US.UTF-8
```

２つの日本語パッケージ（**language-pack-ja-base**と**language-pack-ja**）を**apt**でインストールする

```cmd
sudo apt install language-pack-ja-base language-pack-ja
```

ホームに移動して、**.bashrc**の一番下に下記を追加する

```sh
case $TERM in
    linux) LANG=C ;;
    *)     LANG=ja_JP.UTF-8;;
esac
```

>解説
$TERMの環境変数には、ターミナルの種類がセットされる。因みに、自分の環境では、**xterm-256color**がセットされている。ターミナルの種類が**linux**の場合は、ローカライゼーションを**C**にして、それ以外の場合は、日本語にしている。ターミナルの種類がlinuxというのは、クライアントからターミナルでSSH接続して使うのではなく、サーバーを直接触る場合になる。この場合、日本語にすると逆に文字化けを起こすようなので、英語環境にするために、**C**をセットしている。サーバーを直接触る事はないよという場合であれば、**LANG=ja_JP.UTF8**の１行のみでもOK

**.bashrc**を実行して反映させる

```
source .bashrc
```

日本語パッケージをインストールすると、**/var/lib/locales/supported.d**に、**ja**というファイルが追加されるので中身を確認する。

```cat
cat /var/lib/locales/supported.d/ja
ja_JP.UTF-8 UTF-8
```

インストール済のロケールの一覧を表示して、**ja_JP.utf8**が表示される事を確認する

```cmd
locale -a | grep ja
```

デフォルトのロケールを確認すると英語になっています

```cmd
cat /etc/default/locale

#  File generated by update-locale
LANG="en_US.UTF-8"
LANGUAGE="en_US:"
```

デフォルトのロケールを、日本語に変更する。エラー？と思われるメッセージが表示されるが、ちゃんと更新されています。

```cmd
sudo update-locale LANG=ja_JP.UTF-8
*** update-locale: Warning: LANGUAGE ("en_US:") is not compatible with LANG (ja_JP.UTF-8). Disabling it.
```

変更された事を確認する。日本語が追加されて、英語はコメントされました

```cmd
cat /etc/default/locale

#  File generated by update-locale
LANG=ja_JP.UTF-8
#LANGUAGE="en_US:"
```

vagrant環境である場合、Windows側（PowerShell側）の文字コード環境が原因である事もある。上記でも問題が解決しない場合は、↓
https://qiita.com/FmtWeisszwerg/items/ccd34acfb2e88c2fb35f

>### 追加情報
↑にある、PowerShell側で、chcp 65001をしても解決しない場合、PowerShellのプロパティで、フォントをMSゴシックに変更すると、PowerShellで表示される日本語のtofuを正しく表示されるようになった。
Oracle QMNCおよびEMNCなどの古いプロセスについて

QMNCおよびEMNCなどの古いプロセスは、新しいマスター・プロセスのいずれかに含まれた。
----------------------------------------------------
Oracle Database 12.1より、QMNC, EMNCからAQPC, QM** に置き換えられた可能性がある。


----------------------------------------------------
不在の理由として、マニュアルの記述の通り、QMNCのプロセスが、マスター・プロセスとして、QM**の名前のプロセスに含まれているため。
プロセスとして、QM**の名前のプロセスに含まれているから。
以下プロセスは11gのもの。

    BACKUPSERVER:oracle:25%> ps -ef | grep ora_q
    oracle  4598     1  0 19:34:46 ?         0:00 ora_q003_fis
    oracle 25682     1  0 07:22:44 ?         0:00 ora_q001_fis
    oracle  4592     1  0 19:34:46 ?         0:00 ora_qm02_fis
あまり勧められない Docker-in-Docker のススメ

# Docker in Docker とは? #

----
## Docker in Docker とは? ##

* Docker コンテナ内に Docker 処理系そのものを収容
* 内側の Docker の中にコンテナを立ち上げると…
  →外から見ると入れ子状になる

----
## Docker in Docker の動作イメージ ##

![docker-in-docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314402/d1cf4d5b-f9ef-6c7b-8bf4-a846643e9758.png)

----
# ミニマムな構成 #

オフィシャルのイメージがあるのでそれを使う (タグの後ろに `-dind` と付いている)

```docker-compose.yaml
---
version: "3.7"
services:
  docker:
    image: docker:19.03-dind
    privileged: true
```

ヤバいです、主にセキュリティー的な意味で。

```yaml
    privileged: true
```

(ヤバすぎるので抜粋再掲)
詳しい説明は省略しますが、 Linux 内に隔離された空間を作るには相当の特権が必要なようです。

----
# おしまい #

----
# んなわけあるか!! #

----
# 色々いじってみる #

----
## ミニマム構成の問題点 ##

* あんまりメリットが見えない
* 内側の Docker の通信路が TCP
   
    → docker build の時にコンテキストといって色々ファイルを Docker のデーモンに送りつけているのだが、その通信路と考えるといささか心もとない

----
## メリットを出そう ##

隣接するコンテナからの指示で、内側の Docker にコンテナを建てられると便利そう。

```docker-compose.yaml
---
version: "3.7"
services:
  docker:
    image: docker:19.03-dind
    privileged: true
  frontend:
    image: docker:latest
    depends_on:
      - docker
```

----
## 通信路の改善 ~よし、ならば UNIX ドメインソケットだ~ ##

 `/var/run/docker.sock` を隣接するコンテナと共有できれば… そういう時は `volumes` を使いましょう。

```docker-compose.yaml
---
version: "3.7"
services:
  docker:
    image: docker:19.03-dind
    privileged: true
    volumes:
      - run:/run:rw  # /var/run は /run へのシンボリックリンクなので… 以下同様
    environment:
      - DOCKER_TLS_CERTDIR=
  frontend:
    image: docker:latest
    volumes:
      - run:/run:rw
    depends_on:
      - docker
    environment:
      - DOCKER_HOST=unix:///var/run/docker.sock

volumes:
  run:
    # tmpfs-as-a-volume: https://stackoverflow.com/a/45759927
    driver_opts:
      type: tmpfs
      device: tmpfs
      o: size=1M,mode=0755,uid=0,gid=0
```
IntellijIDEA＋SpringBoot＋Gradle＋MyBatisの設定例

属性もりもり。

IDEAはCommunityの2019.3.1
Javaのバージョンは11
SpringBootは2.2.4.RELEASE
Gradleは5.2.1
MyBatisは3.5.2
(mybatis-spring-boot-starter:2.1.0)

```gradle:build.gradle
group 'com.xxx.xxx'
version '0.1-SNAPSHOT'

// Spring Boot ver:2.2.4
buildscript {
    def springBootVersion = '2.2.4.RELEASE'
    repositories { mavenCentral() }
    dependencies {
        classpath ("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

// Javaプラグイン
apply plugin:'java'
// 各種IDEの設定ファイルを出力するGradleプラグインの設定
apply plugin:'idea'
apply plugin:'eclipse'
// SpringBoot関連のプラグイン
apply plugin:'org.springframework.boot'
apply plugin:'io.spring.dependency-management'
// warファイルを出力する
apply plugin: 'war'

// Javaバージョン
def javaVersion = JavaVersion.VERSION_11
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

// 依存ライブラリ取得先リポジトリ
repositories { mavenCentral() }
// 依存ライブラリ
dependencies {
    // SpringBoot
    compile("org.postgresql:postgresql")
    compile("org.springframework.boot:spring-boot-devtools")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-jdbc")
    testCompile("org.springframework.boot:spring-boot-starter-test")
    // JUnit
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.2.0'
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-params', version: '5.2.0'
    // GSON
    compile("com.google.code.gson:gson")
    // myBatis
    compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0")
    compile("ch.qos.logback:logback-classic")
    testCompile("org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.1.0")
}
test {
    // gradle buildの時にJUnit5を使うようにする
    useJUnitPlatform()
    // テストの並列実行スレッド数
    maxParallelForks = 4
    filter{
        // 表に出せないやつなので伏せる
    }
}

// リリースバージョンをgradle.propertiesから取得し設定
def applicationVersion = project.properties['release.version']
version = applicationVersion
def springBootApplicationName = 'hogehoge'
bootJar {
    archiveBaseName  = springBootApplicationName
    version = applicationVersion
}
bootWar {
    archiveBaseName  = springBootApplicationName
    version = applicationVersion
}
```
属性もりもりで、ご参考になれば幸いです。
LIKE句忘備録（ワイルドカード、エスケープ）



# LIKE句とは 
□ 「任意の文字列を含む」データを取得する場合に用いるものです。
　  ここでは仮に、任意の文字列を「ひよこ」とします。

▼ LIKE句の基本的な書き方

```ruby:
WHERE カラム名 LIKE '%ひよこ%'
```
LIKEの後の文字列を含むレコードのみを返すことができます。
上記のように%で文字列を囲む場合は、ひよこという文字が含まれるレコード「全て」が対象です。
例）ひよこ饅頭、カラーひよこ、可愛いひよこのお世話 

▼ 前方一致

```ruby:
WHERE カラム名 LIKE 'ひよこ%'
```
%が後ろにだけある場合、「文頭に」ひよこがあるレコードのみを返します。
例）ひよこ饅頭、ひよこのお世話 

▼ 後方一致

```ruby:
WHERE カラム名 LIKE '%ひよこ'
```
%が前にだけある場合、「文末に」ひよこがあるレコードのみを返します。
例）カラーひよこ、可愛いひよこ

# ワイルドカード
LIKE句では「％」や「_」を使用します。
上記の例では「％」の方を使っていましたね。

「％」と「_」は以下のような違いがあります。


　　　% ・・・ 0文字以上の任意の文字列
　　　_ ・・・ 任意の1文字
　　





# エスケープ

LIKE句で「%」や「_」を検索することは出来ません。
ワイルドカードとして使用しているため、文字列扱いされないためです。


これらを含む文字列を検索する場合は、エスケープキーワードを使いましょう。
▼ エスケープ処理の例

```ruby:
WHERE カラム名 LIKE '果汁100?%' ESCAPE '?'
```
「ESCSPE」の後に指定した値を「%」の前につけることで、「%」を検索文字列として認識させることが出来ます。ここではエスケープ記号として「？」を指定しましたが、この記号は任意のものを指定することが可能です。
AWS の EC2 に Amazon Linux を立ち上げて最初にやったことメモ

## OS最新にアップデート
```
$ sudo yum update -y
```

とりあえずどの記事見てもみんなやってる。
普通にパソコン買っても最新に更新かけるもんね。

セキュリティの更新とか不具合の修正とかいろいろあるんだろう。

## タイムゾーンを日本に変更

```
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

## yum-cron

「yum-cron」ってなんだ？

> yum-cron パッケージは、アップデートを自動的に確認し、ダウンロードし、適用するための便利な方法を提供します。 
> パッケージをインストールするとすぐに yum-cron パッケージの cron ジョブが有効になり、特別な設定は必要ありません。 
> 通常の日次 cron ジョブの実行時に、このジョブが実行します。

なるほど

```
# yum-cron インストール
$ sudo yum install yum-cron -y

# 有効化確認
$ sudo chkconfig --list yum-cron

# 有効化
$ sudo chkconfig yum-cron on

# 自動更新設定
$ sudo sed -i "s/^apply_updates.*$/apply_updates = yes/g" /etc/yum/yum-cron.conf

# 起動
$ sudo service yum-cron start

# 起動確認
$ sudo service yum-cron status
```

## 文字コードを日本語に変更

```
# 文字コードを日本語に変更
$ sudo sed -i "s/en_US\.UTF-8/ja_JP\.UTF-8/g" /etc/sysconfig/i18n
```

## 不要なサービスの停止

```
# 不要サービスの一括設定（GUI）
$ sudo ntsysv
```

現時点で何が不要なのか分からないのでそのままにしておく。
[Tab]で移動、[Space]で決定、という操作は分かった。
PytorchでMnistのGrad-CAM的なことをしてみる

#Grad-CAMとは
AI(CNN)がどこを見て判断したかを可視化しようとする(Explainable AI)手法のひとつで、勾配に注目した方法です。

個人的にはちょっと面倒くさそうだな...と触れないようにしてきたのですが、実際はそこまで複雑ではなかった話です。

この記事の目的
・GradCamを簡単に何となく理解する
・Mnistで実装を試みる
・数式はなし

#Grad Camの方法
ここでは、クラス分類における方法について説明します。

基本的な分類器は以下の図のように、ワンホットベクトルのを予測しますが、このとき、畳み込み層で2次元の特徴を抽出し、全結合層では得られた画像特徴を分類しています。可視化の際に問題になるのが、全結合層にいれることにより、2次元方向の特徴でなくなることです。各ノードが画像のどこからきているかが、わからなくなってしまいます。

<img width="451" alt="スクリーンショット 2020-02-25 15.50.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/119b6458-780f-c042-d1aa-0d1c38d0bea9.png">

そこで、全結合層を使わなくしたのが、FCN(Fully Convolutional Network)です。これはシンプルに最後まで畳み込み層にすることで全結合層を使わない方法です。FCNを使うと、出力層の直前まで2次元の特徴を保つことができます。

Grad-CAMでは、最終層では画像サイズが（１×１）になるようにプーリングを行います。Global Average poolingと言われたりします。

また最終層ではチャネル数 = クラス数となっている必要があります。

つまり、あるチャネルとあるクラスが1対1で対応させることで、そのクラスがどこを見て判断したのかを明確にしようということです。

さて、正解がワンホットベクトルであることから、正解のチャネルでは画素値の平均が1、それ以外では画素値の平均が0になるように学習されます。
図だとこんな感じです。中間では、0~9なので10クラスあります。

<img width="575" alt="スクリーンショット 2020-02-25 17.01.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/db33bbeb-1df7-eac2-b494-294a801d74b3.png">

というわけで、上の構造で実装してみました。

#結果

全部つくるのは面倒なので4つだけ。

<img width="946" alt="スクリーンショット 2020-02-25 20.07.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/099e4815-7218-ca47-7e2e-28d106a04e04.png">

<img width="971" alt="スクリーンショット 2020-02-25 20.07.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/a0d1f229-4eb4-32f2-8c8b-7b48cb4893e2.png">

それぞれ、正解ラベルにおける画像において強く反応がでていることがわかります。
また、0の時は6にも少し反応してますね。逆に6の時はあまり0に反応してないです。
あと普通に数字以外のところも結構反応してますね。
「何もそこにはない」という特徴も存在するわけなのでなんとも言えないですね

また精度は...

Accuracy| 91.34 %
---|---

うん、(とても)低いです。
これは元々指摘されている問題で、全結合層を畳み込み層に置き換えると単純に精度が落ちます。


#感想
・ネットワーク構造めんどくさい
特に、MaxPoolingを何も考えずにやると、CAMの画質が下がっていくので、どうしたもんかなぁと思いながらなんとなく妥協点を探しました。

・この方法ではやはりワンホットエンコードを予測しようとすることから、画像全体が赤くなるようなロス関数となっている気がする。必ずしも数字の部分だけがぼんやりと出る必要がない。もう少し複雑な問題だときちんとでるのかなぁ...。うーん。

・どこかで、Grad-CAMは機械学習でみているところではない的な論文も見た気がするので今回はお試しにしては上出来。

#リンク
[github](https://github.com/daikiclimate/Mnist_CAM/tree/master)
お金あんまりないけどそこそこAWS使ってるユーザがAWSサポートを利用するときの個人的ガイドライン

※個人的ガイドライン=これまで AWS サポートと何度かやりとりした中で得たノウハウをまとめたもの
※AWSサポートを非難するつもりはまったくない。むしろいつも大変お世話になっています。

# 私のスペック
* AWSをそこそこ使っている（コスト的ではなく、テクニカル的に）。
* 利用しているAWSサービスの挙動をなるべく詳しく把握したい。
* 新し目のAWSサービスをちょこちょこ試して仕様を確認したい。
* 金融系サービス的なクリティカル案件はないので、基本的にはAWSへ調査依頼は行わない。
* サポートに入るお金があんまりない。


# AWSサポート

### 参考

* [AWS サポートのプラン比較](https://aws.amazon.com/jp/premiumsupport/plans/)
* [AWS サポートのプランの料金](https://aws.amazon.com/jp/premiumsupport/pricing/)
* [開発者サポートにおける初回応答時間の考え方](https://aws.amazon.com/jp/premiumsupport/sla-dev-support-jp/)
 
### サポートプラン
* AWSサポートは４つある（ベーシック、開発者、ビジネス、エンタープライズ）。
* AWSアカウント開通直後のデフォルトのプランは「ベーシック」で、無料。
* ベーシック以外はすべて有料。
* とうぜん、サポートプランが高価なものほど手厚いサポートを受けられる。

### どのサポートがベストなのか
* お金があれば、ビジネスなりエンタープライズ。
* お金が無ければ無料のベーシックプラン。
* ベーシックプランでは質問できない技術的なことを質問したい場合は開発者プラン以上。
* 問い合わせ以外のサポート利用
 * ビジネスプラン以上だと、[AWS Trusted Advisor](https://aws.amazon.com/jp/premiumsupport/technology/trusted-advisor/) のフル機能が利用できる。（ベーシック、開発者プランでは、一部利用制限がある）
 * ELBの暖機運転申請は、ビジネスプラン以上で可能になる。

### 私のスペックの場合・・
* 技術的問い合わせは大きく分けると次の２つ
 1. 各サービスの技術的な仕様に関する疑問<br /> ⇒ ちょっと試してみて疑問に思ったことを質問したい。<p />

 * 各リソースに発生した問題についての原因調査・究明<br /> ⇒ 金融系サービス的なクリティカル案件はないので、調査依頼はしない。<br />（何かあったら問題のリソースを削除して作り直したり、停止⇒起動で対応・・）

* サポート料金は、「基本料金」または「毎月の AWS 料金の ◯％ 」のどちらか高い方なので、技術的問い合わせ専用のAWSアカウントで「開発者プラン」に入り、基本の 29.00USD/月 で抑えたい。<br />ただし、各サービスの技術的な仕様に関する疑問を質問する場合でも、その疑問に至った実際のリソースの状態を調査してもらうことになるので、調査が終わって回答をもらうまではそのリソースに対する従量課金が発生する。

* なので、開発者プラン専用のAWSアカウントで普段は各種AWSリソースは作らず、 他のAWSアカウントのリソース利用時に発生した疑問や、新し目のことをちょっと試したときの仕様の確認をするときに、開発者プラン専用のAWSアカウントでその状態を作って質問をするようにしている。確認が終わったら速やかに調査用リソースを削除する。


# 質問内容と問い合わせ窓口
### アカウントや料金に関する質問
* ベーシックプランからでも質問可能。
* AWS カスタマーサービス窓口へ質問する。
* AWS Support ページから、Create case で「Account and billing support」をチェックして、Type からカテゴリを選択する。
![20200226-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/1568688e-4505-aa0b-04ef-420b3653892c.png)
* AWSサービスで発生するコストに関する質問にも答えてくれる。
* 質問例
 * AWS Backup で同一リソースID（EC2インスタンスID）の バックアップを複数作成した場合、 ２つ目以降のEBSスナップショットは増分バックアップになり、ストレージコストは削減されますでしょうか？ 
 * スナップショットのコストとなる容量の計算は、次であっていますでしょうか？「最初に取得したEBSの実質容量＋２番目に取得したEBSの増分量」

### 各サービスの技術的な仕様に関する疑問
* ベーシックプランからでは質問できない。開発者プラン以上から質問する。
* 質問するAWSアカウントと同じAWSアカウント内に、その疑問に至った状態のリソースが存在する必要がある。
* AWS Support ページから、Create case で「Technical support」をチェックして、Service から質問対象のAWSサービスを選択する。<br />Severityでは、一般的な質問・仕様確認の場合は「General guidance」を、原因調査の場合は「System impaired」を選択する。
![20200226-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/86d52fc3-76f0-5752-e81b-71a282c81f90.png)
* 質問例
 * AWS Backup EC2 で作成した AMI を復元した EC2 にパブリックIPアドレスがアタッチされないのですが、そういう仕様なのでしょうか？

### 料金とサービスの仕様が密接に関わっている場合
* ベーシックプランからでは質問できない。開発者プラン以上から質問する。
* カスタマーサービス担当窓口と技術サポートのどちらに問い合わせたらよいか迷ったときは、ユーザー側で判断してどちらかに質問を投げると、AWSサポート側で適切な窓口へ引き継いでくれる。
【Linux】フォルダを圧縮してリモートからローカルへファイル転送

# フォルダをフォルダを圧縮してリモートからローカルへファイル転送

## 1.リモートにあるフォルダをZipファイル化

```command:command
zip -r 圧縮後のフォルダ名（例えばwordpress.zip） 圧縮前のフォルダ名（例えばwordpress）
```

## 2.リモートにsftp接続をする

```command:command
> sftp ログイン名@ホスト名（例えばroot@192.168.0.0）
> パスワード入力
sftp> get -r ディレクトリ名 
```

このようにすると、ローカルのホームディレクトリにフォルダが転送されているかと思います！
CodeGeneratorRequest ジェネレータ

protocのプラグインを作るときに、protocから呼び出される形で動かすとプロセスをデバッガにアタッチさせるのが難しいので単体で動かしたい。
単体で動かす場合stdinから `CodeGeneratorRequest` をバイナリで入力する必要がある。

`CodeGeneratorRequest` をバイナリファイルとしてとりだすprotoc pluginを作った。


<script src="https://gist.github.com/ku/57c4fc1c70e99e24774d88cd5be5f6e7.js"></script>

https://gist.github.com/ku/57c4fc1c70e99e24774d88cd5be5f6e7

```golang
//
// CodeGeneratorRequest binary generator
// go build  -o protoc-gen-echo  main.go
// protoc --plugin=./protoc-gen-echo --echo_out=. test.pb

package main

import (
	"io"
	"io/ioutil"
	"log"
	"os"

	"github.com/golang/protobuf/proto"
	descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor"
	plugin "github.com/golang/protobuf/protoc-gen-go/plugin"
)

func parseReq(r io.Reader) (*plugin.CodeGeneratorRequest, error) {
	buf, err := ioutil.ReadAll(r)
	if err != nil {
		return nil, err
	}

	ioutil.WriteFile("CodeGeneratorRequest.bin.pb", buf, 0644)

	var req plugin.CodeGeneratorRequest
	if err = proto.Unmarshal(buf, &req); err != nil {
		return nil, err
	}
	return &req, nil
}

func processReq(req *plugin.CodeGeneratorRequest) *plugin.CodeGeneratorResponse {
	files := make(map[string]*descriptor.FileDescriptorProto)
	for _, f := range req.ProtoFile {
		files[f.GetName()] = f
	}

	var resp plugin.CodeGeneratorResponse
	for _, fname := range req.FileToGenerate {
		f := files[fname]
		out := fname + ".dump"
		resp.File = append(resp.File, &plugin.CodeGeneratorResponse_File{
			Name:    proto.String(out),
			Content: proto.String(proto.MarshalTextString(f)),
		})
	}
	return &resp
}

func emitResp(resp *plugin.CodeGeneratorResponse) error {
	buf, err := proto.Marshal(resp)
	if err != nil {
		return err
	}
	_, err = os.Stdout.Write(buf)
	return err
}

func run() error {
	req, err := parseReq(os.Stdin)
	if err != nil {
		return err
	}

	resp := processReq(req)

	return emitResp(resp)
}

func main() {
	if err := run(); err != nil {
		log.Fatalln(err)
	}
}

```
【未経験転職】【① 3-4月編】2020年3月末でプログラマー目指して退職する31歳公務員がロードマップを立ててみた！

# はじめに

みけた＠プログラマー転職、公務員31歳です！

仕事をしていく中で「これじゃない感」が募っていく中、
無謀にもプログラマー転職を目指して、退職願を提出してしまいました！！！

スタートダッシュを切る必要があるということで、
そのロードマップを作成してみました。

# プログラマー転職に向けてのロードマップ（3〜4月）
## ○ 学習計画
エクセルを使って、まとめてみました。
![プログラミング学習スケジュール_page-0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429155/9dc16f73-cd39-7d51-98b4-835f654e63b5.jpeg)
![プログラミング学習スケジュール_page-0002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429155/d638a211-2b60-acd0-1dd4-da58e360ccd9.jpeg)

## ○ 学習時間

スケジュールを確認し、プログラミングのための学習時間を以下のように設定しました。
就業中であるため、3月の学習時間は甘めに見積もりました。

【勉強時間】
　 3月　 30時間
　 4月　170時間

【Progate】
　 HTML/CSS　　20時間
　 Javascript　　22時間
　 jQuery　　　　12時間
　 Ruby　　　　　7時間
　 Ruby on Rails　65時間
　 合計　　　　　126時間
 
　※　基本的にprogateは２周する予定です。
　　　Rubyについては既にやったことがあるので、１周のみの予定。
　※　所要学習時間については、progateに記載の修了時間を参考にしました。

【Railsチュートリアル】
　 全14章を2周する　74時間
　（ただし、１周目は演習をせず、コードもコピペで済ます）

　※　Railsチュートリアルの学習時間についてはQiitaのこちらの記事を参照しました。
　　　ただ、他のみなさんの反応を見ると、結構時間がかかっているようです。
　　[【Qiita】Railsチュートリアルの各章にかかった時間](https://qiita.com/Kiichiro-T/items/3abd4185a5c0e32e03fa)

##○ 学習内容について
何を学習するかについては下記を参考にしました。

・[【Qiita】未経験からRuby on Railsを学んで仕事につなげるまでの1000時間メニュー]
(https://qiita.com/saboyutaka/items/1a8c40e105e93ac6856a)
・[【Qiita】化学系研究者が完全未経験からWeb系自社開発企業に転職するまで]
(https://qiita.com/fuku_tech/items/b8db09720c6d38eb27b9)
・[【プログラミングスクール】「Dive into Code」が事前学習として推奨している内容]
(https://diveintocode.jp/web_engineer_job)

なお、集中的に学んだ方が効率的であると感じていたため、
　① ProgateでRailsのコースを終えた後
　② 直ちにRailsチュートリアルへと移行する
以上のようなスケジュールで学習することとしました。

自社開発スクールへの就職実績に定評のあるポテパンキャンプでは、
>キャリアコースの応募条件
「Railsチュートリアルと他Web開発の基礎を学習済み」であること
[　参照元：POTEPAN CAMP コースについて](https://camp.potepan.com/course)


となっているので、Railsチュートリアルはいずれにしても避けて通れないのかなと。


とはいえ、
[【Qiita】未経験からRuby on Railsを学んで仕事につなげるまでの1000時間メニュー]
(https://qiita.com/saboyutaka/items/1a8c40e105e93ac6856a)
では、Bootstrapを使ったWebページ作成やSinatraを使ったWebアプリケーション作成を推奨しているようなので、モチベーションが上がらなくなれば、方向転換も検討していきます。

### ○ Qiitaへの技術記事投稿

とりあえず、Progateをやっていく中で疑問点等が出てきたら、Qiitaにまとめていきます。
また、Railsチュートリアルのノートも公開していく予定です。

転職にあたっても、これがアピールになるらしいです。
（動機は極めて不純です）

### ○ 100DaysOfCode

流行っている（いた？）らしいです！
本格的に学習を開始する、4月からツイッターで発信していきます。

また、3月も勉強をしたタイミングで適宜情報発信していきます。
[ツイッターアカウントはこちら](https://twitter.com/miketa_webprgr)
僕のCMDスクリプト

自分用の備忘録
随時更新
基礎の基礎から

###全体的に参考にさせていただいたまとめ
[Windowsバッチまとめ](https://qiita.com/tomotagwork/items/5b9e08f28d5925d96b5f)

[知識ゼロからのwindowsバッチファイル超入門](https://jj-blues.com/cms/command_and_option_list/)


####基礎の基礎

```bat
--コメント-----
rem xxxxxx

--変数の宣言-----
set [変数名] = x

--変数を使用する時-----
set [変数名] = %[変数名]%

--メッセージ表示-----
echo [メッセージ]

--コマンド復唱停止
@echo off

--時間の表示
@time /t  --/tで「表示だけ」というオプション

--日付の表示
@date /t  --/tで「表示だけ」というオプション



```

####for文
[.bat（バッチファイル）のforコマンド解説。](https://qiita.com/plcherrim/items/67be34bab1fdf3fb87f9)

```
(オプション無し) ディレクトリ内を対象にとる
/d ディレクトリ（フォルダ）名を対象にとる
/r ディレクトリ名及びそのサブディレクトリ内（そのフォルダの中のファイル名やフォルダ名）を対象にとる
/l 値を指定して代入する
/f テキストファイル内の文章に対してトークンを取り出して代入する
```

####ラベル
```bat
--例
@echo off
 
rem 「test」ラベルまで移動
goto :test
 
echo ここは通りません。
 
rem 「test」ラベル
:test
echo ここまで飛んできました。
```


####ファイル操作
```bat
--ファイルの上書き
 [ファイルに書き出したい文字列] > [書き込みファイル名]

--ファイルの追記
[ファイルに書き出したい文字列] >> [書き込みファイル名]

```

####文字列の置換
`setlocal enabledelayedexpansion`は遅延環境変数を有効にするためのおまじない。

```bat
--文字の置換
setlocal enabledelayedexpansion

for /f "delims=" %%a in (test.tsv) do (
    set line=%%a
    set line_cng=!line:NULL=!
    echo !line_cng!>>出力\%%a.tsv

endlocal
```




####SQL実行
[【備忘録：SQLServer】バッチからSQLを実行する](
https://qiita.com/necocha0v0/items/a27ca72bcaa9dfd9a161)

[オプション](https://docs.microsoft.com/ja-jp/sql/tools/sqlcmd-utility?view=sql-server-ver15)

```bat
rem 例
sqlcmd -S サーバー -d DB -E -i sql -v param=1 -b -s"	" -W -o output.csv -h -1

-S 接続サーバー
-d 接続DB
-E セキュリティ接続を使用して SQL Server にサインイン
-i インプット
-b ミスったら1返す
-s 出力の際のセパレーター
-h ヘッダーの有無
```

####csv読み込み
[AdminWeb](https://www.adminweb.jp/command/bat/index10.html#section1)

```bat
for /f "tokens=2,3　delims=, " %%a IN (ファイル名) do (処理)

token=は各行の何個目の要素を取得するか
delims=, カンマ区切りを指定
%%aは何て変数に入れるか（今回だと%%aと&&bに入るらしい）

```
先読み/後読みアサーションで重複マッチング

## 先読み/後読みアサーションで重複マッチング
Python3ではデフォルトで重複しないマッチングを行う。一度マッチした文字は「消費」されるため、例えば「AAAA」から「AA」を検索した場合、最初2文字と最後2文字の2箇所にマッチし、中間にはマッチしない。同じく、`_hoge_foo_baaar_`から`_[a-z]+_`を検索すると、`_foo_`はマッチしない。

重複したマッチングを行うときは、文字を「消費」しない先読みアサーション/後読みアサーションを使う。
（参考：[Pythonの正規表現で重複したマッチのやり方（先読みアサーション）](
https://qiita.com/kawarayu/items/64b44e04eb57cbef8718)


ということで手を動かして試してみた。

```python3
import re
s = "_hoge_foo_baaar_"
key = "(?<=_)[a-z]+(?=_)"

for m in regex.finditer(key, s, overlapped=True):
  print(m)
# <regex.Match object; span=(1, 5), match='hoge'>
# <regex.Match object; span=(6, 9), match='foo'>
# <regex.Match object; span=(10, 15), match='baaar'>

# 一致位置を取り出す
m = [m.span() for m in re.finditer(key, s)]
print(m)
# [(1, 5), (6, 9), (10, 15)]
```

macthには先/後読みアサーションで指定した部分は含まれない．
含みたい場合は多分 regex 使ったほうが早い(公式でも推奨されているreの上方互換ライブラリらしい)

```python3
import regex
s = "_hoge_foo_baaar_"
key = "_[a-z]+_"

for m in regex.finditer(key, s, overlapped=True):
  print(m)
# <regex.Match object; span=(0, 6), match='_hoge_'>
# <regex.Match object; span=(5, 10), match='_foo_'>
# <regex.Match object; span=(9, 16), match='_baaar_'>

ms = [m.span() for m in regex.finditer(key, s, overlapped=True)]
print(ms)
# [(0, 6), (5, 10), (9, 16)]
```

### 参考
https://docs.python.org/ja/3/library/re.html