OmniAICreator/Qiita-1.07M huggingface dataset:
DockerでPHP7.4の環境を整えるときの問題点

<!-- 
@date 7/9 Thu
@author Yuto Uemura
For qiita
 -->

# DockerでPHP7.4の環境構築をした話

## 結論
PHPのDockerfileに以下を加える。

- DockerでPHP7.4系以上を使うなら、ライブラリの「oniguruma」を入れる。
    - `apk add --update --no-cache oniguruma-dev \`を追記。
- DockerでMySQLを使うなら、PDOドライバーを入れよう。
    - `RUN docker-php-ext-install -j$(nproc) pdo_mysql`を追記。

## 対象
- DockerでPHP7.4以上を使いたい方
- DockerでMySQLの環境構築。

## 環境
- OS Catalina 10.15.4
- Docker 2.3.0.3
    - php:7.4.7-fpm-alpine


## はじめに
phpenvを用いてPHPのバージョン管理すればDockerなんて使わなくていいやと思ってたんですけど、MySQLを使うことになって、5.7と8.0系で認証方式が違うとか、8.0系の方が早いとかありますけど、手元のpcにbrewで8.0から5.7系にダウングレードしたらお手上げ状態になったので、勉強も兼ねてサクッとDockerを使いました。
なお、Dockerfileのことしか主にコードを開示していないので、その他は頑張ってください。

## 問題点
- php:7.4.0*の環境のDockerfileをビルド時`No package 'oniguruma' found`とエラー。
- PHPでMySQLを使おうとすると`could not find driver`というエラー

上記にもあげている通り、2点問題に遭遇しました。  

### php:7.4.*の環境のDockerfileをビルド時`No package 'oniguruma' found`とエラーがでよる。
はい、１つ目です。  

```dockerfile:Dockerfile
RUN apk upgrade --update \
  && apk add --update --no-cache oniguruma-dev \ # ここ
  && apk --no-cache --virtual .build-deps add make g++ gcc re2c autoconf \
  && apk --no-cache add gettext-dev libzip-dev curl-dev \
  && docker-php-ext-install -j$(nproc) gettext mbstring zip opcache ctype json bcmath sockets curl \
  && pecl channel-update pecl.php.net
```

php:7.4以降は`libonig-dev`というパッケージをする必要があるそうです。  
[https://github.com/kkos/oniguruma](https://github.com/kkos/oniguruma)  
上記2行目にも書いていますが、`apk add --update --no-cache oniguruma-dev`を追加して下さい。


### PHPでMySQLを使おうとすると`could not find driver`というエラー
はい、２つ目です。  
このエラーが出ている人は`phpinfo();`をphpファイルに書いてもらって、
PDO項目を見ていただくとわかると思うのですが、`sqlite`しかないと思われます。  
つまりデフォルトでドライバーはsqliteしか入ってないらしいですね。  
これには少しびっくりしたと同時に、コンテナは本当に最小限のものしか入ってないのかと思いましたね。。。  
というわけでDockerfileに書きましょう。
  
```dockerfile:Dockerfile
# PDO driver(MySQL)
RUN docker-php-ext-install -j$(nproc) pdo_mysql
```

先ほどと同じDockerfileに追記してください。  
buildした後、`phpinfo();`のPDO driver項目を見ると`mysql`が追加されていると思います。  
他のデータベースを使いたい時も同じようにDockerfileにかけば使用できるでしょう。


### PHPのDockerfile全体
今回はUbuntuでなく、Alpineで軽量化しています。
なので皆さんご存知のapt-getは使えず、apkというパッケージマネージャを使う必要があります。

```dockerfile:Dockerfile
FROM php:7.4.7-fpm-alpine

ARG environment

RUN apk upgrade --update \
  && apk add --update --no-cache oniguruma-dev \
  && apk --no-cache --virtual .build-deps add make g++ gcc re2c autoconf \
  && apk --no-cache add gettext-dev libzip-dev curl-dev \
  && docker-php-ext-install -j$(nproc) gettext mbstring zip opcache ctype json bcmath sockets curl \
  && pecl channel-update pecl.php.net

# PDO(MySQL)
RUN docker-php-ext-install -j$(nproc) pdo_mysql
```
___
## まとめ
- PHP7.4以上を使う場合はパッケージ`oniguruma`をDockerfileに追記する。  
- PDOドライバーはデフォルトでsqliteしか入ってない。  

## 参考
- [Alpine LinuxでDockerイメージを劇的に小さくする](https://qiita.com/asakaguchi/items/484ba262965ef3823f61)
- [oniguruma](https://github.com/kkos/oniguruma)
JavaScriptのソースコードを読んでいる時に遭遇したこんな書き方知らなかったみたいなものたち

# この記事は何？
　私は最近とある会社でインターンとして働きはじめ、JavaScriptのソースコードを読んだり書いたりすることが増えました。私はJavaScriptだけでなく、PHPやC#でプログラムを書いたこともあるので、基本的な構文についてはおおよそ把握しているつもりでしたが、プログラムを読んでいる中で、この記述は一体なんなんだろう？というようなコードを見かけることが多かったので、備忘録的にこの記事にそれらをまとめていこうと思いました。この記事は随時、内容を追加していきたいと思っています。

## delete文
　`delete オブジェクト名.プロパティ名` で指定したプロパティをオブジェクトから削除する。

```JavaScript:sample.js
let obj = {};
obj.prop = 1;

console.log("プロパティ削除前:" + obj.prop );

delete obj.prop;
console.log("プロパティ削除後:" + obj.prop );
```

実行結果
![samplejs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481365/9b1e51f9-8187-0dd5-09ed-53a857df5d6c.png)
SwiftUIでSearchBarを使用する

#はじめに

SwiftUIでSearchBarの実装方法を記録しておきます。
間違い等あれば、指摘をお願いします。

```

struct SearchBar: UIViewRepresentable {
    @Binding var text: String
    var placeholder: String

    // それぞれの処理を記述
    var onCommit: (String) -> Void

    class Cordinator: NSObject, UISearchBarDelegate {
        @Binding var text: String

        var onCommit: (String) -> Void

        init(text: Binding<String>, onCommit: @escaping (String) -> Void) {
            _text = text
            self.onCommit = onCommit
        }

        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            text = searchText
            searchBar.showsCancelButton = true
        }

        func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
            searchBar.resignFirstResponder()
            
            // cancel ボタンを押すまで、cancelを有効に
            if let cancelButton = searchBar.value(forKey: "cancelButton") as? UIButton {
                cancelButton.isEnabled = true
            }
            searchBar.endEditing(true)
            if let text = searchBar.text {
                onCommit(text)
            }
        }

        func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
            text = ""
            searchBar.resignFirstResponder()
            searchBar.showsCancelButton = false
            searchBar.endEditing(true)
            onCommit("")
        }

    }

    func makeCoordinator() -> SearchBar.Cordinator {
        return Cordinator(text: $text, onCommit: onCommit)
    }

    func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar {
        let searchBar = UISearchBar(frame: .zero)
        searchBar.delegate = context.coordinator
        searchBar.placeholder = placeholder
        searchBar.searchBarStyle = .minimal
        searchBar.autocapitalizationType = .none
        return searchBar
    }

    func updateUIView(_ uiView: UISearchBar, context:  UIViewRepresentableContext<SearchBar>) {
        uiView.text = text
    }

}


```


#参考
https://medium.com/@axelhodler/creating-a-search-bar-for-swiftui-e216fe8c8c7f
Mysql2::Error::ConnectionErrorを解決します

## 環境/バージョン
ローカルでやってます
Ruby v2.5.1
Rails v5.2.4
MySQL v8.0.19

## 何が起こった？

railsプロジェクトを作成したあと、`rails s'してみたらこんなエラーに遭遇

```shell
Mysql2::Error::ConnectionError (Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)):
```

## どうやって解決した？

エラー文からみてわかる通り「あ、MySQL」かとすぐわかります。

`ConnectionError`とあるので「繋がっていませんね〜」ってすぐわかります。

`database.yml`を調べて見る。

```yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

  ---以下省略---
```

ymlファイルのpasswordが抜けてる。
この間、MySQLにpassword設定するの忘れていたからでした。

以前までは設定してなかったのでなくても接続できていましたが、設定したのもあって今回はうまく繋がってくれなかったみたいです。

```yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password #追記
  socket: /tmp/mysql.sock
```

この画面出るとホッとする。かわいい子供たち

<img width="1344" alt="スクリーンショット 2020-07-09 9.32.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436363/8308ec33-c7af-6f0d-1dc6-0a3d5966241a.png">

最後まで読んでくれてありがとうございました。
少してもお役に立てれば嬉しいです。
[flutter]はじめてのflutter2[AndroidStudio編]

#目的

- WEBとアプリの比較から自分のやりたい方向性を掴む。

##今日やること

- AndroidStudioとflutterのインストール


##AndroisStudioのインストール

[ここ](https://developer.android.com/studio)からDL、解凍して開く。
<img width="190" alt="Screen Shot 2020-07-09 at 8.03.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/a2395bcd-ac41-c9c2-3a6e-c96a421648f0.png">

特に設定ファイルを用意しているのでなければDo not import settingsでOK
<img width="288" alt="Screen Shot 2020-07-09 at 8.03.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/db95f238-e85a-4421-5439-9ff96ec8efc4.png">

<img width="541" alt="Screen Shot 2020-07-09 at 8.05.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/a4253383-379d-7e57-a6fe-6771b0e804dd.png">

StundardでOK
<img width="545" alt="Screen Shot 2020-07-09 at 8.05.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/566d3695-7f46-d45a-3313-0cb298295b97.png">


<img width="545" alt="Screen Shot 2020-07-09 at 8.06.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/41e20838-4f25-5cbc-b51d-0248f20de019.png">

finishを押下
<img width="545" alt="Screen Shot 2020-07-09 at 8.06.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/63b2a2a9-f01b-5a3b-79dd-b3615cadd225.png">

インストールが終わって、finish押下で、この画面になる。
<img width="457" alt="Screen Shot 2020-07-09 at 8.08.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/946e0eb9-c35b-cbf3-e3bf-3f6566a99ba6.png">

AndroidStudioのインストールは完了

##Flutterのインストール

現状KotlinとJavaでの開発を前提にしているので、Flutter（＋Dart)のプラグインもいれていく。

歯車マーク(config)からPreferences
<img width="448" alt="Screen Shot 2020-07-09 at 8.10.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/4472f431-66b2-76a6-c13e-2ed0a084feba.png">

PluginからFlutterを選択。Dartもインストールしますか？とでてくるのでYesでOK。
<img width="689" alt="Screen Shot 2020-07-09 at 8.12.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/3afe7b8c-59a9-092c-5bbc-fe5a1bb884c9.png">

AndroidStudioを再起動したら完了。
情報セキュリティの脅威から見る最近のセキュリティ事故事例

## 1.目的
ITパスポートの試験にてさまざまな情報セキュリティの問題が出てきます。
説明だけでは理解しにくい点を実際の事例と照らし合わせることで直感的に
覚えやすくなると思うので記事にしていきます。

## 2.情報セキュリティの脅威
情報セキュリティリスクを顕在化させるものが「脅威」という。
「脅威」は大きく分けて以下のように分類されます。

- **意図的脅威**
<br>外部の人間による悪意ある行為により社会的に大きな影響を及ぼす脅威
    - 標的型攻撃、マルウェア、不正アクセスなど..
- **偶発的脅威**
<br>ルールを破り外部に持ち出したPCや記憶媒体が盗難にあったり、操作ミスにより情報漏洩をさせてしまうようなヒューマンエラーによる脅威
    - 紛失、会話からの情報漏洩、システム障害など..
- **環境的脅威**
<br>地震や台風などの自然災害による脅威
    - 地震、落雷、洪水、火事など..

## 3.セキュリティ事故事例
以下３件の事例は[サイバーセキュリティ.com](https://cybersecurity-jp.com/leakage-of-personal-information)に記載されていたものから抜粋しました。
### 1.パスワードリスト型攻撃
>株式会社キタムラは2020年6月12日、同社が運営するオンラインネットショップ「カメラのキタムラネットショップ」の顧客アカウント40万件に対して、外部からの不正アクセスが確認されたと明らかにしました。
同社によると、攻撃者は2020年4月4日～2020年5月27日にかけて、同社とは関係しない外部から流出したと思われる「パスワードリスト」を用いたリスト型攻撃で顧客アカウントへ不正ログイン。これにより一部顧客アカウントの情報が外部に流出したほか、数件のアカウントについてポイントを利用した不正注文が発生し、うち1件について実際に商品を発送する被害が生じたと説明しました。

・**対策**
パスワードリスト型攻撃は入手したパスワードリストから正規ルートでログインするため運営側が不正アクセスに築くことが難しい。そのため**個人個人が他社をまたいでパスワードを使いまわさないこと**で対策がとれる




### 2.不正ログイン
>LINE株式会社は2020年2月26日、同社が提供するSNSサービス「LINE」の日本ユーザーについて、短期間で4,000件以上の不正ログイン行為が確認されたと発表しました。
同社によると、攻撃者はアカウントを乗っ取ったのち、本人になりすまして商品購買やアカウントの窃取を目的としたURLを、メッセージやタイムラインに投稿。これにより被害は急速に拡大し、多くの被害が生じていると注意喚起を行っています。

・**対策**
不正ログインを防ぐには**パスワードの管理や適度な変更**があげられるが、今回のケースだと本人になりすまして悪用を目的としたURLからアカウント等が奪われるソーシャルエンジニアリングによる被害もでているため、**個人個人のセキュリティに対する意識を高く持つこと**も対策につながる


### 3. 紛失
>岡山県吉備中央町に位置する学校法人・おかやま希望学園は2020年7月6日、同法人が運営する吉備高原のびのび小学校にて、児童など関係者の個人情報を記録したUSBメモリ3本を紛失したと明らかにしました。
同法人によると2020年6月12日、学園の女性校長が在宅ワークを遂行するため、USBメモリを外部に持ち出した際に紛失が発生。校長が紛失に気付いたのは持ち出しから2日後で、学校側は警察に届け出の上で思い当たる場所などの捜索を進めましたが、記事発表時点で発見に至っていないと説明しています。

・**対策**
まずは**USBを紛失するリスクを重々に注意喚起しておく**ことが大事。また、**重要な情報は持ち出さない**ようにしどうしても持ち出さなければいけない時は必要な分だけ持ち出す、**暗号化できるUSBを使用する**などが対策としてあげられる

## 4.まとめ
今回このように事例と照らし合わせることで情報セキュリティの脅威についての理解度がより深まりました。(実際自分はパスワードリスト型攻撃がなぜパスワードの使いまわしがいけないのか理由をあまり理解していなかったので...)
まだまだ情報セキュリティの脅威はたくさんあるので機会があれば他の事例も記事にしたいです。

##参考
・[情報セキュリティリスクの要素「脅威」と「脆弱性」とは？適切にセキュリティ対策をする方法](https://www.jbsvc.co.jp/useful/security/elements-of-information-security-risk.html)

・[サイバーセキュリティ.com](https://cybersecurity-jp.com/leakage-of-personal-information)
リモートリポジトリのURLを変更する

## 目的

- 現在のリモートリポジトリではない別のリモートリポジトリにpushする方法をまとめる

## 調査

- 下記コマンドを実行してみて`$ git remote`コマンドの使用方法を読んでみる。

    ```terminal
    $ git remote --help
    ```

- 今回の用途に合ったオプションを発見した。下記に先のコマンドの結果を抜粋した物を記載する。

    ```terminal
    SYNOPSIS
       git remote [-v | --verbose]
       git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
       git remote rename <old> <new>
       git remote remove <name>
       git remote set-head <name> (-a | --auto | -d | --delete | <branch>)
       git remote set-branches [--add] <name> <branch>...
       git remote get-url [--push] [--all] <name>
       git remote set-url [--push] <name> <newurl> [<oldurl>]
       git remote set-url --add [--push] <name> <newurl>
       git remote set-url --delete [--push] <name> <url>
       git remote [-v | --verbose] show [-n] <name>...
       git remote prune [-n | --dry-run] <name>...
       git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]
    ~中略~
    set-url
    Changes URLs for the remote. Sets first URL for remote <name> that matches regex <oldurl> (first URL if no <oldurl> is given) to <newurl>. If <oldurl> doesn't match any URL, an error occurs and
    nothing is changed.

    With --push, push URLs are manipulated instead of fetch URLs.

    With --add, instead of changing existing URLs, new URL is added.

    With --delete, instead of changing existing URLs, all URLs matching regex <url> are deleted for remote <name>. Trying to delete all non-push URLs is an error.

    Note that the push URL and the fetch URL, even though they can be set differently, must still refer to the same place. What you pushed to the push URL should be what you would see if you
    immediately fetched from the fetch URL. If you are trying to fetch from one place (e.g. your upstream) and push to another (e.g. your publishing repository), use two separate remotes.
    ```

## 確認

- 下記を実行して既存のリモートリポジトリのURLを確認した。

    ```terminal
    $ git remote -v
    ```

- 下記を実行して変更後のリモートリポジトリのURLを設定する。

    ```terminal
    $ git remote set-url --add originなどのリモートリポジトリの名前 変更後のリモートリポジトリのURL
    ```

- `fatal: No such remote '〇〇'`なとが出る方は下記を実行する。

    ```terminal
    $ git remote add originなどのリモートリポジトリの名前 変更後のリモートリポジトリのURL
    ```

- 下記を実行して変更後のリモートリポジトリのURLを確認した。

    ```terminal
    $ git remote -v
    ```
- 筆者の環境ではリモートリポジトリのURLの変更が確認できた。
【AWS SAA-C02】新しく登場したサービスの概要

#はじめに
AWS SAAがC01からC02と新しいバージョンに移行された。新しいバージョンではSAA-C01では出題されなかったサービスについて新しく出題されたとのことで、ネット上で試験に出題された・覚えた方が良いと言われているサービスをまとめていきたい。
（あくまでネット上で出題されたとされる・覚えておくべきサービスを中心にまとめいきたいと思います。ご参考程度にご覧ください。）

#サービス
<h2>FSx for Windows</h2>
<h3>用途</h3>
Windows Server上で、下記の管理機能をおこなう。
・エンドユーザーファイルの復元
・ユーザークォータ
・アクセスコントロールリスト（ACL）

<h3>説明</h3>
FSx for WindowsはWindows Server 上に構築された完全マネージド型のファイルストレージ。2019年3月から東京リージョンで利用可能になった。

今までLinuxベースの共有ファイルシステムであるEFSは存在したが、Windowsベースの共有ファイルシステムは存在しなかった。

Microsoft Windowsで構築したものとほぼ同じ仕様で運用でき、Active Directory(AD)統合やSMBプロトコル※を介してアクセスできる。


※SMBプロトコル：主にWindowsを中心としたネットワーク環境でファイル共有やプリンタ共有などに使用される通信プロトコル

EFSとFSxの違いを問われる問題が出題される可能性あり。
Black beltでFSxについて書かれている。
https://www.slideshare.net/AmazonWebServicesJapan/20190319-aws-black-belt-online-seminar-amazon-fsx-for-windows-server/

<h2>FSx for Lustre</h2>
<h3>用途</h3>
・機械学習、高性能コンピューティング (HPC)、ビデオ処理、財務モデリングなど、速度が重要なワークロード

<h3>説明</h3>
Amazon S3と統合された、フルマネージド型高性能ファイルシステム。
高速ストレージを必要とするアプリケーション向けのストレージシステム。

<h3>Windows FileserverとLustreの違い</h3>
Amazon FSx for Windows File Server：ビジネスアプリケーション（Windows Server）向け
Amazon FSx for Lustre：高性能ワークロード向け

<h2>Aurora Serverless</h2>
<h3>用途</h3>
・データベースの容量を手動ではなく、自動で管理

<h3>説明</h3>
Amazon Aurora(MySQL互換エディションおよび PostgreSQL互換エディション)のオンデマンド自動スケーリング設定。
データベースの容量を自動的に起動、シャットダウン、スケールアップまたはスケールダウンしてくれる。

<h2>Transit Gateway</h2>
<h3>用途</h3>
・グローバル展開（AWSグローバルネットワークを使用して AWS Transit Gateway は相互にリージョン間ピア接続できる。）
・ネットワークを簡素化

<h3>説明</h3>
AmazonVPC、AWSアカウント、オンプレミスネットワークを単一のゲートウェイに簡単に接続してくれる。中央ハブを介してVPCとオンプレミスネットワークを接続し、複雑なピア接続関係がなくなる
<h2>Snowmobile</h2>
<h3>用途</h3>
・膨大な規模のデータを短時間で転送

<h3>説明</h3>
超大容量データをAWSに移動できるエクサバイト規模のデータ転送サービス。すでにAWS Snowball・Snowball Edgeでデータ転送はできるが、それでも保存しきれない超大容量のデータや、データセンターを丸ごとAWSへ移行する際に使用できる。（Snowballl　80TB、Snowball Edge　100TB、Snowmobile　100PBまで転送可能※例外あり）

Snow系サービスの違いも出題される可能性あり。

<h2>Global Accelerator</h2>
<h3>用途</h3>
・アプリケーションパフォーマンスの高速化

<h3>説明</h3>
アプリケーションの固定エントリポイントを提供し、静的IPアドレスが提供されることで、様々なAWSリージョンおよびアベイラビリティーゾーンの専用IPアドレスを管理しなくて済む。

#まとめ
上記のような新しく出題されたサービスも覚えると、SAA C-02の合格に近づくだろう。

参考
https://aws.koiwaclub.com/exam/passrecord/
・FSx for Windows
https://aws.amazon.com/jp/fsx/windows/
https://www.cloudsolution.tokai-com.co.jp/white-paper/2020/000268.html
・FXs for Lustre
https://aws.amazon.com/jp/fsx/lustre/
https://www.acrovision.jp/service/aws/?p=1129
・Aurora Serverless
https://aws.amazon.com/jp/rds/aurora/serverless/
・AWS Sowmobile
https://aws.amazon.com/jp/snowmobile/
https://dev.classmethod.jp/articles/amazon-snowmobile-released/
・Global Accelerator
https://aws.amazon.com/jp/global-accelerator/faqs/
Excel 2016のアイコンを取得する

# 結果

アイコンは`C:\Program Files (x86)\Microsoft Office\root\Office16\XLICONS.EXE`から取得可能。

取得に使ったソフトは[Icon Ripper(Vectorのページ)](https://www.vector.co.jp/soft/winnt/amuse/se513590.html)

# 背景

エクセルファイルを開く際に、色々処理をしてから（開く前に特定のフォルダにバックアップコピー）開くようにしたい。
というリクエストに答えるためになんやかんやプログラムを作成することに。

通常は、
foo.xlsxをダブルクリック → Excel.exe起動

のところを
foo.xlsxをダブルクリック → 事前処理プログラムを起動 → 内部でExcel.exeを起動

というように挟む。

.xlsxの関連付けを事前処理プログラムに通すことになるが、アイコンが変わると戸惑ってしまうので、エクセルアイコンはそのままにしたい。
じゃあ、エクセルのアイコンファイルを探そうということになったことがきっかけ。

ググってもなかなか出てこなかったので、書き残しておく。
「Python3ではじめるシステムトレード」の最新のプログラムコードの取得

「Python3ではじめるシステムトレード」は発売以来お陰様で、運用機関、機関投資家で働くプロの投資家、トレーダーから、金融関連のIT技術者、投資の初心者までと幅広く多くの方々に読まれてまいりました。また、プログラムコードもpanrollingのホームページから頻繁にダウンロードされてきました。しかし、先進的なPythonというプログラミング言語の性質上から生じる仕様の頻繁な変更により、また2017年春ごろからのUS yahoo financeによる株価ダウンロードサービスの支障から、多くの読者の方からプログラムが動かないとか、コードが機能しないなどの問い合わせを受けてまいりました。そこでGitHub上に

innovation1005 https://github.com/innovation1005

を開設し、そのリポジトリ―として
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/1ebf44ff-755b-ae5b-efa6-45fe564d28be.png)
を置くことで、プログラムコードのアップデートを行ってまいりました。
Python3-for-system-tradeをクリックしていただくと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/3dc7d72a-8f0c-a045-ee65-6d5e599ae3a3.png)
という画面が現れます。プログラムコードはPython3.xに相当するものを360にPython2.xに相当するものを270のホルダーに落としてあります。270のupdateはPython2.xの更新サービスが終了してからは行っておりません。updateの状況はread.meファイルで更新しています。

プログラムコードをダウンロードするためには画面右上の緑色のCodeのボタンを押していただく必要があります。そうしますと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/bbf74737-9721-6065-4bbf-f9fbdf6a3c0e.png)
というようにドロップダウンメニューが現れます。3つの選択肢を選ぶことができます。

- クローン
- デスクトップへのダウンロード(Open with GitHub Desktop)
- zipファイルでのダウンロード(Download ZIP)

初心者の方には'zipファイルでのダウンロード(Download ZIP)'をお勧めします。これを選択しますとプログラムコードはお手元のPCのダウンロードフォルダーに落とされます。あとはそのファイルを解凍ソフトで解凍すると解凍ソフトの指定したフォルダー内にプログラムコードが展開されます。

# 更新の履歴

GitHubではファイルの更新の履歴がすべて保存されています。したがって、過去のプログラムコードの変更等を確認することができます。Python3.xに興味のある方は360フォルダーをクリックします。するとつぎの画面が現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/bd5ec4a7-dc85-d1fc-1ee0-761a5d2f0301.png)
つぎに上部2行目の水色のバーの部分のHisoryをクリックしてみてください。画面はつぎのように変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/479a672c-2bc4-0215-ee00-02c0ba11f014.png)

$$ \vdots$$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/32f72bff-9c98-10ee-b391-0341b4a43cfb.png)

2018/1/15から対応を始めたのが分かります。関連ファイルをクリックすると履歴上のプログラムコードが確認できます。

# Qiita「Python3ではじめるシステムトレード」
読書からのpanrollingへの質問、[Amazon Review](https://www.amazon.co.jp/gp/product/B01MSYUE9K?pf_rd_r=7NJDX7N4P7YBEZ996GF4&pf_rd_p=7392bae8-7129-4d1a-96a9-1cfe0aa13ab3)への書き込み、WEB上へのコメント、[connapass セミナー・勉強会](https://kinyuzaimu.connpass.com/)での質疑応答をもとに多くの記事が書き込まれています。また、高度の知識の習得を目指す人のために「Statsmodelsによる...」シリーズも始めました。とくにアクセス数が多いのは

[Yahoo Finance USから株価をダウンロードしてみた](https://qiita.com/innovation1005/items/5be026cf7e1d459e9562)
[Python3ではじめるシステムトレード：システムトレードってなに？](https://qiita.com/innovation1005/items/2b5a291b98ebf39dfd8b)
[statsmodelsによる線形回帰 入門](https://qiita.com/innovation1005/items/b712ce54a7a697a9bf03)
[Python3ではじめるシステムトレード：長期投資](https://qiita.com/innovation1005/items/024a8ea59109894d0e66)
です。


<A HREF="http://www.tradersshop.com/bin/showprod?a=17600&b=1&c=9784775991473">「下の画像をクリックしていただくとpanrollingのホームページに飛び書籍を購入していただけます。」
     <IMG SRC="http://www.tradersshop.com/images/prod/9784775991473.jpg"BORDER=1 WIDTH=70 HEIGHT=100 
      </A>
よくあるヘッダーレイアウト ~FlexBox~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641744/04b8a1db-6246-752e-bf86-50a9360f9b2d.png)

FlexBoxを使うとWEBデザインでよくあるレイアウトを簡単にコーディングすることができます。

```phphtml
<div class="flex">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
</div>
```

```phpcss
.flex {
  display: flex;
  justify-content: flex-end;
}
.flex > :first-child {
  margin-right: auto;
}
```
これだけ

justify-content: flex-end はflexアイテムを全て右に寄せる設定です。

この際、Flexアイテムに「margin-right: auto;」の記述を組み合わせると、設定したアイテムの右側に自動的に余白を作ることができます。
スマートフォンアプリケーション開発について

<p>スマートフォンのアプリケーション開発を勉強し始めたので、勉強をした事を復習の意味も込めて書き残そうと思います。</p>
## ０．スマートフォンアプリケーション開発
<p>スマートフォンが普及をし始めてから約10年、これまで様々な手法で<br />アプリケーション(以降アプリ)が開発されてきました。<br />Windowsアプリの開発しか経験のない私には、スマートフォンのアプリ開発にも興味が沸き、これまでどのような言語があるのか代表的な言語を調べてみました。</p>
## １．開発言語</strong>
- iOS
    - Objetive-C
<p>　当初はこの「Objetive-C」を開発言語とされていましたが、<br />　現在ではSwiftが主流となりつつあります。また、独特な文法表現があるため、<br />　これからiOS向けの開発を始める人にとっては、Swiftがおすすめです。</p>
   - Swift
<p>　SwiftはAppleが2014年に新しく開発したMacやiOS向けの言語です<br />　動作するにはXcodeというMacの統合開発環境が必要であるため、<br />　コンパイルするにはMac端末が必要となります。</p>
- Android
   - Java
<p>　開発に携わっている人はほとんど聞いたことがある言語「Java」です。<br />　Androidアプリの多数はJavaで作られています。<br />　2010年前半は、Javaの開発環境であるEclipseを使用されていましたが、<br />　現在ではAndroid Studioが使用されています。</p>
- Windows(UWP)
    - C#</h5>
<p>　C#はもともとC言語とオブジェクト指向の要素を持つ言語で、<br />　Microsoft .NET Framework上で開発をします。<br />　C++++とも呼ばれましたが、C#のほうがしっくりきます。(笑)</p>
   - VisualBasic
<p>　こちらの言語もC#と同様、.NET Framework上で開発をします。<br />　もともとはBASIC言語から派生した言語でした。BASIC6.0までは<br />　オブジェクト指向の要素を持っていなかったがVisualBasic.NETでは<br />　その要素も実装されており、C#に劣らない言語です。</p>

## ２．まとめ
<p>各言語を使えばそれぞれのプラットフォーム上でアプリを開発することはできますが、<br />クロスプラットフォームをターゲットとしたい場合は各言語で開発する必要がでてきます。</p>
<p>面倒なので私は絶対に嫌です！（笑）<br />クロスプラットフォーム上で動作する言語があれば開発が便利になりますね！</p>
collections.Counter

```lesson.py
import collections
import re

l = ['a', 'a', 'a', 'b', 'b', 'c']
c = collections.Counter()
for word in l:
    c[word] += 1
print(c)
print(c.most_common(2)) #上位2つを表示
print(c.values())

with open('lesson.py', encoding='utf-8') as f:
    words = re.findall(r'\w+', f.read().lower())
    print(words)
    print(collections.Counter(words).most_common(20))
```
実行結果：

```txt
Counter({'a': 3, 'b': 2, 'c': 1})
[('a', 3), ('b', 2)]
dict_values([3, 2, 1])
['import', 'collections', 'import', 're', 'l', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'collections', 'counter', 'for', 'word', 'in', 'l', 'c', 'word', '1', 'print', 'c', 'print', 'c', 'most_common', '2', '上位2つを表示', 'print', 'c', 'values', 'with', 'open', 'lesson', 'py', 'encoding', 'utf', '8', 'as', 'f', 'words', 're', 'findall', 'r', 'w', 'f', 'read', 'lower', 'print', 'words', 'print', 'collections', 'counter', 'words', 'most_common', '20']
[('c', 6), ('print', 5), ('collections', 3), ('a', 3), ('words', 3), ('import', 2), ('re', 2), ('l', 2), ('b', 2), ('counter', 2), ('word', 2), ('most_common', 2), ('f', 2), ('for', 1), ('in', 1), ('1', 1), ('2', 1), ('上位2つを表示', 1), ('values', 1), ('with', 1)]

```
基礎から学ぶ　人工知能の教科書　第2章　章末問題

# はじめに
機械学習の勉強として、「*[基礎から学ぶ　人工知能の教科書](https://www.ohmsha.co.jp/book/9784274224263/)*」 を読んでいます。

この本の特徴は、章末問題に`Python`の簡単なプログラムが載っていてるところです。
# 第2章　章末問題
```ELIZA.rb
LIMIT = 20
CYCLE = 5

count = 0
endcount = 0
puts('Dr>私はDoctor、お話を伺います')
while endcount < LIMIT
  print('あなた>')
  inputline = gets.chomp.encode("UTF-8", "CP932", :invalid => :replace)
  if count >= CYCLE
    puts 'Dr>' << inputline << '、ですか．．．'
    count = 0
  elsif inputline.include?('先生')
    puts 'Dr>私のことでなくあなたのことを話しましょう'
  elsif inputline.include?('母')
    puts 'Dr>あなたのお母さんについて話してください'
  elsif inputline.include?('父')
    puts 'Dr>あなたのお父さんについて話してください'
  elsif inputline.include?('意見')
    puts 'Dr>私の意見を聞きたいのですか？'
  elsif inputline.include?('が心配です')
    puts 'Dr>' << inputline.sub(/が心配です/, 'は心配ですか？')
  else
    puts 'Dr>続けてください'
  end
  count += 1
  endcount += 1
end
puts('Dr>それではそろそろ終了しましょう。おつかれさまでした。')
```
簡易版ELIZAを作成する問題です。

```CP932.rb
  inputline = gets.chomp.encode("UTF-8", "CP932", :invalid => :replace)
```
`Windows10`の場合、文字コードを変換する処理が必要になっています。
`AtCoder`では、こういう処理が無いので新鮮です。
但し、コマンドプロンプトのバグ対応で、レガシ　コンソールを選択する必要があります。
<img width="324" alt="20200709.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/12350b5e-0ea4-2607-2d4d-be9a92ce7736.png">
# まとめ
+ 第2章まで読んだ
+ G検定は難しかった
Ubuntu1804のChromeでパスワード管理/自動入力できなくなった(再インストールで解決)

# 症状

開発環境として使っているUbunutuにインストールしているChromeでパスワード管理、自動入力が使えなくなりました。

ログインすると`パスワード保管のダイアログが表示される`のですが実際には保存されず毎回入力を要求されます。

アカウント同期はできている(ブックマークや拡張機能)し、パスワード管理・自動入力設定も意図したとおりになっています。

[![Image from Gyazo](https://i.gyazo.com/fe302c9a37b105d9760fb8d6c0d39f5b.png)](https://gyazo.com/fe302c9a37b105d9760fb8d6c0d39f5b)

# 対策

再インストールしたところあっさり復活した。

## アンインストール

```bash
$ sudo apt-get purge google-chrome-stable
$ rm ~/.config/google-chrome/ -rf
```

## インストール

`Ubuntu Chrome インストール`とかで検索すると、コマンドラインで`dpkg`を`wget`して、、、という方法が見つかりますが無駄です。

Ubuntu上の他ブラウザ(例えばFirefox)から[Chromeのダウンロードページ](https://www.google.co.jp/chrome/)にアクセスすれば、GUI操作で簡単にダウンロード・インストールできます。

[![Image from Gyazo](https://i.gyazo.com/ff9dddf81619bc875269266a10b6cf9a.png)](https://gyazo.com/ff9dddf81619bc875269266a10b6cf9a)

[![Image from Gyazo](https://i.gyazo.com/1f0492941f144f8249e6c505e758269c.png)](https://gyazo.com/1f0492941f144f8249e6c505e758269c)

# 追記（2020/07/23)

コメント欄でご助言いただいたので追記しておきます。私自身は未確認ですが以下でも対処できるようです。

```
$HOME/.config/google-chrome/Default
```

上記ディレクトリにある以下のデータを削除

- Login Data
- Login Data-journal
Nuxt color-mode + tailwindcssでテーマ切り替え

#最近多くなってきたスマホやPCのダークモード対応

![115cc9326966a97927fc2dcaf39df180.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29354/175f92ea-9775-a90a-6dba-03f26a884590.gif)

この[Quick way to add darkmode in Nuxt.js & Tailwindcss project— Corona Virus Tracker]('https://medium.com/@fayazara/quick-way-to-implement-darkmode-in-nuxt-js-tailwindcss-corona-virus-tracker-712d004a0846')を参考に。

まず `yarn add -D @nuxtjs/color-mode tailwindcss-dark-mode` します。

そして
`nuxt.config.js` 

```javascript
export default {
  ...
  buildModules: [
    ...
    '@nuxtjs/tailwindcss',
    '@nuxtjs/color-mode',
    ...
  ],
  ...
  purgeCSS: {
    whitelist: ['dark-mode', 'system', 'light-mode'],
  },
}
```
> Nuxt also includes purgeCSS when we installed the TailwindCSS framework, which auto removes unused css, since we are adding dark selector classes manually, we need to whitelist them in our nuxt config 

らしいので念の為すべてをpurgeCSSに追加してます。
`yarn dev` すると
`html class='light-mode'` や `html class='dark-mode'` が付与されるので適宜css追加したり tailwindcssのプレフィックスを使用して `class='dark:bg-red-600 bg-red-100'` 当指定してあげれば切り替えることが出来ます。

又、`computed`を使用すればsvg等の`fill`の色を変えたりも出来ます。

![7dc3c0ecf9c558e50b661a4018899cf7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29354/8722e6dd-f28b-e3db-aca9-31b2e5dba33c.gif)

```javascript
  computed: {
    logoColor() {
      // オブジェクトで:style="logoColor"に渡してあげる
      return { fill: this.$colorMode.value === 'light' ? 'black' : 'white' }
    },
  },
```

### 追記
vscodeでtailwindcss使うなら[Tailwind CSS IntelliSense](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss)が凄く便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29354/abebd2d4-c784-591a-dc66-fcd0aab41b35.png)
windowsでiverilog その47


#概要

windowsでiverilogやってみた。
polyphonyでcpu書いてみる。
アセンブラでfizzbuzz書いてみる。
ハンドコンパイルしてみた。

#ニーモニック

|ニーモニック|HEX|
|:--|:--|
|r0set 0|0x8000|
|r1set 1|0x8401|
|r0save 0|0xd000|
|r1save 1|0xd401|
|r0load 0|0xc000|
|r1load 1|0xc401|
|r0out|0xa000|
|r0 + r1|0x0100|
|r0 < r1|0x6100|
|r0 % r1|0x7100|
|jp 2|0x4002|
|if 2|0x5002|

#アセンブラをハンドコンパイル


```
rom = [
0x8000, #  r0set  0    0
0xd000, #  r0save 0    1 
0xd001, #  r0save 1    2 
0xd002, #  r0save 2    3
        #label_20:     
0xc002, #  r0load  2   4
0x8401, #  r1set  1    5 
0x0100, #  r0 + r1     6
0xd002, #  r0save  2   7
0x8409, #  r1set  9    8
0x6100, #  r0 < r1     9
0x5011, #  if label_32 a
0xc001, #  r0load  1   b
0x8401, #  r1set  1    c
0x0100, #  r0 + r1     d
0xd001, #  r0save  1   e
0x8000, #  r0set  0    f
0xd002, #  r0save  2   10
        #label_32:     
0xc000, #  r0load  0   11
0x8401, #  r1set  1    12
0x0100, #  r0 + r1     13
0xd000, #  r0save 0    14
0xc000, #  r0load  0   15
0x8464, #  r1set  100  16
0x6100, #  r0 < r1     17
0x5053, #  if label_255 18
0xc000, #  r0load  0   19
0x840f, #  r1set  15   1a
0x7100, #  r0 % r1     1b
0x502a, #  if label_120 1c
0xd000, #  r0load  0   1d
0x8005, #  r1set  5    1e
0x7100, #  r0 % r1     1f
0x503d, #  if label_140 20
0xd000, #  r0load  0    21
0x8003, #  r1set  3    22
0x7100, #  r0 % r1     23
0x5048, #  if label_160 24
0xc001, #  r0load  1    25
0xa000, #  r0out        26
0x8002, #  r0load  2    27
0xa000, #  r0out        28
0x4004, #  jp label_20  29
        #label_120:     
0x8066, #  r0set  'f'   2a
0xa000, #  r0out        2b
0x8069, #  r0set  'i'   2c
0xa000, #  r0out        2d
0x807a, #  r0set  'z'   2e
0xa000, #  r0out        2f
0x807a, #  r0set  'z'   30
0xa000, #  r0out        31
0x8062, #  r0set  'b'   32
0xa000, #  r0out        33
0x8075, #  r0set  'u'   34
0xa000, #  r0out        35
0x807a, #  r0set  'z'   36
0xa000, #  r0out        37
0x807a, #  r0set  'z'   38
0xa000, #  r0out        39
0x8020, #  r0set  ' '   3a
0xa000, #  r0out        3b
0x4004, #  jp label_20  3c
        #label_140:     
0x8062, #  r0set  'b'   3d
0xa000, #  r0out        3e
0x8075, #  r0set  'u'   3f
0xa000, #  r0out        40
0x807a, #  r0set  'z'   41
0xa000, #  r0out        42
0x807a, #  r0set  'z'   43
0xa000, #  r0out        44
0x8020, #  r0set  ' '   45
0xa000, #  r0out        46
0x4004, #  jp label_20  47
        #label_160:     
0x8066, #  r0set  'f'   48
0xa000, #  r0out        49
0x8069, #  r0set  'i'   4a
0xa000, #  r0out        4b
0x807a, #  r0set  'z'   4c
0xa000, #  r0out        4d
0x807a, #  r0set  'z'   4e
0xa000, #  r0out        4f
0x8020, #  r0set  ' '   50
0xa000, #  r0out        51
0x4004, #  jp label_20  52
        #label_255:
0x4056, #  end          53
]


```


以上。
GitHub profile(readme.md)の最新情報まとめ

ここでいうGitHub profile(readme)とは、ユーザーのトップページをユーザー自身がカスタマイズできる新機能のこと。現在は無差別テストに当選した人のみプレビューを行える状況です。

この機能のテストに当選している人は、ユーザー名のリポジトリを作成するとき以下のような表示が出るようです。

![](https://raw.githubusercontent.com/mba-hack/images/master/github_profile_readme_01.png)

`github profile(readme)`を使用するには、GitHubでユーザー名のリポジトリを作成して、そのルートに`readme.md`を置くと`https://github.com/$user`にその投稿が表示できます。(現在は当選した人のみ、かつプレビューのみ)

これについての情報はこちらに書かれています。

https://dev.to/web/design-github-profile-using-readme-md-8al

Twitterでは、GitHub profile(readme)を試してみた人の最新情報が投稿されています。

https://twitter.com/BjarnBronsveld/status/1280847046858215428

https://twitter.com/kerolloz/status/1280892985924820992

https://twitter.com/williamsrabia/status/1280712424962703360

### 新機能が公開された?

2020/07/09現在、この新機能が公開されているようです。これが全体的なものかどうかはわかりませんが、私のユーザーページをシークレットモードで開いてみたところ、readme.mdは有効になっている模様。

https://github.com/syui
collections.defaultdict

```py
import collections

d = {}
l = ['a', 'a', 'a', 'b', 'b', 'c']
for word in l:
    if word not in d:
        d[word] = 0
    d[word] += 1
print(d)

d = {}
for word in l:
    d.setdefault(word, 0)
    d[word] += 1
print(d)

d = collections.defaultdict(int)
for word in l:
    d[word] += 1
print(d)

d = collections.defaultdict(set)
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
for k, v in s:
    d[k].add(v)
print(d)
```
実行結果；

```txt
{'a': 3, 'b': 2, 'c': 1}
{'a': 3, 'b': 2, 'c': 1}
defaultdict(<class 'int'>, {'a': 3, 'b': 2, 'c': 1})
red 1
blue 2
red 3
blue 4
red 1
blue 4
defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})
```
gorenameでexportした変数名でも短時間でリネームするためのシェルスクリプトを書いた

# 動作確認環境

- Ubuntu 18.04
- Go 1.14.2

macOSでも動くと思います。

# 背景

[Go Tools](https://pkg.go.dev/golang.org/x/tools)に含まれる[gorename](https://pkg.go.dev/golang.org/x/tools/cmd/gorename)は、様々な変数の名前を変更するためのツールで、リファクタリングなどに活用できます。
ただし、エクスポートされた変数の場合は、マシン内のワークスペース（ `$GOROOT` および `$GOPATH` ）をスキャンするという挙動があり、非常に時間がかかることがあるようです。

（参考）

```
$ gorename -help
:
gorename automatically computes the set of packages that might be
affected.  For a local renaming, this is just the package specified by
-from or -offset, but for a potentially exported name, gorename scans
the workspace ($GOROOT and $GOPATH).
```

# 作成したシェルスクリプト
## 概要

そこで、モジュール開発時を想定して、以下のような操作を行うシェルスクリプトを書きました:

- GOPATHを設定するための一時ディレクトリを作成する
- 開発中のモジュールだけをそこにシンボリックで配置する
- `GOPATH=${一時ディレクトリ} gorename` コマンドを実行する
- 置換が終わったら一時ディレクトリは削除

ソースはこちらです:

- https://github.com/progrhyme/toolbox/blob/master/bin/go-rename-dev

## Requirements

- Bash
- `gorename` コマンド
- `go.mod` があるディレクトリで実行すること。
  - `go.mod` の1行目に `module ${moduleパス}` の記載がある想定

## 使い方

Syntax:

```sh
go-rename-dev [PATH].FROM_NAME TO_NAME [OPTIONS]
```

例:

```sh
go-rename-dev internal/logs.Log Logging
# gorename -from '"${module}/intenal/logs".Log' -to Logging

go-rename-dev .Conf Config -v
# gorename -from '"${module}".Conf' -to Config -v
```

上のコマンド例は、それぞれ内部的に直下のコメントアウトしてある `gorename` コマンドを実行します。

## 実行例

```sh
$ pwd
/home/progrhyme/my/go/src/github.com/progrhyme/binq

$ go-rename-dev internal/cli.CLI.OutStream OutStr -v
+ GOPATH=/tmp/tmp.Stu5A9b9CX
+ gorename -from '"github.com/progrhyme/binq/internal/cli".CLI.OutStream' -to OutStr -v
gorename: -from spec: {pkg:github.com/progrhyme/binq/internal/cli fromName:OutStream searchFor: pkgMember:CLI typeMember:OutStream filename: offset:0}
gorename: Loading package: github.com/progrhyme/binq/internal/cli
gorename: Potentially global renaming; scanning workspace...
While scanning Go workspace:
Package "github.com": cannot find module providing package github.com: unrecognized import path "github.com": parse https://github.com/?go-get=1: no go-import meta tags ().
Package "github.com/progrhyme": cannot find module providing package github.com/progrhyme: invalid github.com/ import path "github.com/progrhyme".
gorename: Loading package: github.com/progrhyme/binq/internal/cli
gorename: Updating package github.com/progrhyme/binq/internal/cli
Renamed 4 occurrences in 1 file in 1 package.
+ set +x
```

若干、見慣れないようなエラーが出ているのが気になりますが（汗）、置換自体は上手く行っています。

## 効果

（Before）

最近 `$HOME/go` に色々溜まっており、エクスポートされた変数名に対して `gorename` を実行すると数分経っても結果が返って来ないので、諦めていました。

（After）

このラッパーコマンドを使うことで、多少の依存があるモジュールでrenameを実行しても30秒以内には終わるようになりました。

# まとめ

`gorename` を使って、エクスポートした変数名であっても短時間でリネームするためのシェルスクリプトを書きました。
同様のケースでお困りの方は、ご自由にご利用ください。
Cannot end a section without first starting one. [Laravel]


`Cannot end a section without first starting one. `

bladeテンプレートの構文エラーと発生する原因について

## 発生する原因

シンタックスエラーの可能性:セクションが正しく囲われていないケース

```php:master.blade.php
@section
 〜記述
@endsection
```
タイポ:共通レイアウトの呼び出し名が間違っているケース

```php:master.blade.php
// 呼び出した共通レイアウト名が正しいか確認する
@extends('layouts.base') 
```

タイポ：構文が間違っているケース

```php:master.blade.php
// sectionがsecitonになっている
@seciton('main')
  <p>{{ $msg }}</p>
@endsection
```
pipenv shellが使えなくなった...どうする？

# pipenv shellが効かなくなった．さぁどうしようか．

## 心の声
いや，こんなこと初めてですよ笑

```Terminal
$ pipenv shell

Traceback (most recent call last):
  File "/usr/local/Cellar/pipenv/2020.6.2/libexec/bin/pipenv", line 5, in <module>
    from pipenv import cli
ModuleNotFoundError: No module named 'pipenv'
```

へ？細かいエラーはよくわからんのでとりあえず試したやり方がうまくいったので記述していきます．

## 解決方法

### 手順その1
とりあえずpipenvがなんでいないの？ってことで

```Terminal
brew list
```

そしたら自分の環境ではちゃんといるんですよね笑

### 手順その2
とりあえず入れ直してみるかぁってことで

```Terminal
brew reinstall pipenv
```

すると

```Terminal
==> Downloading https://homebrew.bintray.com/bottles/pipenv-2020.6.2.catalina.bottle.tar.gz
Already downloaded: /Users/hoge/Library/Caches/Homebrew/downloads/4d0e7223005e0a1d0846471afb6356cb634de5855ad4102613aa6b0cc94c3bbc--pipenv-2020.6.2.catalina.bottle.tar.gz
==> Reinstalling pipenv 
==> Pouring pipenv-2020.6.2.catalina.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
```
普通に再インストール成功．．．

再度

```Terminal
pipenv shell
```

すると

```Terminal
Courtesy Notice: Pipenv found itself running within a virtual environment, so it will automatically use that environment, instead of creating its own for any project. You can set PIPENV_IGNORE_VIRTUALENVS=1 to force pipenv to ignore that environment and create its own instead. You can set PIPENV_VERBOSITY=-1 to suppress this warning.
Launching subshell in virtual environment…
 . /Users/hoge/.local/share/virtualenvs/hoge-hogehoge/bin/activate  
```

普通に動くようになるんかい笑
いったいなんで急に動かなくなったことやら...

## おまけ

pipenvを再インストールしたことで`jupyter notebook`でTerminal上に出ていた<font color='red'>Warning</font>も表示されなくなりました．

最後まで見てくださりありがとうございました！！
collections.ChainMap

```py
import collections


a = {'a': 'a', 'c': 'c', 'num': 0}
b = {'b': 'b', 'c': 'cc'}
c = {'b': 'bbb', 'c': 'ccc'}


# class DeepChainMap(collections.ChainMap):
#     def __setitem__(self, key, value):
#         for mapping in self.maps:
#             if key in mapping:
#                 if type(mapping[key]) is int and mapping[key] < value:
#                     mapping[key] = value
#                 return
#         self.maps[0][key] = value
#
#
# m = DeepChainMap(a, b, c)
# m['new_num'] = 1
# print(m['num'])
# print(m['new_num'])

# print(a)
# a.update(b)
# print(a)
# a.update(c)
# print(a)


m = collections.ChainMap(a, b, c)
print(m)
print(m.maps)
m.maps.reverse()
print(m.maps)
m.maps.insert(0, {'c': 'CCCCCC'})
print(m.maps)
del m.maps[0]
print(m.maps)
print(m['c'])
m['b'] = 'BBBBBBB'
print(m.maps)
```
実行結果；

```txt
ChainMap({'a': 'a', 'c': 'c', 'num': 0}, {'b': 'b', 'c': 'cc'}, {'b': 'bbb', 'c': 'ccc'})
[{'a': 'a', 'c': 'c', 'num': 0}, {'b': 'b', 'c': 'cc'}, {'b': 'bbb', 'c': 'ccc'}]
[{'b': 'bbb', 'c': 'ccc'}, {'b': 'b', 'c': 'cc'}, {'a': 'a', 'c': 'c', 'num': 0}]
[{'c': 'CCCCCC'}, {'b': 'bbb', 'c': 'ccc'}, {'b': 'b', 'c': 'cc'}, {'a': 'a', 'c': 'c', 'num': 0}]
[{'b': 'bbb', 'c': 'ccc'}, {'b': 'b', 'c': 'cc'}, {'a': 'a', 'c': 'c', 'num': 0}]
ccc
[{'b': 'BBBBBBB', 'c': 'ccc'}, {'b': 'b', 'c': 'cc'}, {'a': 'a', 'c': 'c', 'num': 0}]
```
def initializeでちょっとだけハマった話

### initializeはnewした時点で値がsetされる

クラスメソッドでinitializeにsetした値を参照したい時ハマってしまった

```ruby
class Hoge
  attr_accessor :aa
  def initialize
    @aa = 'aa'
  end
  def self.bb
    @aa
  end
end

p Hoge.bb
# => nil

```

Hoge.newしていないので値をセットできていません、
よってnilが返る


```ruby
class Hoge
  attr_accessor :aa
  def initialize
    @aa = 'aa'
  end
  def bb
    @aa
  end
end

hoge = Hoge.new
p hoge.bb

```

インスタンスメソッドを利用すれば値を参照できる(当たり前ですよね)
クラスメソッドで値を使いたい時は
initialize使わず直接インスタンス変数に値をセットしましょう。

```ruby
class Hoge
  @aa = 'aa'
  def self.bb
    @aa
  end
end

p Hoge.bb
#=> "aa"
```

クラスメソッドで使うのかインスタンスメソッドで使うのか、
用途に合わせて、initializeの中身は意識しないといけないんだなと学んだハマりでした。


日々精進
WordpressのWP REST APIを使って記事データをとってくるまで

前回の続きです。
前回の問題点は、レスポンスのjson encodeがうまくいっていなかったようです。


今回やったのは、
https://--------/wp-jsonでjsonを返すのではなく、
カスタムエンドポイントを作って、そこで記事データをjson形式で返す。
と、いうのをやりました。

それでは、手順をざっくりと
#functions.phpにカスタムエンドポイントを登録
```php:functions.php
function add_custom_endpoint()
{
 //投稿データを返す
  register_rest_route(
    'api/v2',
    '/posts',
    array(
      'methods' => WP_REST_Server::READABLE,
      'callback' => 'get_posts_json'
    )
  );
}
add_action('rest_api_init', 'add_custom_endpoint');

/**
 * WP REST APIのレスポンス処理
 * @param {String} $file_name ファイル名（拡張子なし）
 * @param {Array} $param ajaxで受け取ったデータ
 *
 * @return WP_REST_Response
 */
function rest_response($file_name, $param = null)
{
  $api_file = locate_template("api/${file_name}.php");
  $res = !empty($api_file) ? include_once $api_file : [];
  $response = new WP_REST_Response($res);
  $response->set_status(200);
  $domain = (empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER["HTTP_HOST"];
  $response->header('Location', $domain);

  return $response;
}

//投稿データを返す
function get_posts_json($param)
{
  return rest_response('posts', $param);
}
```

#/api/posts.phpを作成
フォルダパスは上のfunctions.phpの$api_fileのところに合わせてください。

```php:posts.php
<?php

header('Content-type: application/json; charset=utf-8');

$query = new WP_Query(
  array(
    'post_type' => 'post',
    'post_status' => 'publish',
    "posts_per_page" => 10
  )
);

if ($query->have_posts()){
  $postObj = [
    array(
      "title" => "",
      "content" => ""
    )
  ];
  $i = 0;
  while ($query->have_posts()){
    $query->the_post();
    $postObj[$i]['title'] = get_the_title();
    $postObj[$i]['content'] = get_the_content();
    $i++;
  }
}

return json_encode($postObj);
```

やっぱりこれでもだめでした。

それで、json_encode()にオプションを追加したら...

```php:posts.php
return json_encode($postObj, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE);
```

成功！！

これで、json形式で記事データを返す流れはとりあえずできました。
ペンマン法ってどうやって計算するの？　―蒸発散位の計算―

# 移転のお知らせ

こちらの記事は下記のサイトに移転しました。

> [NNテックブログ](https://nnhiroba.xsrv.jp/nnTechBlog/Article/Article?ID=0)
投稿機能のエラー解決

アウトプットです。
データがビューに反映されなかった投稿機能解決致しました
結論から言うと、ユーザー機能とカテゴリー機能に外部キー制約がかかっており
nullで値を返せないのが原因でした。

それにしてもモデル.createはたとえparamasを受け取らなくてもエラーが出ないらしい。。。
変わりにモデル!paramsとやると明確にエラー内容が表示され、原因究明にたどり着くことができました。

```top_page_controller.rb
class TopPageController < ApplicationController
  def index
    @toppages = TopPage.all
  end

  def new
    @toppage = TopPage.new
  end

  def create
    TopPage.create!(top_page_params)
    redirect_to top_page_index_path
  end

  def show
  end

  private
  def top_page_params
    params.require(:top_page).permit(:contents)
  end
end
```

```new.html.haml
.post
  = form_for @toppage, url:{controller: 'top_page', action: 'create'} do |f|
    .post__title
      悩み投稿
    .post__form
      ◎内容
      .post__form__text
        = f.text_area :contents, class: 'post__form__text__area'
    .post__genre
      .post__genre__title
        ◎ジャンル
      .post__genre__type
        お金
    .post__name
      .post__name__title
        ハンドルネーム
      .post__name__type
        mori
    .post__tag
      .post__tag__tag1
        タグ１
      .post__tag__tag2
        タグ２
      .post__tag__tag3
        タグ3
    .post__btn
      .post__btn__link
        =f.submit "投稿する"
```


```top_page.rb
class TopPage < ApplicationRecord
  # belongs_to :user
  # belongs_to :category 
end
```

つまり改善はモデルのアソシエーションをコメントアウトしただけです笑
ユーザ−機能とカテゴリ機能を実装していないのにモデルにバッチリ記述してたから
nullで返せなかったみたいです。気をつけないと
LaravelのMailで、機能ごとに送信元アドレスを切り替えたい(Gmailなど)時にめっちゃ詰まった話

顧客「Aの機能の時は、hoge@gmail.comで確認メールを送信して欲しいんだよね」

ぼく「わかりました」

顧客「Bの機能の時は、hogehoge@gmail.comで確認メールを送信して欲しいんだよね」

ぼく「承知の助」


１時間後

ぼく「ん？むずくね？」


というわけで、詰まったお話


##なんで詰まったのか

LaravelのMailってfromとかのfunctionがあって一見簡単に切り替えられるように見えるんですけど

```ruby:こんな感じに変えられそう
Mail::from('hogehoge@gmail.com')
      ->to($request->user_mail)
      ->send(new Mail($request->user_name));
```

まぁ当たり前なんですけど、ダメなわけで

そもそもGmailを使用するには、当然usernameとpasswordを使用しているわけで、それを.envに書いて読み込んでるわけですよね

```ruby:.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME= hoge@gmail.com
MAIL_PASSWORD=passpasspasspasspass
MAIL_ENCRYPTION=ssl
```

要はこの
MAIL_USERNAMEと
MAIL_PASSWORDはいつ読み込まれて、どうやって変更するんだ！！
って悩んだわけですよ。


## 参考にさせてもらったのが↓
https://qiita.com/dublog/items/3314ca25a90e76f63b17

かなりわかりやすくプロセスのライフサイクルとサービスコンテナについて書いてくれていて助かりました。

### かいつまんで説明すると

・ユーザーからリクエストがくる
・app.phpがMailServiceProviderをコンテナに格納する
・内部でTransportManagerがnewされる(singleton)
・createSmtpDriver()でusernameとpasswordがconfigから読み込まれる
・メールをsendする際に、読み込まれたusernameとpasswordなどからメールが送信される

という流れなわけですよ。

これsingletonとか諸々の影響で、後から書き換えられない(できるかもしれないけど)せいでまぁえらい時間がかかりました。

## 結局どうやったの？

こうやりました↓

```ruby:controllerの内部
extract(\Config::get('temp_mail'));

$transport = (new \Swift_SmtpTransport($host, $port))
    ->setUsername($username)
    ->setPassword($password)
    ->setEncryption($encryption);
\Mail::setSwiftMailer(new \Swift_Mailer($transport));
\Mail::to($request->user_mail)
    ->send(new TempMail($request->user_name));
```

```ruby:config/temp_mail
<?php

return [
    'host' => 'smtp.gmail.com',
    'port' => '465',
    'username' => 'hogehoge@gmail.com',
    'password' => 'passpasspasspass',
    'encryption' => 'ssl',
];
```

## 何をやっているの？

既存のSwiftMailerだと
transport(usernameとかpasswordとか持ってるあれ)
がcontrollerに処理が届く前に、configから読み込まれて上書きできないので
もう1から$transportを作って、 SwiftMailerもろともnewしちゃいましょうって解決法でした。

これは
https://laravel.io/forum/07-22-2014-swiftmailer-with-dynamic-mail-configuration
にて参考にさせてもらいました。

## というかね

本当にlaravelのMailでさくっと出来ないんですかね・・・？

めちゃくちゃ頻発する案件だと思うんですが。。

何か他にさくっとできる方法があったら共有していただきたいです。
HTMLのchangeイベントを強制発火させる

#### 次のような処理をした場合changeイベントは発火するのか

```
<!--HTML (Angular)-->
<div>
    <input type="text" id="hoge" (change)="hogeEvent()">
</div>
```

```
//TypeScript (Angular)

(document.getElementById('hoge') as HTMLInputElement).value = huga;
```

確認してみましたが、残念ながら発火してくれませんでした。というわけで次の行をTypeScriptに追加してあげましょう。

```
//TypeScript (Angular)

let event = new Event('change');
(document.getElementById('wegpunkte') as HTMLInputElement).dispatchEvent(event);

```

new Event('change')を生成してdispatchEventで発火させることで、changeと対応するイベント(例のコードではhogeEvent)が実行されます。

もし親要素にもchangeイベントがあって発火させたいのであれば、bubblesオプションで

```
let event = new Event('change',{bubbles:true});
```
と追加してあげれば祖先に当たる要素でも実行されます。
Kotlin用Twitter APIラッパー『Penicillin』をAndroidで使う

# はじめに
Gradleのdependenciesに書くだけでは動かず、かなり面倒だったので忘備録として残しておく。
Androidを触るのは久しぶりなので、違うやり方してるかも。

環境
Windows10
Android Studio 4.0
Kotlin 1.3.72
Android SDK Build-Tools 30

# Penicillinとは
[Penicillin - Github](https://github.com/StarryBlueSky/Penicillin)
日本の大学生が作っているTwitterラッパー。めちゃくちゃ使いやすい。
クエリを非同期やコールバックで実行できたり、.next()や.untilLast() ひとつでページングが出来る。
Twitterクライアントブームが過ぎてtwitter4jも死んだ今、オレオレTwitterアプリ界に燦然と輝く若き星。

# やり方
appモジュールのbuild.gradleを以下のように追記。
バージョンは適宜変更。

```gradle:build.gradle
android {
    ...
    kotlinOptions {
        jvmTarget = "1.8"
    }
    packagingOptions {
        exclude("META-INF/*.kotlin_module")
        // More than one file was found with OS independent path 'META-INF/jsonkt.kotlin_module'.
        // ビルド時のこのエラー回避。正しい方法かは分からないが、ちゃんと動作している。
    }
}

repositories {
    mavenCentral()
    maven {
       url "https://dl.bintray.com/nephyproject/stable"
    }
}

dependencies {
    ...
    implementation "io.ktor:ktor-client-android:$ktor_version"
    // OkHttpを使う場合  後述
    // implementation "com.squareup.okhttp3:okhttp:4.7.2"
    // implementation "io.ktor:ktor-client-okhttp:$ktor_version"
    
    implementation "blue.starry:penicillin:5.0.0"
}
```

# Ktor HTTP Client Engineについて
Penicillinが使用するHTTPクライアントエンジンを選択する必要がある。エンジンが違えば、依存関係やサポート機能も異なる。
[Engines - Clients - Ktor](https://ktor.io/clients/http-client/engines.html)
READMEに書いてあるリンクを見ると、AndroidではOkHttpかAndroid標準を使えと書いてある。
画像表示でPiccasoを使うなら一緒にOkHttpも入れるだろうから、そうした方が良いだろう。
/remindについてのサンプル例文集

# 概要
slackの/remindって書く時、どう書くんだっけ・・・？
ってよくなるので備忘録としてサンプル例文集を残します。

◆参考サイト
[公式ページ：リマインダーを設定する](https://slack.com/intl/ja-jp/help/articles/208423427-%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)
[slack リマインダーの設定整理 /remind](https://qiita.com/HyunwookPark/items/0e7d81d34307d0acea6c#)

# 基本構文
```
 /remind [@メンバー または #チャンネルl] [内容] [いつ]
```

詳しい内容については上記参考サイトを確認してください。

#サンプル例文
以下、slackの設定としては下記とします。
また、自分のダイレクトメッセージのコメントフィールドで設定してるものとします。

自分：@jibun
他人：@tanin
slack内のチャンネル:test-channel

## 1.自分へのリマインド

## 1-1.毎日のイベントを設定したい場合

#### ◆通知したい内容
* メンション：なし
* 内容：歯磨き忘れずに
* 曜日：毎日
* 時間：9:00

```
/remind me
歯磨き忘れずに
at 09:00 every day
```
## 1-2.決まった曜日のイベントを設定したい場合

### ◆通知したい内容
* メンション：あり（自分に通知）
* 内容：今日は異世界に転生する日だよ
* 曜日：毎週月曜と金曜日
* 時間：8:00

```
/remind me
@jibun
今日は異世界に転生する日だよ
at 08:00 every Monday and Friday
```

下記の書き方(andではなくカンマ区切り)も同じリマインド。

```
/remind me
@jibun
今日は異世界に転生する日だよ
at 08:00 every Monday , Friday
```

また、@meと入れると自分の名前(ここでは@jibun)に変換されるので下記の入力でもおk。

```
/remind me
@me
今日は異世界に転生する日だよ
at 07:00 every Monday , Friday
```

## 1-3.今日のイベントを設定したい場合

### ◆通知したい内容
* メンション：なし
* 内容：大きなのっぽの古時計の修理作業
* 曜日：今日
* 時間：2時間後

```
/remind me
大きなのっぽの古時計の修理作業
in 2 hours
```

## 2.他人へのリマインド

## 2-1.平日のイベントを設定したい場合

#### ◆通知したい内容
* メンション：なし
* 内容：私メリー、今あなたの近くにいるの
* 曜日：平日
* 時間：21:00

```
/remind @tanin
私メリー、今あなたの近くにいるの
at 21:00 every weekday
```

## 2-2.特定の日のイベントを設定したい場合

#### ◆通知したい内容
* メンション：あり(@taninに通知)
* 内容：上から来るぞ！気を付けろ！
* 曜日:2020/05/01
* 時間：21:00

```
/remind @tanin
@tanin
上から来るぞ！気を付けろ！
at 21:00 on 2020/05/01
```

## 3.チームチャンネルへのリマインド

## 3-1.毎日チームへの伝達事項を設定したい場合

#### ◆通知したい内容
* メンション：なし
* 内容：今日の学級活動はおしまいです。下記フォームを提出して帰宅してください。
* 曜日:毎日
* 時間：19:00

```
/remind #test-channel
今日の学級活動はおしまいです
下記フォームを提出して帰宅してください。

■フォームURL
https://〜〜〜
at 19:00 every day
```

## 3-2.毎日チームへの伝達事項を設定したい場合

#### ◆通知したい内容
* メンション：あり（@channel）
* 内容：マインドフルネス瞑想の時間です。下記動画を視聴してください。◆動画URL〜
* 曜日:毎日
* 時間：09:00

```
/remind #test-channel
@channel
マインドフルネス瞑想の時間です。
下記動画を視聴してください。

■動画URL〜
https://〜〜〜
at 09:00 every day
```

# 終わり
以上サンプル例文でした。
誰かの助けになれば幸いです。
Slim 3とSlim 4のContainerInterfaceはnamespaceが違う

## 背景

社内にSlim 3のPJとSlim 4のPJがあって、Slim 4側は最近実装された新規開発でだいぶきれいに書かれていたので、レガシーなプロジェクト(Slim 3)のリファクタリング時にSlim 4の実装を真似していたらハマりました。
(こんな状況はなかなかないので参考にならなそうですが。。。)

`TypeError: Argument 1 passed to app\helpers\XxxHelper::__construct() must be an instance of Psr\Container\ContainerInterface, instance of Slim\Container given, called in /xxx/app/app.php on line 75 in xxxxx.php on line 19`

## 結論

`Slim\Container`を見ても`implements ContainerInterface`してるのになぜ?ってなってしまいましたが、
よくよくその定義を確認すると、Slim 3とSlim 4では `ContainerInterface` のnamespaceが違いました。
参考: https://stackoverflow.com/a/38270475

Slim 3: `Interop\Container\ContainerInterface`
Slim 4: `Psr\Container\ContainerInterface`

コピペしすぎに気をつけます。。。