OmniAICreator/Qiita-1.07M huggingface dataset:
家に携帯を忘れた時にGithubへ2FAを使わずにログインする方法

## はじめに
このご時世、誰もが携帯を持っている。
常に携帯するから携帯電話なのに、なーんで忘れてんですかね（#^ω^）

## Githubにログインできない
携帯電話を忘れると何が困るか。
PCがあれば大抵のアプリは使えるし、大きな問題はなさそう。
でも、Githubだけは別。
ログイン時に2FA(2 Factor Authentication)があり、携帯電話に送られるコードがわからないとログインできない。
うーん、コレは困った。

## 解決法
### SSHキーの確認
2FAを使わずにログインする方法を調べてみると、次の記事が見つかった。
[GitHubで二段階認証のトークンが使えなくなった時やること](https://qiita.com/amichang/items/ac5b306cc3355ca41710)
リカバリーコードはわからないけれど、SSHキーは登録していたから、このやり方でできるかな。
[SSHキーは登録済みか](https://qiita.com/amichang/items/ac5b306cc3355ca41710#ssh%E3%82%AD%E3%83%BC%E3%81%AF%E7%99%BB%E9%8C%B2%E6%B8%88%E3%81%BF%E3%81%8B)

自分がSSHキーを登録したかどうかがわからない人は、次のURLにアクセス。
https://github.com/(あなたのユーザID).keys
これでkeyというか文字の羅列が表示されたら登録してあるということ。
`Not found`だったら別の方法でアクセスを。

### サポートキーの発行
[GitHubサブアカウントの2FAリカバリコードでログインできなかった](http://ytyaru.hatenablog.com/entry/2017/07/31/000000)によると、
SSHキーが登録してあれば、次のコマンドでサポートキーを発行することができる。

```
$ ssh -i ~/.ssh/rsa_csharpstudy0 -T git@github.com.csharpstudy0 verify
```

このコマンドを打つと、次のような結果が返ってくる。

```
Please provide the following verification token to GitHub Support.
{サポートキー}
```

出てきたサポートキーをコピーしよう。

### Githubにメールを送る
サポートキーをコピーしたら、https://github.com/contact を開く。
ここからGithubにメールを送れる。
送るのに必要な内容は、サポートキーとあなたのアカウントと2FAを解除してほしいという旨。
あとは返信を待とう。

## 最後に
2FAを使わずにGithubにログインできるけど、めんどくさい。
メールが返ってくるのに時間もかかるしね。

それ以前に、**携帯は携帯しよう!!**

## 参考資料
[GitHubで二段階認証のトークンが使えなくなった時やること](https://qiita.com/amichang/items/ac5b306cc3355ca41710)
[GitHubサブアカウントの2FAリカバリコードでログインできなかった](http://ytyaru.hatenablog.com/entry/2017/07/31/000000)
Golanのsqlxで名前付きパラメタを扱う

golangには[sqlx](https://github.com/jmoiron/sqlx)という`database/sql`の拡張機能を提供するライブラリがあります。

このライブラリはSelectクエリを発行する際に同時にstructへ結果をマッピングしてくれる機能を提供しており非常に便利なのですが、READMEを見てみると名前付きクエリを発行しつつ、structへのマッピングする方法が書かれていません。

__※MySQLだと`sql.Named`が利用出来ないため、名前付きクエリを実現するにはこのようなライブラリに頼る必要があります。__

```go:structへのマッピングを行うクエリ
type User struct {
	NameA string `db:"name_a"`
	NameB string `db:"name_b"`
}

query := `SELECT * FROM users WHERE name_a = ? OR name_b = ?`

var user User

// 同じ名前を重複して指定しないといけない。
if err := sqlx.Get(&user, query, "Tom", "Tom"); err != nil {
	log.Print(err)
}
```

```go:REAMEで紹介されている名前付きクエリの実行方法
query := `SELECT * FROM users WHERE name_a = :name OR name_b = :name`

// 名前付きクエリを発行する機能はあるものの、結果がsql.Rowsで返ってきてしまう…
rows, err = db.NamedQuery(query, map[string]interface{}{"name": "Tom"})
```

じゃあ方法が無いのかと言うとそういうわけではなく`sqlx.Named`という機能が提供されており、これを利用することでstructへのマッピングと名前付きクエリをあわせて行えるようになります。

```go
query := `SELECT * FROM users WHERE name_a = :name OR name_b = :name`
bindParams := map[string]interface{}{
	"name": "Tom",
}

// sqlx.Namedを利用すると、名前付きパラメタが?に置換され、それに対応するバインドパラメタのsliceが返される
query, params, err := sqlx.Named(query, bindParams)
if err != nil {
	log.Print(err)
}
log.Print(query)  // SELECT * FROM users WHERE name_a = ? OR name_b = ?
log.Print(params) // ["Tom" "Tom"]

var user User
if err := sqlx.Get(&user, query, params...); err != nil {
	log.Print(err)
}
```
apt と仲良くなりたい

適当に近くにあったイメージで動かしています。

```
$ docker run -it ruby:2.6.0-slim-stretch bash
```

```
# lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 9.6 (stretch)
Release:	9.6
Codename:	stretch
```

# まずは apt update から

これは何をしているかといいますと

`/etc/apt/sources.list` をもとにパッケージ情報を取得してきます。取得した情報は `/var/lib/apt/lists/` に配置されます。

## 例
たとえば yarn をインストールする手順を見て見ます。

```bash
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt-get update && sudo apt-get install yarn
```

このように、まずは、`/etc/apt/sources.list.d/` に配置をしています。その後に `apt udpate` をして、最後に `apt isntall` となっています。

# つぎに apt autoremove

これは、依存性のために自動で入ったけど、今はつかってないパッケージを削除してくれます。なので、

```
apt install nodejs
apt remove nodejs
```

などをしたときに、残骸として残っている不要なパッケージを削除するときに役立ちます。

# apt clean は何をしてくれるか

これは、シンプルに `/var/cache/apt/archives/` を綺麗にしてくれます。

では、いつこのディレクトリにファイルが入るかと言うと... `apt install hoge` したら入りそうなのですが、入らない... docker 固有の問題なのか... **よくわかりません！**

以上です。すこしずつ仲よくなりたいです。
エンジニアがドラクエなら？どの作戦が好き？ぼくは完全に「いのちだいじに」だけど。

エンジニアがドラクエなら？どの作戦が好き？ぼくは完全に「いのちだいじに」だけど。

この7種類でエンジニアのタイプは全部説明できそうな気がした。

# こんな作戦あったっけ

![image](https://user-images.githubusercontent.com/13635059/51151535-a732a100-18ae-11e9-9997-6db25d795d52.png)


---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
VSCodeでWSL上のSolargraphを使ってRubyの補完を実現する

VSCode上でRubyを書く際には、拡張機能をインストールしないと補完が効きません。
補完を提供している拡張機能はいくつかありますが、[Ruby Solargraph](https://github.com/castwide/solargraph)が有名かと思います。

Windows上で開発する際に`Ruby Installer`を使用していれば特に困ることはありませんが、WSLにRubyの環境を構築してVSCodeはWindowsにインストールしている場合、VSCodeからWSL上の`solargraph`を見に行くことができません。

そこでbatを1つ作成して橋渡しをしてやります。

```bash:solargraph.bat
@echo off
bash -c "~/.rbenv/shims/solargraph %*"
@echo on
```

このbatをVSCodeの設定から見えるようにします。

```json:setting.json
{
  "solargraph.commandPath": "C:\\path\\to\\solargraph.bat",
}
```

すると`.rb`で`Solargraph`の補完が効くようになります！

このテクニックは`Solargraph`に関わらず他のものでも使えますので、覚えておくと便利かと思います。

### 参考

https://github.com/castwide/vscode-solargraph/issues/80#issuecomment-423748289
【自分用】Androidビルド・ファイル用語辞典【追記予定】

アンドロイドアプリを作る際に、知らない用語がたくさんでてきたので、あとで読むようにまとめておく。
気づいたら増やしていく。

--------
## xmlns:android="http://schemas.android.com/apk/res/android" 
このファイルがAndroid向けxmlファイルであることを示すもの。改変不要。

## package
javaからメインファイルまでのパスを指定。最低でも2階層以上。
package="com.example.sample"

```
main
├ AndroidManifest.xml
└ java
    └ com
       └ example
            └ sample
                 └ main
```

## uses-permission
Androidが特定の機能を使うための記述。**ユーザが判定**

## uses-feature
Androidが特定の機能を必要とする場合に記述。インストール可能か**ストアが判定**
android:reuqired="true" → 必須機能。ない端末は**ストアにも記載されない**

## uses-library
Androidが特定のライブラリを必要とする場合に記述。
android:name="com.google.android.maps"
android:required=["true | false"]

## allowBackUp
バックアップを利用するかどうか。
android:allowBackUp="true"

## largeHeap
ヒープ領域を大きく確保するための手段。（通常使用すべきではない）
android:largeHeap="true"

## supportsRtl
右から左へのレイアウトをサポートするかどうか
android:sapportsRtl="true"

## theme
全アクティビティ共通のデフォルトテーマを定義。
styleリソースへの参照を指定
個別にアクティビティで上書きも可能
android:theme="@style/SampleTheme"


## icon
アプリケーション全体のアイコンを指定。
Drawableリソース参照を指定する
android:icon="@mipmap/ic_launcher"


## label
アプリケーション名を指定。
文字列リソース参照 or 文字列リテラル

## xxx.iml

## local.properties

## gradle.properties

## ＠NonNull
設定しておくとIDE上で警告を発してくれるようになるアノテーション。

## messageDialog

## setVisibility(View.GONE)

ビューを詰めて消す

## setVisibility(View.INVISIBLE)
ビューを詰めないで消す

## setVisibility(View.VISIBLE)
ビューを表示する

## SharedPreferences
アプリ内に保存するデータを格納する場所
getSharedPreferences("hoge", Context.MODE_PRIVATE);

## setContentView

## Promise

## BuildConfig
build.gradleの記述に沿って変数等が自動でできるクラス

## moveTaskToBack()
アプリを中断する。HOMEボタンを押下したのと同様の動作をする。

## setSupportActionBar(view)
viewをアクションバーとセットする。
アクションバーの機能が使える


## 参考にさせて頂いたページ
https://www.giblock.jp/labo/androidmanifest_app_props.html
http://yuki312.blogspot.com/2016/02/android-nonnull.html
メモ > particles.js



結構いろんなHPの背景でうねうね、うにょうにょ動いているアレ



![particles.gif](https://qiita-image-store.s3.amazonaws.com/0/49910/98980f14-64fd-8f0b-e1f7-c4f4acbe0911.gif)


## サイト

https://vincentgarreau.com/particles.js/


## github

[VincentGarreau/particles.js: A lightweight JavaScript library for creating particles](https://github.com/VincentGarreau/particles.js/)


## demo: 

[particles.js](https://codepen.io/VincentGarreau/pen/pnlso)

[CodePen demo](https://codepen.io/VincentGarreau/pen/pnlso)


## その他

右上のメニューから他を選択すれば雪なども可能になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/93e1eb5a-1214-9b1e-56d6-90371d7cd09c.png)



![snow.gif](https://qiita-image-store.s3.amazonaws.com/0/49910/16efd974-170e-b286-55c1-583a64ffc4ae.gif)
CarPlay 対応アプリを iOSシミュレータで動かす

## 動作環境

- Xcode 10.1

## 手順

iOS Simulator のメニューから Hardware > External Displays > CarPlay でCarPlay用のSimulatorが起動する。メニューに表示されない場合はターミナルを起動し、

```
defaults write com.apple.iphonesimulator CarPlay -bool YES
```

を入力する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/17906c64-28c0-4c4b-77b8-27b7f4861062.png)

## 実行結果

![Simulator Screen Shot - iPhone 8 - 2019-01-14 at 00.41.31.png](https://qiita-image-store.s3.amazonaws.com/0/8292/dbf2df61-fd26-33c9-66fe-d63645720c7a.png)

## リンク

とりあえず動くものを作ってみたい方は次の記事をどうぞ。

- [CarPlay対応アプリを雰囲気で作ってみる \- koogawa blog](https://blog.koogawa.com/entry/2019/01/15/003501)
php-master-changes 2019-01-14

今日はコンパイラ警告の除去、Exception::\_\_clone と Reflection::\_\_clone の復活、FFI のマージ、mb_scrub() が null 文字以降を勝手に切り詰める問題の修正、opcache のテスト修正、RecursiveFilterIterator　を 2 つ RecursiveDirectoryIterator に追加すると SEGV が出る問題の修正、ASAN と ifunc をあわせて使う際クラッシュする問題へのワークアラウンド、php.ini のコメント修正、mysqlnd のメモリリークの修正があった！

# 2019-01-14
## KalleZ: Kill this new and insanely annoying warning
- https://github.com/php/php-src/commit/1ff33f3161924c3454ea61694bf66d42232d492a
- Typed Properties マージで入ったコンパイラ警告の除去
- よくわからんのでキャストを入れたみたいな形

## nikic: Change zend_try_array_init_size arg to uint32_t
- https://github.com/php/php-src/commit/e25e2bd9bd0b878caf5fe80f6b53c7d42657ebd1
- ↑のキャストを外して zend_try_array_init_size() の仮引数を size_t でなく uint32_t に

## nikic: Revert removal of private __clone() methods
- https://github.com/php/php-src/commit/d0fd2be64234d978e62fb27d6012087514550e71
- 11 月に Exception と Reflection の __clone() を[削除する修正](https://qiita.com/sj-i/items/86d50ffc956704cc880a#nikic-remove-redundant-exception__clone-method)をしたのをリバート
- Reflection でオブジェクトがなくクラスしかないケースで [isCloneable](http://php.net/manual/ja/reflectionclass.iscloneable.php) の判定に使うため、消すと互換性崩れてアカンかったなあ、ということらしい

## dstogov: Added FFI extension
- https://github.com/php/php-src/commit/e089d506d5c7716c62cee5232d32ab22d0ddde26
- [FFI](https://wiki.php.net/rfc/ffi) のマージ
- PHP 8 の目玉機能とされていたのはあと JIT と非同期かな

## nikic: Fixed bug [#77454](https://bugs.php.net/bug.php?id=77454)
- https://github.com/php/php-src/commit/3ad0ebdf5cdc6dbe077685907d012eaeac7ea6e4
- [7.2~]
- ext/mbstring で、mb_scrub() が null 文字以降を勝手に切り詰める問題の修正

## dstogov: Fixed 32/64-bit mismatch
- https://github.com/php/php-src/commit/2f89baf5c76a1fd172b16f3d905773875aaf6e11
- ext/opcache で、テストの期待出力が 32bit / 64bit で違っていた部分を吸収するよう修正

## dstogov: Fixed bug [#77263](https://bugs.php.net/bug.php?id=77263) (Segfault when using 2 RecursiveFilterIterator)
- https://github.com/php/php-src/commit/920450534ea7bc8852509d159d488a62f8032c80
- [7.3~]
- RecursiveFilterIterator　を 2 つ RecursiveDirectoryIterator に追加すると SEGV が出る問題の修正
- ZEND_INIT_METHOD_CALL のオペコードハンドラの実装の問題だったみたいなので、他にも死んでたケースがありそう？

## nikic: Fixed bug [#77447](https://bugs.php.net/bug.php?id=77447)
- https://github.com/php/php-src/commit/c8c5a3ab8afdaa4692784a54a678cc565ecd1834
- [7.3~]
- [ASAN](https://github.com/google/sanitizers/wiki/AddressSanitizer#using-addresssanitizer) 付きでビルドすると zend_cpu_supports_avx2() 実行時にクラッシュする問題の修正
- ASAN と ifunc で互換性ないという問題が[結構前からある](https://github.com/google/sanitizers/issues/342)もよう
- 今回の修正では `__attribute__((no_sanitize_address))` で対処してるもよう

## wbob: document open_basedir and realpath cache coupling in php.ini
- https://github.com/php/php-src/commit/5ac9990ddf0521b1c79b5e061a342a6dfb53d30c
- [7.2~]
- php.ini のコメントで、open_basedir の設定時 realpath cache が無効になるむね追記

## dstogov: Fixed bug [#77308](https://bugs.php.net/bug.php?id=77308) (Unbuffered queries memory leak)
- https://github.com/php/php-src/commit/1a306cc9a1679a758c859731a78429429830a439
- [7.3~]
- ext/mysqlnd で、`PDO::MYSQL_ATTR_USE_BUFFERED_QUERY` が false な unbuffered クエリでメモリリークする問題の修正
iPhoneの音声入力の日本版のローカライズがひどい。サービス品質を支えるのは国民ユーザの利用度や熱望かもしれない。

iPhoneの音声入力の日本版のローカライズがひどい。サービス品質を支えるのは国民ユーザの利用度や熱望かもしれない。

![image](https://user-images.githubusercontent.com/13635059/51149455-8ca7fa00-18a5-11e9-8c1e-d8486d518fb7.png)
￼

iPhoneの音声入力で半角スペースを入力するためにはまさかの、タブキーと喋る必要があるみたいだ。とゆうか、実際やってみたけれど、これは半角スペースじゃなくて本当にタブ入力だ。

それで、Google検索しても全然出てこないし、現在iPhoneの音声入力で半角スペースを入力する方法は、存在しないらしい。

大事なことなので2度言いますね。存在しない……らしい。

#	なぜこんなことが起こってしまうのだろう

こんなに素晴らしいiPhoneの音声入力機能なのに、まさかの不具合レベルの欠陥があるなんて。半角スペースがどれぐらい文章入力に必要であるか。

特にマークダウンを入力するときの論理構造のためには必須の半角スペース。何故なんだろうなぁ。

#	日本で使っているユーザがいないからだろうか？

音声入力で文字起こしをしているユーザを見かけたことがない。

せっかく素晴らしいサービスであっても、文化的に家何なのか、国民に広まらない、だからコストをかけて開発もしない。だから日本向けにサービスが向上しない。この悪循環無限ループではないだろうか。

#	この音声入力の機能自体は

iPhoneのキーボードにも必ず表示されている位で、グローバルには必要とされているものだと思う。

なので多分日本の文化とマッチしないと言うことなのだと思うなぁ。

海外でも半角スペースが入力できないのかなあ。そうしたらiPhoneの標準機能に重大な不具合があると言っても過言ではない位の問題だと思うけれど。

いや、今気づいたけど、わかったぞ!英語の場合はそもそも文章がスペース区切りで入力されるから、スペース入力と言うもの自体が存在しないんだきっと。

という事は、やはり日本語版のローカライズがちゃんと行われていないと言うことになるな。

#	結論

ローカライズされた機能と言うのは、文化的な問題によって、サービス向上が行われず、アプリの劣化版が作られてしてしまうかもしれないと言う反省になったぞ。

サービスの品質を支えているのは、開発者でもあるけれど、僕らユーザ自身でもあるのだと言う本質に思い至ったな。


---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues










<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AWS Lambda から S3 に保存したPDFファイルをダウンロードするメモ

AWS Lambda からS3に保存したPDFファイルをダウンロードする際の覚書きです。

続きの記事を書きました。
[Amazon CloudFront経由で、S3からLambda for Ruby2.5を使ってPDFファイルをダウンロードする](https://qiita.com/sy250f/items/c84ab612d1629067b43b)

# 流れ

1. S3バケットを作成
2. IAMロールの作成
3. Lambdaファンクションの作成
4. API Gatewayの設定
5. S3にPDFファイルを保存
6. ファイルダウンロードのコードを作成
7. API Gateway のAPI エンドポイントにアクセス
8. ファイルがダウンロードされることを確認

# S3バケットを作成
東京リージョンにS3バケットを作成します。

 - バケット名：バケット名(ex. kazu-lambda-test001)

# IAMロールの作成
S3にアクセスできる権限を持つユーザーロールを作成します。

### ポリシーの作成

 - サービス：S3
 - アクション：GetObject, PutObject
 - リソース：S3バケットARN/*
 - ポリシー名：luck-s3-get-put-policy

### ロールの作成

 - ロール名：lambda-s3-read-write-role
 - 利用サービス：Lambda
 - ポリシー：AWSLambdaBasicExecutionRole, luck-s3-get-put-policy, AmazonAPIGatewayPushToCloudWatchLogs

# Lambdaファンクションの作成
AWSのLambdaコンソールからLambdaファンクションを作成します。

 - ファンクション名：s3PdfDownload
 - ランタイム：Ruby2.5
 - ロール：lambda-s3-read-write-role

# API Gatewayの設定
テストの為、セキュリティはオープンに設定します。

 - API：新規APIの作成
 - セキュリティ：オープン
 - 設定：バイナリタイプメディア：application/pdf

### メソッドリクエストの設定画面
<img width="625" alt="スクリーンショット 2019-01-15 6.24.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/e3496d0c-7b13-e8a6-cbb5-5d2a20c48974.png">

### メソッドリクエストの設定画面
<img width="724" alt="スクリーンショット 2019-01-15 6.25.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/e9805659-eb21-b028-7091-c9d26ce754d7.png">

### バイナリメディアタイプの設定画面
<img width="921" alt="スクリーンショット 2019-01-15 6.25.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/bf2312f2-ddf2-5749-08aa-f20ca8b6857c.png">

設定が終わったらステージを選んで保存します。
API Gatewayの設定を変更した場合は、デプロイするステージを選択して保存（デプロイ）します。

# S3にPDFファイルを保存
S3にPDFファイルをアップロードします。
今回は事前に[Thinreports](http://www.thinreports.org)で作成したPDFファイルをアップロードしました。

# ファイルダウンロードのコードを作成
Lambdaコンソールでコードを記述します。

```ruby
require 'json'
require 'base64'
require 'aws-sdk-s3'

def lambda_handler(event:, context:)
    region = 'リージョン'
    bucket_name = 'バケット名'
    key = 'hello_world.pdf'
    s3 = Aws::S3::Resource.new(region: region)
    obj = s3.bucket(bucket_name).object(key)
    puts "pp object => "
    pp obj
    resp = obj.get()
    puts "pp resp"
    pp resp
    puts "pp resp.body"
    pp resp.body
    pp resp.content_type
    { statusCode: 200, headers: { 'Content-Type': 'application/pdf' }, body: Base64.encode64(resp.body.read()), isBase64Encoded: true }
end
```

# テスト
Lambdaにてテストを実行します。
レスポンスにPDFが出力されていることを確認します。

# APIエンドポイントにアクセス
APIエンドポイントにアクセスします。
LambdaのコンソールからAPI Gatewayを選択し、APIエンドポイントのURLリンクをクリックします。
ブラウザでアクセスして、エラーで表示されないことを確認します。

# cURLで実行
cURLを使って実行してPDFファイルがダウンロードされることを確認します。

```sh
$ curl -H "Accept: application/pdf" "APIエンドポイントURL" > test.pdf
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 45348  100 45348    0     0  84780      0 --:--:-- --:--:-- --:--:-- 88397
$ ls
test.pdf
```
ダウンロードされたファイルを開いて確認します。

続きの記事を書きました。続きでは、ブラウザからアクセスしてPDFを表示させます。
[Amazon CloudFront経由で、S3からLambda for Ruby2.5を使ってPDFファイルをダウンロードする](https://qiita.com/sy250f/items/c84ab612d1629067b43b)

# 参考リンク
 - https://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html#get-instance_method
parcel便利過ぎ。もうless、scss、stylusのコンパイルで悩むことはない。

すごいすごいとは聞いていた[parcel](https://parceljs.org/)ですが、webpackで良いかと思って触っていませんでした。しかし今回新しくstylusの環境を構築をするため、試しに使ってみて驚きました。
これは使わない理由がない。

parcelの追加からscssのコンパイルまでを説明します。

# parcelのインストール
デモ用のプロジェクトを作り、parcelを追加するまで。

```bash
# プロジェクトの作成
$ mkdir parcel-practice
$ cd parcel-practice

# package.jsonの作成
$ yarn init
# parcelのインストール
$ yarn add parcel
```

# scssファイルの作成
デモ用のscssファイルを作ります。
まず依存されるscssファイルの作成。

```bash
$ mkdir src
$ vi src/_page.scss
```

```scss:_page.scss
$primary-color: #333;

body {
	p {
		color: $primary-color;
	}
}
```

次に、エントリーポイントとなるscssファイルの作成

```bash
$ vi src/style.scss
```

```scss:style.scss
@import 'page'
```

# コンパイル
いよいよコンパイル。

```bash
$ parcel src/style.scss
Server running at http://localhost:62665 - configured port 1234 could not be used.
✨  Built in 44ms.
```


**以上です!!!!**

これでdistフォルダが自動的に作成されて、内部にstyle.cssが生成されます。

```css:dist/style.css
body p {
	color: #333;
}
```

しかも、、

**変更監視も自動で行います！**

_page.scssやstyle.scssに変更を加えて見てください。
自動的に再コンパイルが実行されるはずです。
もちろん、依存関係のあるファイルの変更も同様に監視します！

# ベンダープレフィックスを付与したい場合
クロスプラウザ対応のためのベンダープレフィックスの追加も、parcelなら設定ファイルを加えるだけでつけてくれます。
.postcssrcというファイルをプロジェクトディレクトリに追加します。

```bash
vi  .postcssrc
```

中身に以下を記載します。

```.postcssrc
{
  "plugins": {
    "autoprefixer": {},
  }
}
```

これだけです。

試しにベンダープレフィックスが必要なスタイルを記述します。

```scss:_page.scss
$primary-color: #333;

body {
  display grid
  grid-template-columns 200px 1fr
  p {
    color: $primary-color;
  }
}
```

コンパイルの実行

```bash
$ parcel src/style.scss
```

コンパイル結果は、、

```css:dist/style.css
body {
  display: -ms-grid;
  display: grid;
  -ms-grid-columns: 200px 1fr;
      grid-template-columns: 200px 1fr;
}
body p {
  color: #333;
}
```


# stylus, lessへの対応
そのままstylファイル、lessファイルでscssと同様のことをすれば動きます。

```bash
$ parcel src/hoge.less
$ parcel src/hoge.styl
``` 


# 参考
* [Sassのモダンなコンパイル環境が3分で作れるParcel入門 - 独自設定ファイルは不要 - ICS MEDIA](https://ics.media/entry/19580)
* [Bundling Your Web App Using Parcel ← Alligator.io](https://alligator.io/tooling/parcel/)
まだアウトプット学習のローカライズしてないの？ タイトルを変えてQiitaにも、はてなブログにも投稿する実験。Googleは dont be evil とは言わないよね？

# はてな用記事タイトル

マーケティング的手法？ タイトルを変えてQiitaにも、はてなブログにも投稿すれば一粒で二度美味しい実験。これを悪だと思うか？善だと思うか？

# Qiita用記事タイトル

まだアウトプット学習のローカライズしてないの？ タイトルを変えてQiitaにも、はてなブログにも投稿する実験。Googleは dont be evil とは言わないよね？

# イメージ

![image](https://user-images.githubusercontent.com/13635059/51148491-c5de6b00-18a1-11e9-9da9-b086938a522b.png)

# what

- ブログ記事を一個書いても、伝えたいエッセンスというのは実はTwitterで共有できる140文字ぐらいだったりする
- 日常生活とエンジニアリングやそのためのアウトプット学習を、切り分けられない部分がある、境界線なんか実は存在しない
- はてなブログとQiitaでは見てるユーザー層が違うので、世界に重複した記事を二個作っても、意外とかぶらないのでは。アイディアや発想を売る感じ。
- ある意味、一個のコンテンツの、サービスごとのローカライズだと言えるかもしれない。Qiitaとはてなブログだと、そもそも別の国、別の世界なので「言語」が違うのだ。

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues










<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Twitterは日本語でも140文字の制限を撤廃してブログみたいになるべきなのか？でも完全な自由はTwitter独自の生態系を壊してしまうかもしれないな。

Twitterは日本語でも140文字の制限を撤廃してブログみたいになるべきなのか？でも完全な自由はTwitter独自の生態系を壊してしまうかもしれないな。

![image](https://user-images.githubusercontent.com/13635059/51148196-9a0eb580-18a0-11e9-8214-ce8d0b5e0c66.png)
￼


# Twitterとブログを使い分けていきたい。だけどたった2つのサービスを使い分けるだけで、ものすごくオーバーヘッドが高くて、この組み合わせに常に悩んでいる気がする。

それだけサービス2つを組み合わせて使うと言う事は、簡単なようであって、高度な技術を必要とされると思う。

Twitterとブログの違いは、単純に、根本的に言うと、長い文章が書けるかかけないかの違いだ。

# それで1番大事なのは、自分のエネルギーの状態というか、どのぐらいの大きさの文章を書きたいかと言うモチベーションに敏感になることだと思う。

例えばこれをゲームのロックマンに例えると、小さな弾丸をたくさん打ちたい時もあるし、大きなショットエネルギーを貯めて貯めてショットしたい時もある。

大きなちょっと打てない時、エネルギーが足りないときは、Twitterでたくさんの弾丸をちょっとずつ射撃したい気持ちだ。

たくさんエネルギーがあるときは大きな弾丸のブログを射撃したいけれど、だけどそうすると、Twitterのリアルタイムの流れには乗れずに、固定したものを最初からTwitterに投げることになる。Twitterにブログを共有する場合の話だけれども。

かといってTwitterでどんどんツイートを連鎖させて、ブログのように書いていくと、いっこずつのツイートの140文字と言う制限がだんだんと重く感じられて、どんどん書きたい文章のトピックが溢れてしまって、全然Twitterと言う器に入りきらないことがある。

# このように、単純に文章の文字数の制限が元になってはいるのだけれど、それよりも膨大な複雑なことが起きてしまう。TwitterにはTwitterの生態系があるし、ブログにはブログのインターフェイスがあるし。この2つの全ての要素を調和させようとすると、なかなかパズルのように頭を使ったり、完全な状態にはなかなかできずにもどかしい気持ちがする。

Twitterも12年以上のサービス。多くのユーザから要望があるように、そもそも今の時代に合わせて140文字の制限を撤廃してはどうだろうかと言う考えもある。だけどそれはそれで、ユーザの自由度が増す代わりに、Twitterらしさと言うものはある程度消滅してしまうかもしれない。

ユーザにとっては140文字の制限を撤廃したらより自由度が増すと思えるかもしれないけれど、制約が作るTwitter独自の生態系と言うものがあるので、この制限の文字数を変えるだけで、確実に僕らが予想だにしないところで、生態系とTwitterの国の中の様々な反応や、現象が連鎖的に変わっていくはずなのだ。風が吹けば桶屋が儲かるの世界である。




---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ドリカムの「未来予想図Ⅱ」に学びたい。エンジニアのアウトプット学習のチャンスを逃すともう二度と戻ってこないかもしれない。描かれなかったQiitaも永遠に戻ってこないかもしれない。夜の中で星をつかむように、いつでも名言を残せる手段を用意しておきたい。



![image](https://user-images.githubusercontent.com/13635059/51147843-2324ed00-189f-11e9-9be8-e52da692aaf9.png)

# そしてこのブログは、いつも通り、全く関係のない日常の着想から始まるのだ。


マインドフルネスはもう身に付いていているんだけど、最近、また真面目にやってみようかと思っている。

2年半ぐらい前にマインドフルネスをやり始めて、今では日常生活に溶け込んでいる。だけどまるで修行僧のような、ストイックな瞑想と言うのは今はやっていない。

1つボディースキャンと言う手法があって、頭のてっぺんから足の先まで少しずつ意識をシフトさせていて、体のセンスを感じていく手法だ。

# これを今日電車の中でやってみたらかなり体の中をというか体の表面を

意識が移動するような感じがして、とゆうか、自分の意識が肉体を実際に移動することが理解できて、かなり面白かった。マインドフルネスはゲームとか、アミューズメントになるかもしれないな。

マインドフルネスのブログをはてなで書いていて、それなりにプレビュー数があったけれど、最近では全くマインドフルネスに対して文章に起こすような情熱は感じていなかった。やっぱり最初に学び始めるときはいろんな生態系というか、複雑な物事を必死に理解しようとして、新しい世界がどんどん開かれていて、それを言語化して文書化しなければ仕方ないのだけれど、一旦当たり前のものになってしまうと、逆に今度は言語化と言うものが難しくなる。なぜなら、もうわかっていることをあえてカトレルだけのモチベーションが持てないからだ。

だからこそ、やはり言語かと言うのはものすごく大事で、しかも自分がよく理解していなくて直割理解したいとき、本当にもどかしさを感じているときに言語化をするのが1番良いと思う。

# いちど技術共有サービスのブログにも書いたことだけれど、

初心者の時が1番のアウトプットのチャンスで、中級者上級者になってしまうともうもどかしさを感じていないので、初心者目線を忘れてしまって、ビギナーズマインドを取り戻すことができず、素晴らしいアウトプットができなくなってしまうかもしれないのだ。

# だから言語化やアウトプットと言うものは本当に自分がもどかしさを感じているときにしなければいけない。

そうすることで爽快感を感じられるし、物事の理解は爆速でスピードアップするし、世界の様式を、複雑さを、宇宙の法則のようなものをこの手にほんの少しだけ掴み取ることができるのだ。

それで、僕はここで一体何を語りたかったんだっけ。もう僕は実はマインドフルネスに関して多くを語るモチベーションと言うのはもう二度と戻ってこないのかもしれない。一旦身に付いてしまったことではあるから。昔に覚えたスピードラーニング、速読みたいに。だからアウトプットするチャンスというのは本当に逃さずに大事にしたいものだな。

後で語ろうと思っても、語れなくなってしまうということが本当にたくさんある。今でしか語れないこと、今でしか表現できないこと、今でしか語るモチベーションが持てないこと、本当に今日1日の中でしか語るチャンスが存在しないことと言うのは本当にものすごくたくさんある気がするのだ。

# このほとんど僕らは取り逃がして輝かしい人生の一瞬を逃してしまっているいるのではないだろうか。

とても惜しいことだ。でも、だからこそ僕はアウトプットのための表現手段をiPhoneでもMacBookでもiPadでもたくさん用意しておいて、本当に手足を動かせる状態にしておいて、いついかなる時でも自己表現をできるようにしておきたいのだ。

蛇足になるけれど、

# ドリカムの未来予想図2と言う歌も、

本当に思い入れがある曲みたいで、アーティスト自身、もう二度とあの録音はできないだろうと語るインタビューをどこかで僕は聞いたことがある気がするぞ。そんな感じで。

ブログに文章を語ることやアウトプットすることは、アーティストのクリエイティブな行為にも似たものなので、一瞬のきらめきを逃さずに捕まえること、暗い夜の中でスターを手に捕まえることがとても大事なのだ。そんなことを考えるっているとブログなどのアウトプットの美しさや、人生の美しさにまで思いが至って、とてもきらびやかな気持ちで今iPhoneの音声入力をしている俺だぜ。

3連休も終わりか。それでは皆さんおやすみなさい。続きはまた今度。
https://twitter.com/yumainaura/status/1084836517153886210?s=12

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Googleの画像アップロード検索はなぜ使われないんだろう。街角のおじちゃんにジャンパーのビジュアルからテキスト情報を教えてもらって考えた。



# 街角のおじちゃんがしましまのジャンパーを着ていたので、かっこいいですねそれなんて言うんですかと聞いたら

ヤッケと言うんです。ホームセンターで買ったんですと教えてくれました。

気になるものがあったらほんとに聞いてみるものですね。

# Twitterでもエンジニアの人と話していたこと

今日もTwitterで他のエンジニアの人と、Google画像をアップロードして別の似た画像を見つけてくれるサービスについて、話してました。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">これかもですね:-)？<br><br>Googleの画像からの画像検索を思い出して使ってみました。 <a href="https://t.co/aGK7r2nHSs">pic.twitter.com/aGK7r2nHSs</a></p>&mdash; いなうらゆうま🤖LIFeHaCk (@YumaInaura) <a href="https://twitter.com/YumaInaura/status/1084638941171539968?ref_src=twsrc%5Etfw">January 14, 2019</a></blockquote>


なんというか、この体験2つ同時に共通点を見つけられそうな気がしていつも通りiPhoneの音声入力で語っています。

#	おじちゃんの情報

そのおじいちゃんは僕に情報を教えてくれました。僕がビジュアルについて質問をしたら、テキストで情報を教えてくれたわけです。

おじちゃんが来ているジャンパーはビジュアルの情報です。それをおじちゃんは覚えていてテキスト情報を僕に教えてくれたわけです。

#	アップロード検索

ではGoogleのアップロード形式の画像検索はどうでしょうか。これはGoogleがビジュアルとテキストの情報を覚えてくれていて、僕らがビジュアルを与えると、ビジュアルとテキストの情報を両方返してくれるという仕組みです。

なんだか混乱してきたような気もしました。1番違う点は、僕らがビジュアルは持っていても、テキスト的な情報を忘れてしまうていることがあると言うことです。

#	Googleの記憶力

Googleはその両方を覚えてくれていて紐付けができるわけです。ただ僕らがあまり画像をアップロードによる画像検索を使わないのは、なんだかインターフェース的な大きな手間があるからではないかと思います。

テキストの入力は簡単だけれど、画像の入力と言うのは、なんだか手に馴染んでいません。

#	アップロード検索にニーズはあるのか

いや、そもそも僕らのニーズがそれほど存在しないのかもしれません。大体僕らはビジュアルの由来と言うものを覚えていて、大抵の場合はテキストでGoogle検索できるような状態なのかもしれません。

だからこそ、大きなニーズがないからこそ、手に馴染んでおらず、アップロード画像検索を使わないと言うことなのかもしれませんね。

鶏が先か卵が先かなのですが、ニーズがないとサービスも進歩せず、僕らのユーザとしての行動も最適化がされず、結局そのサービスは使われないままと言うことになりかねません。

#	かなり疲れて2019年

いくつもの要素がこの話の中に混じり合っている気がします。なんだか結論が出なさそうなので、今日は語るのはここまでぐらいにしておいてやるんだぜ。

続きはまた今度。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
アプリケーション両思い？片思いの恋愛論。iPhoneのTwitterのアプリと標準のメモのアプリで双方向に共有をしたい。でもスクリーンショットやっぱ最強だよね、現時点ではさ。

アプリケーション両思い？片思いの恋愛論。iPhoneのTwitterのアプリと標準のメモのアプリで双方向に共有をしたい。でもスクリーンショットやっぱ最強だよね、現時点ではさ。


![image](https://user-images.githubusercontent.com/13635059/51147520-d7257880-189d-11e9-8704-4e50ae8e4415.png)

アプリケーション両思い？片思いの恋愛論。iPhoneのTwitterのアプリと標準のメモのアプリで双方向に共有をしたい。でもスクリーンショットやっぱ最強だよね、現時点ではさ。

みんなあんまり使っていないかもしれないけれど、実はTwitterからiPhoneのメモにツイートを共有できたり、逆に標準のノートのアプリからTwitterにテキスト遅れたりする。

だけど結局メモのアプリからTwitterに送ったときにはテキストが140文字を超えてしまったりして、画像も共有されないし、結局は全然使えなくて、スクリーンショットを撮って載せたりすることになる。

# 世の中でリンクじゃなくて、共有機能じゃなくてスクリーンショットがよく使われているのは、画像というのがどのようなアプリケーションであっても大体双方向にメッセージを送り合うことができるからだと思う。

エンジニアの中にはなぜアプリ共有の機能があるのにスクリーンショットを使うのかと首をかしげている人もいるかもしれないけれど、スクリーンショットは意外と今の時点では最強の仕組みだ。

だってアプリケーション同士の共有機能はちゃんと連携できるかできないかと言うそもそもの不安を感じながらユーザはそれを使わなければいけないわけだ。

使い方のわかりにくさもあるし、アプリケーションとアプリケーションの掛け算の数だけ使えるか使えないかを覚えておかなければいけないのも莫大なコストだ。

片方からの片方の共有が使えてももう片方が使えないと言うような、非対称性も存在したりする。

だから僕らはスクリーンショットでなんでもかんでも運用して、アプリケーションの共有機能をうまく使うことができていないのだ。うまい順路さえ見つけることができれば、それからは便利に使うことができるかもしれないけど、とにかく最初の学習コストというか、獣道に入っていくような道探しのコストがものすごく高い。

# アプリケーションとアプリケーションの間で相互に共有の道筋を通すと言う事は何かとても良い中間システムがなければ成り立たないのかもしれないな。いやいやそれこそiftttなどのシステムの話だな。

だけどそれも完璧ではなくて使えるアプリケーションが限られているし、APIの制限があったりするし、利用回数制限はあるし、リアルタイムでも反映してくれないし。

やっぱりiPhoneの内側だけでアプリケーションが行き来したいと言う欲望はあるんだよな。

1つのアプリケーションが完璧になっても、他のアプリケーションとの無限の組み合わせを考えてしまうと、とたんに問題が発生してくる。僕はと言えば最初に書いたように、TwitterとiPhoneのメモアプリでの道筋を鳴らして、自由に行き来したいだけなんだけどなぁ。なかなか現実的問題としては難しい話ではある。

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues



￼









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Twitterのフォロワー数が社会力学的にユーザーの発言を変える現象に心理学的な名前はあるか？



![image](https://user-images.githubusercontent.com/13635059/51147359-59616d00-189d-11e9-90ec-4e9a80fffb7a.png)

# Twitter

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ツイッターで<br>フォロワーさんとか増えると<br>みんな急に良いこと<br>言い始める現象<br>これ何か名前あるのかな？<br><br>みんな名言言い始めるじゃん？<br><br>おっきなウンコが出て<br>凄い虚無感に襲われてる<br>とかさ<br><br>そういうのが<br>ツイッターなんだと思ってたw</p>&mdash; Motcii (もっち〜) ＠ 離職率100%を目指す経営 by 現役エンジニア社長 &amp; 客員教授 (@ginza_no_motcii) <a href="https://twitter.com/ginza_no_motcii/status/1084927810240532481?ref_src=twsrc%5Etfw">January 14, 2019</a></blockquote>


# スタンダードブックストア現象

スタンダードブックストアと言うブックカフェがあって、ベストセラーはありませんと言うのがその店のキャッチコピーになっている。

だけど普通にベストセラーを置いている。一般的な本、大衆的な本も置いてある。

昔はそんなんじゃなかったのかもしれないけど。大阪梅田茶屋町エリアのスタンダードブックストア閉店してしまった。前は本棚がじっと並んでいたけど、途中からカフェのスペースが多くなって、なんだか僕から見るとつまらない空間になってしまった。

それが理由かどうかわからないけど、飲食店だから様々な事情はあるだろうけれど、尖ったものを提供できなくなって閉店してしまった可能性も少しはあるんじゃないかなと思っている。

#	笑う犬の生活現象

昔深夜番組で15分のお笑い番組があった。ウッチャンナンチャンの番組。

激しく面白くて僕の妹が大変気に入っていた。

だけどそれがゴールデンに進出すると、途端に丸いものになってしまって、全然面白くない、昔のほうが面白かったと妹は話していた。

これは本当の理由は、ゴールデンタイムになってネタが尽きてしまったんだと思うけれど、ゴールデンタイムになってネタの質が変わってしまって、尖ったものがなくなってしまって、つまらなくなってしまったと言う理由もなきにしもあらず。

なので、ゴールデンタイム現象と名付けるから。深夜番組現象と名付けるか。

#	ヴィレッジヴァンガード

ビレバンも、なんだか最近丸くなったと遠目にそんなイメージがしている。ここでも一般化や大衆化は進んでいるのかも。

#	なぜ人はちょっと有名になると変わってしまうのか

Twitterのフォロワーと言うごくミニマムな環境であっても

人は本当に社会的な生き物なので、人から見られていると思うと、どうしても無意識に発言を変えてしまうと思う。

これを防ぐには、ボーリングのボールの軌道を変えるイメージで、例えばTwitterで言えば、フォロワーが増えることに発言をとがらせて、ツイートを馬鹿らしくして、昔ながらのピュアでソリッドな自分に寄せて行かないと、どんどんストライクが取れなくなってしまうかもしれないぞ。

# それを考えるとボーリングの球意識しすぎ現象だとも言える気がする。


---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エンジニアの就職転職や人間関係には戦略的になれないけど、自己表現のためならなれるみたいだ。戦略性は人依存ではなく、モチベーション依存だな、

あなたはTwitterファースト？ブログファースト？トピックの大きさの予測不可能性を予想して戦略的になりたい。

エンジニアの就職転職や人間関係には戦略的になれないけど、自己表現のためならなれるみたいだ。戦略性は人依存ではなく、モチベーション依存だな、

![image](https://user-images.githubusercontent.com/13635059/51147000-0b983500-189c-11e9-942c-b9a36227b05d.png)


# Twitterに書くかブログに書くか。これは事前には予測不可能かもしれない。

トピックが広がることもあれば、広がるかと思いきや広がらないこともある。

最小ブログにするか最初Twitterにつるかめちゃくちゃ悩んでいる。これら両方に一長一短があって、どちらに決めてもどちらかの長所が失われてしまうし、どちらかに決めてもどちらかの欠点を享受してしまうし、なかなか決めづらい。

多くの場合はトピックが溢れてブログ位の大きさになるのだけれど、ブログ位の大きさのものを書こうとして、逆にTwitter位の大きさのものしか炊けないときは、ボツネタとゆうか、永遠に外の世界に出ないテキストになってしまいがちだ。

Twitterに投稿するにも、ブログに投稿するにも、なんだかとても微妙な長さのものになってしまうこともある。その場合はブログを選ぶけれど。もうちょっと文章量が欲しいのになぁと言う時もある。

なぜならブログを1つポストするのは結構コストがかかるので、中位のトピックに対してブログの記事をいっこ作ってしまうのはなんだかもったいないような気もする。

コストと言うのは、ちゃんと凝縮された発想のあるタイトルをつけることや、テキストをコピーして、画像も貼り付けたり、ちゃんとした形にするコストが割とじわじわと高い感じがする。

# Twitterのようにツイートしてはどんどん消えてしまって良いサービスとは全く性質が違うからな。

それで、ブログとTwitterの中間位のサービスもあるにはあるのだけど、それはサービスとして自分が気に入らないので、なかなか使うに至っていない。Tmblrを使うようになったら使うようになったら、また新しい遊び場が1つ増えてしまって、それはそれで管理にものすごく困りそうだしな。

なので、本当なら自分で今語りたいのはどれぐらいのトピックの大きさのものなのか、本能で察知できたら良いのだけれど、どうにも鈍感でいけない。

なので、予測不可能性を味方にするというか、トピックの大きさが事前にわからないことを踏まえて、それでも機敏に動けるようなアウトプットというか、クリエイティブ的な体制を整えるべきなのかもしれない。

# いつアイディアが溢れても構わないように、、そこで煩わされないように、ちゃんと受け皿をたくさん用意しておきたいもんだ。

今はiPhoneのメモアプリにどんどん喋りたいことを入力して言ってるけど、このようにちゃんと残る形で残してさえおけば、それがデッサンだろうと何だろうとも、後から編集したり扱うことができるのだから。

やっぱりしかるべき文章は、ちゃんと自分が探せる状態で管理しておくと言うことが1番大事かもしれない。今語りたいんだよと言う気持ちをリアルタイムでTwitterに反映させることはできないけれど。

とゆうか、メモのアプリに書き留める下書きも、メモの単位を開けずカテゴリ分けをせずにどんどんストリームでつぶやいていたほうがいいかもしれない気もしてきたら。これでまたこそっとオーバヘッドが1つ減らせるかもしれないけど。

# あー思いついたことをただ単に思い出せる形で書き留めたいだけなのに、本当にアプリケーションやデバイスの扱いと言うのは戦略的に、頭を使わなければなかなか難しいみたいだ。自分のやりたいことを実現するためにはね。

となると、戦略的になれるかどうかと言うのは、自分が本当にやりたいことかどうかに関わってくるのかもしれない。いや確かにそうだ。

就職や転職や人間関係には戦略的になれないけれど、自分がアウトプットする、自己表現すると言うことに関しては今僕は本当に本当に本当に戦略的になっているからだ。ずっと頭の中を戦略が駆け巡っている位だ。もともと苦手分野ではあるけれど。

こうやってまた、1つ自分のことを知るための手段、自己分析のツールを1つ手に入れた気もするぞ。自分が戦略的になっていると言う事は、大きな興味関心の分野があるということだ。


https://twitter.com/YumaInaura/status/1084947137178128384


---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
TypeScriptの型宣言の柔軟さに漏らしそうになる


# TypeScriptによるWindowフレームワーク開発 
　現在TypeScriptで、JavaScriptから簡単に使えるWindowフレームワークを作成している。その開発中に感じた、TypeScriptで漏らしそうになった機能を紹介したい。

##　複雑な条件の引数があっさりと記述できる

　Windowsの標準コントロールのようなListViewクラスを作成したときの話だ。ヘッダを追加するにあたり、ラベルとサイズを指定するaddHeaderというメソッドを作成した。引数は以下のように設定できるようにした。

　・単純にテキストを書けば、ヘッダが一つだけ追加される
　・配列で渡せば複数ヘッダが追加される。
　・引数の最後にヘッダ一つあたりの幅が指定できる
　・配列の中に配列を作ると個別の幅を指定することが出来き、指定方法は[ラベル,幅]となる。

　実際にコードで書くと以下のように使える

```.js
let listView = new JSW.ListView
listView.addHeader('あいうえお') //リストビューにヘッダを一つ追加
listView.addHeader('あいうえお',150) //幅を指定してヘッダを一つ追加
listView.addHeader(['あいうえお','かきくけこ'],200) //ヘッダを追加し、それぞれの幅を200に設定
listView.addHeader([['あいうえお',50],'かきくけこ','さしすせそ'],200) //'あいうえお'を幅50、'かきくけこ'と'さしすせそ'を幅200に

```

　普通に考えれば、恐ろしく複雑な条件である。しかしこれをTypeScriptで宣言すると、あっさりと出来てしまうのだ。

```.js
addHeader(labels: string | (string | [string, number])[], size?: number)
```

　以上となる。
　これできちんと型チェックが動作するのだ。TypeScriptを実際に使う前は、JavaScriptに静的型付けがちょっと追加された程度の言語だと認識していたが大間違いである。

##　キャストいらず、型推論がすごい

　さらにすごいのが型推論能力だ。

```.js
function Test(value:string|{a:number,b:string}){
	if(value instanceof String){
		console.log(value.a)	//文法チェックの時点でエラー
	}else if(value instanceof Object){
		console.log(value.a)	//こちらは文法エラーにならない
	}
}
```
　instanceofの結果に基づいてvalueの型を確定させている。つまり文法チェックの時点でif文の結果すら型推論に含まれているのだ。これならキャストは必要ない。静的型付けが半動的型付けになって自由度が高い上に、きっちり文法チェックが働く。これでは糞尿垂れ流しでも文句は言えないだろう。

##　文字列によるパラメータの型

　クラスにオーバーロードの定義を加えておく

```.js
addEventListener(type: 'itemClick', callback: (event: LISTVIEW_EVENT_ITEM_CLICK) => void): void
addEventListener(type: 'itemDblClick', callback: (event: LISTVIEW_EVENT_ITEM_CLICK) => void): void
addEventListener(type: 'itemDragStart', callback: (event: LISTVIEW_EVENT_DRAG_START) => void): void
addEventListener(type: string, callback: any, options?) {
	super.addEventListener(type, callback, options)
}
```

 以下のように文字列でイベントを指定すると、引数が確定する

```.js
let listView = new JSW.ListView
listView.addEventListener('itemClick',event=>{
   //eventの型が確定しているので入力補間が効く
})
```

# まとめ

　Qiitaのタグ・ランキングには常に圏外のTypeScriptではあるが、実はとんでもない実力を秘めている言語である。まだまだ成長過程であり、今後どれだけ便利になっていくのか、まったく底が見えない。
Pythonで参照しているSSL証明書リストのファイルパスを確認する方法

PythonでHTTPS通信する場合、requestsライブラリを利用することが多いですが、たまーに証明書リストが古かったり、独自の証明書を追加したい場合があります。

その際に、プログラム実行時にどの`*.pem`ファイルを参照しているのか確認する方法です。


```sh
> python -c "import requests;print(requests.certs.where())"
```

これで、``*.pem`ファイルのフルパスが確認できます。
pyenvやvenvなどで、都度、どのバージョンでどの仮想環境でとか調べるのが面倒な際に使えます。

requestsを利用しない場合、sslライブラリが参照しているパスは以下で確認できます。

```sh
> python -c "import ssl;print(ssl.get_default_verify_paths())"
```

## 参考

requests/certs.py at master · requests/requests
https://github.com/requests/requests/blob/master/requests/certs.py

ssl — TLS/SSL wrapper for socket objects — Python 3.7.2 documentation
https://docs.python.org/3/library/ssl.html#ssl.get_default_verify_paths

Python requestsライブラリは認証局の証明書をどう管理する? ｜ DevelopersIO
https://dev.classmethod.jp/server-side/python/how-to-manage-ca-root-certs-for-requets-library/

Python requests で SSLError が起きて毎回ググってるのでまとめた - Qiita
https://qiita.com/sta/items/6d08151fd9b20fa8b319
VSCodeのGit historyが動かなくなった時の対策方法

気がつくとGithistoryが「command 'git.viewHistory' not found」というエラーを出して動かなくなっていた。

## 解決策
```bash
cd ~/.vscode/extensions/donjayamanne.githistory-0.4.0/
npm install
```
このあとコメントで他にもコマンドを要求されたが
その要求された通りにnpmコマンド打ち込んでいけば治りました。

最後にVSCode再起動すると「拡張機能が更新されました再起動しますか」みたいなコメントが出てきて、また再起動すると復帰しました。

## 参考
ググるとすぐに答えは見つかった。
助けてくれたのは、ココです(｢･ω･)｢
https://github.com/DonJayamanne/gitHistoryVSCode/issues/238
ControlP5: ControlEvent handler is called when launching a program / ControlEvent ハンドラがプログラム実行時にも呼ばれてしまう場合

結構無駄に長考してしまったのでメモ

例えばボタンを設置するとき，以下のようにするが，その際に初期値の設定などをしようとしてsetValue()など，値が変化する系のメソッドやupdate()系を記述してしまうと，それぞれで一回筒ずつEventが生じてしまう．

```java:button.pde
import controlP5.*;

ControlP5 cp5;
Button button;
int i = 0;

void setup()
{
  size(400,300);
  cp5 = new ControlP5(this);
  button = cp5.addButton("test")
    .setLabel("Label")
    .setPosition(10,10)
    .setSize(40,30)
    .setColorBackground(color(50,50,50))
    .setValue(0)//<------- this invoke an event!!!!!!!
    ;
}

void draw()
{
  background(0);
}

void test()
{
  println("button was pressed (" + i++ + ")");
}
```

```output
button was pressed (0) //this println() is occured once at least even if the button was not pressed.
```
Flickrにアップロードしている写真を一旦全部ダウンロードする方法について

Flickrにアップロードしている写真たちをローカルにバックアップする必要性って、結構急に発生したりするもんですよね？
僕も突然そう言う事情になったので、2007年くらいから保存しまくっていた写真たちを一気にバックアップする必要が生じたと言うわけです。
何かをするときの方法が一つしかない状況と言うのは滅多にないので、恐らく僕の取った方法も、とても良いとは言えないと思うのだけれど、まあちょっとした労力と時間さえかければ十分に目的は満たせるかなあと思い、この記事を認める次第です。

これを使います。
https://github.com/beaufour/flickr-download

## 事前準備

pipでインストールします。簡単です。
```pip install flickr_download```

## 認証周り

ややこしいのがココ。

まず、FlickrでAPIを作成します。

[このページ](https://www.flickr.com/services/api/)のAPI Keysというリンクを飛べば、FlickrのAPIキーを発行するページへ移れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10565/b42ed30e-f6cc-32b1-1357-2d7a0339cc10.png)


書いてある内容は難しくないので、その通りに進めば、問題なく発行出来ると思います。

そこで発行されたAPIキーとシークレットキーを使用します。

```./flick_download.py  -k [APIキー] -s [シークレットキー] -t  -l [ユーザ名]```

このコマンドを実行すると、

```Enter the following url in a browser to authorize the application:
https://www.flickr.com/services/oauth/authorize?oauth_token=[URL]
Copy and paste the <oauth_verifier> value from XML here and press return:```

というようなメッセージが出てきますので、指定されたURLをブラウザで開きます。

すると認証画面が出てくるので、そこから辿るとXMLが表示されるので、<oauth_verifier>タグ内の文字列をコピーして、コンソールで再度入力します。これで認証が完了したので、~/.flickr_tokenが作成されます。

これで、アクセスの事前準備は完了です。


## ダウンロードコマンド

こうコマンド実行すると、ユーザ名のアルバムの一覧が取得出来ます。
```./flick_download.py -k [APIキー] -s [シークレットキー] -l [ユーザ名] -t```

アルバムのIDを使って以下のようなコマンドを打てば、アルバムの写真がオリジナル品質でダウンロード出来ます。
```./flick_download.py -k [APIキー] -s [シークレットキー] -t -d [アルバムID] -q Original```

上記さえわかれば、あとはアルバムのIDを入れ替えるだけなので、shellを作成して簡単に全アルバムのダウンロードが出来ます。
AnimateCCMeetUP(2/12 デジハリ大学・御茶ノ水駅1分)

https://connpass.com/event/114177/?fbclid=IwAR1ssrSXU5bz8gHOooiZnd95oM8viimk0IrBXOXwfwZ-hNrpoysepkg25ao

2019年2月12日18:30より、アドビ アニメートCCミートアップがデジハリ大学ソラシティアカデミア３Fにて行われます。
AnimateCCになってからHTML5書き出し機能が格段に向上し、昔のFlash制作の要領で「iPhoneブラウザで動く」HTML5アニメが作れるようになりました。
さらにActionScriptで記述していた部分がそっくりそのままjavascriptとCreateJSのメソッドに代わり、ゲームやインタラクティブの制作もFLASH感覚でできるようになりました。
当日私もHTML5アニメについてライトニングトークをさせていただきます。ソースファイルとか解説する予定です。
同時にAdobeプロダクトマネージャ Ajay Shukla氏も来られ、AdobeAnimateCC2019について紹介されるとのことです。いろいろ機能とか直訴するチャンスなのでは？

お暇がありそうでしたら、ご予約いただけましたら幸いです。

![1-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/260875/49e36e56-a7a1-7f69-56f9-095f5c2f9c2a.jpeg)
pandasについて

(概要)
pandasは、Rのデータフレームのようなものを
python上で、動かすライブラリ。

(詳細)
Rの場合、さらに進化しているので
それに比べると、pandasは
少し洗練されていない感がある。

例えば、下記等。
(1)dplyrライブラリの様には、メソッドチェーンを実行できないこと。
(2)関数型言語で言う所の、flatmapが無く、追加要望のプルリクエストは否決されている。
　　(なんとなく、この部分は作成者の後進性にも見える。)

しかしながら、pythonの前処理では
現状デファクトスタンダードであるので
無視することはできない。

より良いライブラリが登場するまでは
工夫して使用していくしかない。

また、pythonでは、daskという並列処理に得化した
データフレームのライブラリがある。
使用できるapiが少なくなるので
そのままポーティングできる訳ではないが
チューニング時の逃げ道にはなる。

以下、工夫した点について書いていく。



(工夫点)
(1)欠損値について
　数値で、欠損値が出た場合に、「nampy.nan」が当てられてしまう欠点がある。
　「日にち」や「実行回数」など、浮動小数点数では本質的に表せない数値があり
　後続の処理によっては、「nampy.nan」は不都合である。
　まずいことに、「nampy.nan」が当てられると、その列の他の有効値が整数でも
　すべて、floatに変換されてしまう。
　(例えば、「5」→「5.0」となるが、これが後続処理で、繰り返し5回の意味だとすると、ループ構文でエラーとなる。)
　
　この欠損値が発生するパターンは、２通りある。
　・入力レコードリストに、元々欠損値がある場合。
　・margeで外部結合した場合に、マスターに結合キーに当たるレコードが存在しない場合。

　欠損値は、デフォルト値で埋める等するが
　この場合の回避策として考えられることを以下に上げる
 
　　(a)pythonの言語機能で処理する
　　　速度を落とさないように、pythonの内包表記などを使用して
　　　前処理の前処理を作成する。

　　　その場合に辞書を使用すると、外部結合相当の処理の
　　　1レコード分の結合の計算量はO(1)となる。
　　　つまり、ハッシュ計算だけで直接アドレスから値取得可能となる。
　　　逐次処理となるが、daskを使用した場合と遜色ない速度がでると予想される。
　　　(実験で確かめるべきだが、次の課題とする。)

　　(b)作業用の列を作成し、あくまでもpandasで処理する。
　　　(あ)すべてのキーを作成して、それから作業用データフレームを作る
　　　(い)作業用データフレームで、デフォルト値を対象列にセットする
　　　(う)作業用データフレームを駆動表として、入力値のデータフレームを結合する
　　　(え)入力値のデータフレームの値がある列値のみ、対象列にコピーする


　上記(b)の方法は、少し難しい点がある。
　上記(b)の方法は、少し煩雑であることがネックである。

　人によっては、「floatに変換されてしまう」問題自体に対し
　腹落ちするまでの理解が、中々得られないこともある。
　(データサイエンスを志向する人たちの、集団で問題提起しても
　大部分の人は、何が問題なの ?　というふうである。
　まあ、本処理が統計処理ならば問題にならないので
　そう思ってしまうのも無理はないですが。)

　あまりレベルが高くない人の場合
　実装者中途半端な理解で実装してしまい
　(b)の実装法は面倒くさい、あるいは汚い実装に思えてしまい。
　注意指摘したとしても、ノーガードで
　margeをしてしまう実装に改悪してしまいう
　誘惑があるようです。
　(人は、分からないものは、見えないものと考え
　見えないものは、存在しないものと考え
　結果無視することが多々あります。)

　ノーガードの実装は、後続処理が
　整数を求めているならばバグ実装なので
　間違いであるが、事は簡単ではない。
　他人の視野の狭さを矯正するのは
　中々難しいので、自分を変えるしか
　方法はないと思われます。

　(結論)
　上記理由で、(a)の前処理中の前処理を実装するのが得策と見える。

　(おわり)


　(実装例を挟みながら、レポートを書いたほうが良いが
　今回　~~は~~も、時間がないので省略する。追記するかもしれない。)



　ところで、黒川先生訳本が出版される予定。
　https://www.amazon.co.jp/dp/425412242X

　黒川先生だから、よさげに見える。

 
　下記のような本も出るみたい。
　原題が「Pandas for Everyone」だから
　直訳すると、「みんなのPandas」になるけど
　https://www.amazon.co.jp/Pythonデータ分析／機械学習のための基本コーディング！-pandasライブラリ活用入門-impress-top-gear/dp/4295005657/ref=sr_1_5?s=books&ie=UTF8&qid=1546782535&sr=1-5&keywords=pandas
Ruby 変数の種類

Rubyの変数の種類についてのメモ。

### ローカル変数
宣言した場所でしか使用出来ず、他のメソッドでは使用出来ない。

### インスタンス変数
同じインスタンスであれば、他のメソッドで使用出来る
他のインスタンスでは、違う値を保持する事が出来る。

### クラス変数変数
そのクラスの全てのインスタンスで共有する変数。

### グローバル変数
至るところで共有出来る。
YouTubeのVR動画をequirectangular形式でダウンロードする方法

#動機
YouTube上に載っかってる360°動画をダウンロードして、VR音響のMix練習の素材にしようとする際、めちゃくちゃ手こずったのでメモ。

#1
YouTubeの動画を[適当なダウンロードサイト](https://www.onlinevideoconverter.com/ja/youtube-converter)とかでダウンロードすると、こんなふうになってしまう。
![スクリーンショット 2019-01-15 02.21.08.png](https://qiita-image-store.s3.amazonaws.com/0/310266/0fea2bb4-2fb7-e051-421d-5b7332846c1d.png)


このような360°動画の形式はcubemap形式と呼ばれるもので[^1] 、この形式だと一般的な360°動画monitor(AudioEase 360 pan suiteやaudio360 spacializerなど)では正確に表示ができない。それらのmonitorは、基本equirectangularしか対応してないらしいからだ。(マニュアルにはちゃんと明示されてなかった。)
超困った。

#2
そこでいろいろ検索したところ、この[スレッド](https://github.com/rg3/youtube-dl/issues/15267)で話題になっていたのを知った。
そこでは、コマンドライン上で使う[youtube-dl](https://rg3.github.io/youtube-dl/index.html)というものをうまく使えばなんかいけるよ、みたいなことだった。

なので、youtube-dlをhomebrewでダウンロードした後、スレッドの真ん中ぐらいに書いてあるコメントを参考にダウンロード。
そしたらちゃんとequirectangularでダウンロードできました。
![スクリーンショット 2019-01-15 02.21.28.png](https://qiita-image-store.s3.amazonaws.com/0/310266/16d1e4d6-1662-8e27-583e-71c25244ad3f.png)



#最後に
これでやっと学校の課題を完成させられそうです。良かった。
このことについて書かれていたスレッドは気が向いたら抄訳でも作ろうかな。

[^1]: 正確には[The Equi-Angular Cubemap (EAC)](https://blog.google/products/google-ar-vr/bringing-pixels-front-and-center-vr-video/)というgoogle独自の形式である。
GKEでクラスタ作るときのメモ

f1-microインスタンスは3個以上でないとGKEクラスタが作れないが、
一度クラスタを作成してからインスタンスグループをスケーリングすることで一個でのクラスタに変更できる。([参考](https://snyke.net/post/kubernetes-playground/))
f1-microはメモリが0.6GBしかないので、自動でデプロイされるコンテナできちきちな状況。
ログのコンテナとか色々無効にすれば空きはでるものの ([参考](https://qiita.com/apstndb/items/1c3f8ea026ed6b27e357))、いろんなコンテナデプロイして試すにはやっぱりメモリがある程度欲しいよねってことでn1-standard-1を使うことにした。
n1-standard-1だとノードの数が1個でもクラスタは起動できるみたい。

1. クラスタを作成

    ```bash
    $ gcloud container clusters create hitochan-cluster \
      --machine-type=n1-standard-1 \
      --num-nodes=1 \
      --disk-size=10 \
      --no-enable-cloud-logging \
      --enable-autorepair \
      --preemptible
    ```

2. インスタンスグループの一覧を表示して名前をメモしておく。

    ```bash
    $ gcloud compute instance-groups managed list                                                                                                                            
    NAME                                            LOCATION       SCOPE  BASE_INSTANCE_NAME                          SIZE  TARGET_SIZE  INSTANCE_TEMPLATE                           AUTOSCALED
    gke-hitochan-cluster-default-pool-6618700a-grp  us-central1-a  zone   gke-hitochan-cluster-default-pool-6618700a  1     1            gke-hitochan-cluster-default-pool-6618700a  no
    ```

3. 2でメモしたインスタンスグループ名を指定して、インスタンス数を変更する。節約したいので使わないときは0にしておく。

   ```bash
   $ gcloud compute instance-groups managed resize gke-hitochan-cluster-default-pool-6618700a-grp --size=0
   ```
Heroku上のPHPからPDOでMySQL(ClearDB)に接続する

# MySQLiではなくPDOを使う場合

[Heroku Dev Center](https://devcenter.heroku.com/articles/cleardb#using-cleardb-with-php)では、PHPでMySQLを使う場合の例として、MySQLiで接続するサンプルコードが記載されています。

```php
<?php
$url = parse_url(getenv("CLEARDB_DATABASE_URL"));

$server = $url["host"];
$username = $url["user"];
$password = $url["pass"];
$db = substr($url["path"], 1);

$conn = new mysqli($server, $username, $password, $db);
?>
```

これに対し、MySQLiではなくPDOを使う場合のサンプルコードを以下に記載します。

```php
<?php
$url = parse_url(getenv("CLEARDB_DATABASE_URL"));

$server = $url["host"];
$username = $url["user"];
$password = $url["pass"];
$db = substr($url["path"], 1);

$pdo = new PDO(
  'mysql:host=' . $server . ';dbname=' . $db . ';charset=utf8mb4',
  $username,
  $password,
  [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
  ]
?>
```
# 【おまけ】ローカルの開発環境とHeroku環境で接続先のDBを切り分ける

ローカルの開発環境でのみ、下記のPHPファイルと同じディレクトリに`isDevelopment.txt`（中身は空で良いです）を配置することで、

- Heroku環境ではHeroku上のMySQLに
- 開発環境では開発環境のMySQLに

接続するようにしています。

```php:
function new_pdo(){

  $filename = './isDevelopment.txt';

  if (!file_exists($filename)){

    //For Heroku
    $url = parse_url(getenv('CLEARDB_DATABASE_URL'));

    $server = $url["host"];
    $username = $url["user"];
    $password = $url["pass"];
    $db = substr($url["path"], 1);

    $pdo = new PDO(
      'mysql:host=' . $server . ';dbname=' . $db . ';charset=utf8mb4',
      $username,
      $password,
      [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
      ]
    );
    return $pdo;

  }else{

    //For development
    $pdo = new PDO(
      'mysql:localhost;dbname=testdb;charset=utf8mb4',
      'root',
      'root',
      [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
      ]
    );
    return $pdo;

  }
}
```

なお、`.gitignore`には`/isDevelopment.txt`と記述して、`isDevelopment.txt`がHerokuにデプロイされないようにしておきます。

#参考

- [PHPでデータベースに接続するときのまとめ](https://qiita.com/mpyw/items/b00b72c5c95aac573b71)
How to build Linux client

# hibernation
https://fitzcarraldoblog.wordpress.com/2018/07/14/configuring-lubuntu-18-04-to-enable-hibernation-using-a-swap-file/

https://sicklylife.jp/ubuntu/1804/help/power-hibernate.html

```shell
root> swapoff /swapfile
root> fallocate -l XGB /swapfile
root> chmod 600 /swapfile
root> mkswap /swapfile
root> swapon /swapfile

# get / drive UUID
# get swapfile offset

root> vim /etc/default/grub
# add resume=, resume_offset

root> update-grub

root> vim /etc/initramfs-tools/conf.d/resume
root> update-initramfs -u -k all

```

# vpn client

https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients.md#linux

> Ubuntu 18.04 (and newer) users can install the network-manager-l2tp-gnome package, then configure the IPsec/L2TP VPN client using the GUI. Ubuntu 16.04 and 14.04 users may need to add the nm-l2tp 

`apt install network-manager-l2tp-gnome`

# Docker

## uid mapping 
https://qiita.com/vmi/items/8f76cb695d499806d35f
http://transparent-to-radiation.blogspot.com/2018/06/ubuntu-1804dockeruser-remap.html

I want to remap os:imaoka = uid=1000 to docker(container):root

```text:/etc/subuid
dockremap:1000:65536
```

same /etc/subguid


```json:/etc/docker/daemon.json
{
  "userns-remap": "default"
}
```

restart docker with `systemd`

# ClipBoard
https://hluk.github.io/CopyQ/

Set hot-key by `lxhotkey-gtk.desktop`. We can use GUI tool too, It's named `setup hot keys` in the GUI menu.

# Mozc
Is google Japanese input.
`sudo apt install emacs-mozc`
Plus, install `mozc module via package-installer @ emacs`

# Manage ScreenShots
https://itsfoss.com/take-screenshot-linux/
## flameshot
`apt install flameshot`

but ubuntu18.04 default package = 0.5x, it's cannot add TEXT.
Download from github and dpkg -i install.

https://github.com/lupoDharkael/flameshot/releases
## shutter
Focusing on # of features, the shutter is the best tool of all. However, it has not been maintained for a long time.  
Fix disable edit.

https://itsfoss.com/shutter-edit-button-disabled/

# ModKey
Settings for me

```
keycode 100 = Control_R
keycode 101 = Alt_L
keycode 102 = Control_L

add control = Control_L
add control = Control_R
add mod1 = Alt_L
```
Mac でmatplotlibの描画がうまくいかないときの対処法

# 問題
matplotlibでグラフを描画するときに想定通りにグラフが描画されなかった。
そのときに用いたコードは下記である。

```python:test.py
import matplotlib.pyplot as plt

x = [1, 2, 3]
y = [2, 3, 4]
plt.plot(x,y)
plt.show()
```

このように書けば、直線のグラフが描画されるはずであるがそうはならなかった。
ウィンドウが生成されるだけで、なにも描画されなかった。環境は以下の通りである。
## 環境
OS: macOS
Version: Mojave

#解消法
matplotlibではグラフを描画するときのbackendとして、PyQt5, GTK4などが使える(https://matplotlib.org/tutorials/introductory/usage.html )。
今回はPyQt5をbackendとして使うことにする。
まず、はじめにPyQt5をpipをつかってインストールする。

```
pip install PyQt5
```

matplotlibの設定ファイル~/.matplotlibrcを作成し、下記のように書く。

```~/.matplotlibrc
backend: Qt5Agg
```

上記の手続きを踏めば、グラフが描画できるようになる。めでたしめでたし。
# 参考にしたサイト
- https://note.nkmk.me/python-matplotlib-matplotlibrc-stylesheet/
- http://keisanbutsuriya.hateblo.jp/entry/2015/07/11/031500
CSS：横幅めいいっぱいの背景画像をbodyに指定する

詳しいことはわからないけれど難しいことしなくてもこれで動いてる．

```css:
body {
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100%;
    background-color: #FFFFFF;
    background-image: url(画像のパス);
    background-repeat: no-repeat;
    background-size: 100% auto;
}
```