OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでValgrindを使う

# はじめに
メモリリークの検知によく使われるツールとして、Valgrindがある。しかし、Valgrindを使おうとしても、Python 3.5以前では、コンパイルからやり直す必要があった。しかし、[Python 3.6以降では、環境変数`PYTHONMALLOC`でメモリアロケータを変更できるようになった。](https://github.com/python/cpython/commit/34be807ca4dfecc5b0a9e577a48535e738dce32b)このため、簡単にメモリリークの調査が出来るようになった。

```
PYTHONMALLOC=debug ./python membug.py
```
なお、Valgrindの仕組みは、[ダイナミックリンカーの環境変数であるLD_PRELOADをつかって、関数置き換えにより振る舞いを監視する](http://valgrind.org/docs/manual/mc-tech-docs.html#mc-tech-docs.overview)。このため、共有ライブラリの関数の監視なら使うことが出来る。

#参考資料
##Pydevenv
- [Python Debug Tools](https://pythondev.readthedocs.io/debug_tools.html)

##Valgrind
- [The Design and Implementation of Valgrind](http://valgrind.org/docs/manual/mc-tech-docs.html)

##Python関連
- [cpython/Misc/README.valgrind](https://github.com/python/cpython/blob/v3.8.0/Misc/README.valgrind)
   - [Add PYTHONMALLOC env var and add support for malloc debug hooks in release mode](https://bugs.python.org/issue26516)
      - [Add PYTHONMALLOC env var](https://github.com/python/cpython/commit/34be807ca4dfecc5b0a9e577a48535e738dce32b)

##Linux Tools
- [LD.SO(8)  ](http://man7.org/linux/man-pages/man8/ld.so.8.html)
dumpデータから不要な内容を削除する

# 背景
運営サービスを開発環境にリストアする際に、特定のテーブルデータは不要であり、dumpファイルを直接編集して不要箇所を削除することにしました。
だいたいdumpデータ自体は10GB程度で、流石にエディタで開くのは厳しい量です。

# 削除行数の特定
先述したように通常のエディタで開くのは厳しいので、
直接ファイル内を検索し、不要箇所の行数を特定するアプローチでトライしました。

```
egrep -n '^DROP TABLE IF EXISTS `target_table_name`' dump.sql

...待つことしばらく...

12944:DROP TABLE IF EX...

```

みたいな感じで行数が特定できました。
そこでいったん扱いやすいファイルに変換します。

```
sed -n '１２９４４,14000p' dump.sql > temp.sql
```
そのまま target_table_name に関連する内容だけ削除したいので、次のテーブル情報がどこに出てくるか検索します。

```
egrep -n '^DROP TABLE IF EXISTS' dump.sql

......待つこと多少の時間......

1:DROP TABLE IF EXISTS `target_table_name`;
53:DROP TABLE IF EXISTS `next_table_name`;
121:DROP TABLE IF EXISTS `2next_table_name`;
```

みたいに行数がわかるので今回で言えば、
12944行目から
12996(＝12944+53-1)行目分を
削除すれば良いとわかりました。

# 特定行が削除されたdumpファイル生成

ここまで行ったらあとは削除すればOK
ただ削除時によく使うsedはそのコマンドだけだと、延々と標準出力にdumpファイルが書き出されることになるので、ファイル生成にしてあげましょう

```
sed -e '12944,12996d' dump.sql > deleted_dump.sql
```

以上で、完了です。お疲れ様でした。

# 参考
http://bashalog.c-brains.jp/15/04/21-191248.php
[GAS] ImportRange関数を使用する時、取得元のシートへのアクセスを強制的に許可させる

新しいファイルオブジェクトに対して設定を記述する

```js
const newFile = template.makeCopy("ファイル名", outputFolderObj)
newFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW)
```
新規で特定のフォルダ内にシートを生成する

```js

/* 新規で特定のフォルダ内にシートを生成する */
function createSpreadsheet(folderId, name) {
  var file = Drive.Files.insert({
    'title': name,
    'mimeType': 'application/vnd.google-apps.spreadsheet',
    'parents': [{'id': folderId}]
  })
  return file.getId()
}
「Checking for packages with mismatched checksums」で、なんか文句言われるん気になる貴方へ

daily security run output で毎日送られてくる監査資料 periodic(8) で、特段自分自身が編集しよって改算した訳でもないのに、以下のような文句言われる事がある。

```txt:例
Checking for packages with mismatched checksums:
py37-pycparser-2.19: /usr/local/lib/python3.7/site-packages/pycparser/__pycache__/c_ast.cpython-37.pyc
```

インスコした直後の次のタイミングで言われると、ドキドキしよるけ困るけん、アドホック的解決方法を書いておく。

#先ずは確認から。

```txt:例
# pkg check -sa
py37-pycparser-2.19: checksum mismatch for /usr/local/lib/python3.7/site-packages/pycparser/__pycache__/c_ast.cpython-37.pyc
```

該当するパッケージと、改ざんされよったファイルがリスト化され出力される。

#チェックサムの再計算しよって db に再登録させる。

```txt
# pkg check -r
Checking all packages: 100%
```

#反映されたのか確認。

```txt
# pkg check -sa
```
なぁ～んも出んかったら以降、監査資料には出て来んようになる。
laravel repositoryパターン 他のrepositoryを使いたいとき

```php
class AAController extends BaseController
{

    protected $externalImageRepository;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct(
        Request $request,
        ComicTrialRepositoryInterface $comicTrialRepository,
        ExternalImageRepositoryInterface $externalImageRepository,
  ここ->  StaffRepositoryInterface $staffRepositoryInterface
    ) {
        parent::__construct($request);

        $this->repository = $comicTrialRepository;
        $this->externalImageRepository = $externalImageRepository;
 ここ->  $this->staffRepository = $staffRepositoryInterface;
    }
.
.
.
.
.

```



```php
public function index(Request $request <--いらない)
    {
        // $requestParams = $request->all(); //取得データ用のパラメータ
  ここ-> $requestParams = $this->request->all(); //取得データ用のパラメータ

        unset($requestParams['page']);
        $params = $requestParams; // viewに受け渡す用のパラメータ

        if (isset($requestParams['assigned_user_id']) && $requestParams['assigned_user_id'] == 'all') {
            unset($requestParams['assigned_user_id']);
        }

        if (isset($requestParams['q']) && $requestParams['q'] == null) {
            unset($requestParams['q']);
        }

//        $staffList = $this->repository->staffList()->pluck('name', 'id')->toArray();
ここ->     $staffList = $this->staffRepository->getStaffList()->where('group', 'comic')->pluck('name', 'id')->toArray();
//        dd($staffList);

        $comicTrialPager = $this->repository->getPager($requestParams);

        return view('comic_trial.index', compact('comicTrialPager', 'params', 'staffList'));
    }
```

・__construct() で Requestのセットしているので、ここで引数にしなくていい
・$this->repository->staffList()
comic_trial の関連テーブル以外の取得をComicTrialRepositoryを使わない。
StaffRepositoryを使う。
Firebaseには3万円強のクレジットをゲットできる裏ワザがあった

#概要

Googleが提供するFirebaseは、モバイル用のmBaaSであったり、Webの静的コンテンツのホスティングにおいて非常に魅力のある製品です。
更にスモールビジネスであれば、過剰とも思える無料枠の大きさで、0円での運用が可能です。
しかし、サービスの成長や、CloudFunctionsから外部へリクエストを投げたいときに従量課金制への移行を検討することになります。

今回はそんな場面に遭遇した際に、実はお試し用のクレジットをゲットする方法があるお話です:relaxed:


#読者対象

- 一度もFirebaseのBlaze プラン（従量制）に移行していないFirebaseユーザー
- まだGCP(Google Cloud Platform)を利用していないFirebaseユーザー

残念ながら？上記に当てはまらないユーザーの方はクレジットをゲットできません。
後者に該当しない方は既に獲得しているはずで、前者に該当しない方は権利放棄した状態の可能性があります。
こちらについては、次の記事を見るともしかしたら救済されるかもしれません。
サポートに問い合わせを行い、クレジットを付与されるまでの過程を記事にしています。
わたしも救済された一人なのです:sweat_smile:
https://qiita.com/qrusadorz/items/c5d2a850c4e630cdc523

#What should I do?

##裏ワザのからくり
ゲットする前に、からくりを知る必要があります。
既にヒントは出ていますが、裏ワザのポイントはGCP(Google Cloud Platform)です。
GCPはクラウド戦争の最中で、シェア拡大のために実施されている大盤振る舞いなプログラムを活用します。
具体的には、GCPの12 か月間 $300 分の無料トライアルです。
https://cloud.google.com/free/docs/gcp-free-tier?hl=ja#free-trial

一見Firebaseとは無関係に思えます。
私も実際請求されるまでは、このクレジットはFirebaseで使用できるのか確信がありませんでした。
質問するにもサービス間の話であるため、どちらに質問すればいいのかわからず質問できませんでした。
しかし、Firebasaeでの課金が発生し、請求が来たことで確定しました。

![Firebaseの請求.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/9f79aed8-8acc-6085-4737-6d115150f379.png)

まず、FirebaseをBlazeプランに移行するとGCPでクレジットカードの登録を行うので、請求書の類はGCPの方で確認することになります。（GoogleがFirebaseを買収したという話を知らないとややこしい）
見ていただきたいのは請求項目の一つ目で、Firebase Hostingの外部送信データに対して課金が発生している点です。
そして、項目の上下に残高がありますが、開始残高から最終残高の差額にFirebase Hosting分が含まれていることは計算すればわかると思ます。
私は既に無料クレジットをゲットしているため、その無料クレジットから引かれて、クレジットカードからは引き落としされていません。

##How to get

やるべきことは一つ。Blazeプラン移行前にGCPの無料トライアル登録を行うこと。
**Firebaseの有料プラン変更はGCPの無料トライアルへの権利放棄となるため、絶対にFirebaseのプランを先に変更してはならない。**

いずれかのGCPのページに飛べば恐らくAppBarの直下に、無料トライアル登録しませんか？のお知らせが表示されいるはずです。（私は課金移行してもう見れないのではず締め）
FirebaseのFunctions、Storage、Firestoreの使用状況のグラフの下にView quotaのリンクがあるので、それで遷移すればGCPに飛びます。
またはFirebaseにログインした状態で、別タブで次のURLにアクセスすればOKのはずです。
https://console.cloud.google.com/home/dashboard

無料トライアルの登録シーケンスのスクショ
https://qiita.com/qrusadorz/items/c5d2a850c4e630cdc523#gcp%E3%81%AE%E7%84%A1%E6%96%99%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB%E7%99%BB%E9%8C%B2%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9


#まとめ

この記事を見てがっかりした方、ハッピーになった方、すでに知っていた方それぞれかと思います。
救済過程の記事へもリンク張っておいたので、一人でも多くの人がハッピーになれたらなと思います。
ちなみに無料クレジットは12か月間の有効期限があるため、有効に活用しましょう。（お前全然使ってないやんの突っ込みはなしで:joy:）

Have a gread day!
印刷時、リンクにつく下線を消す方法を教えてください。

#印刷時、リンクにつく下線を消す方法を教えてください。

お世話になります。
コーディングやプログラミングですらないのかも知れませんが、ご教授いただきたいです。

現在Webページをコーディングしており、下記の件で困っています。

Webページをプリンターで印刷する際に、リンク部分に下線が出てしまいます。
この下線をとりたいのですが、何か方法はございますでしょうか？
※通常の画面表示の時には下線は出ていません。CSSで消しています。

##試したこと
プリント用CSSを設定してみましたが、効果はありませんでした。


```
<link rel="stylesheet" type="text/css" media="print" href="../css/print.css">

a *{ 
border-bottom: none!important;
}
```


Googleにて検索しましたが、WordやExcel等のハイパーリンクに関するページばかりで、解決に役立つ情報は見つけられませんでした。
お忙しいところ申し訳ないですが、よろしくお願いします。
mlflow uiでlocalhostがひらけない

皆さんは実験管理ツールに何を使っていますか？

ちなみに、私は[Comet.ml](https://www.comet.ml/)を使っています。
理由は、使うのが楽だしパブリックで公開されてもあまり困らないからです。

しかし、開発コードはプライベートにしたいことの方が多いのも事実です。
Comet.mlにもプライベートを使えるようにするプランがありますが、なにせ高いのでできることなら他の安いツールを使いたいと思っていました。（昔のGitHubみたいですね）

今回は、mlflowを使って実験管理を試した時に、UIが表示されなかったので対応した話です。

# 何が起こったか

比較検討のため、[MLflowのチュートリアル](https://mlflow.org/docs/latest/tutorial.html)をやっていたところ

```python 
mlflow ui
```

で、ウェブサーバーを立ち上げて、localhost:5000にアクセスするところで詰まりました。
404エラーがでており、ページがないよと言っています。

# どう対応したか

以下のように対応しました。どうやらmlflowをインストールしただけではjsのモジュールが足りないようでした。
npmで必要なモジュールをインストールし、npmのサーバーを立ち上げるだけです。

あるタブで

```python 
cd mlflow/server/js 
npm install 
npm start 
````

別タブで

```python
mlflow ui 
```

そうすると、localhost:3000にMLflowのUIが表示されるようになります。

# 疑問点

* チュートリアルはどうやったら再現できるんだろう
* git cloneしたり、site packagesなどからnpm installするのは流石にないだろうから別の方法があるんじゃないか（mlflowを開発する分には上の方法で十分かもしれないけど）

# 参考

* https://github.com/mlflow/mlflow/blob/master/CONTRIBUTING.rst#launching-the-development-ui
* https://github.com/mlflow/mlflow/issues/1274
2019年11月12日のイベントまとめと東京の外国人のスタートアップ島の思い

**東京スタートアップピッチナイトとは、起業者の大チャンスです。**
数分のプレゼンテーションで自分の起業を発表して、投資家と開発者が
ワクワクさせる、ものすごくハイテンションなイベントです。
本物の「マネーの虎」や「シャークタンク」みたいですね！

![IMG_20191112_221017.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393501/d59f9ff2-daa4-64f7-207f-90d88513e5b3.jpeg)
*2019年11月12日外国人のだらけスタートアップイベントに行きました！！*

## ザ・ピッチ

解除住友グランドタワーの41階のYappliの社内でした。今度の相変わらず素晴らしかった。
広くて綺麗でした。ものすごく高いところでした、東京がの全体が見られました。
東京タワーもすぐ隣だって、女みたいに素敵だわーと言いたかった気分でした。

到着後、イベントはすぐに開始でした。YappliのCFOさんが挨拶して、アプリのついて
について話しました。もしかしてCFOさんは風邪気味だったかもしれませんが、
話はつらかった。五年とか苦労して、やっと成長できまして。住友グランドタワーの41階のオフィスに入りました。
それでも、まだ落ち着けないな顔がしました。観客者も「何が一番大変でしたか？」、「なんで五年で苦労しましたか？」
などの質問をしまして、結局サンフランシスコのスタートアップの経験するMCさんも
「スタートアップの為彼女に分かれました」と言っちゃって、イベントは微妙なノートで始めました。

まあ、スタートアップの世界は輝くに見えてるんですけど、
やはり「HARD THINGS」のいうとおり、ハッスルは終わらないだよね。

次はピッチでした。この時で私が周りをみて、自分を確認して、やはりちょっとデジャヴでした。
前のレザーカウチに座っているビジネスマンがにコーヒーを強欲で飲んで、
ピッチしている起業者も焦って、石の像みたいに立て、固い言葉でビジネスプランを発表しました。

最初のピッチは日本のファッションブランドのウェブショップでした。
ユニークの価値の提供はインフルエンサーにファッショングッズを送って、インフルエンサーさんはグッズを着て投稿したら、
インフルエンサーに自社のクリプトコインで払います。儲けたコインで同じショップでもっとグッズを買えます。

（　＾ω＾）・・・ノーコメント

次の方は数回前のイベントでピッチした方の再登場でした。
ツイッター漫画を管理、自動投稿するアプリでした。
「これはストーリーのMVPだよ！」のコンセプトでした。
ちょっとかわいいキャラクターはものすごく
素晴らしい冒険でやって、ツイッターの観客者は「頑張れー」などを書けます。
エンゲージメントはマネタイズだからね。
新しいキャラや設定をまずツイッターで投稿して、ヒットになったら、すぐに商品化に進めて、
大ヒットならアマゾンプライムやネットフリックスでシリーズ化です。

次のは英会話の未来（なんか英語発音を練習するアプリ）と
バイオテック用のアナリシス結果を管理するアプリでした。このTupac.Bioのアプリは
確かにちょっと喜びました。大学生の生物学専門プログラムはもうWindows98の時代の
古臭かったので、このWeb3.0のスライディングアニメーション、グレーとオレンジ色のかっこよさタブなどなどをみて
「ああ、あの時これがあったらよかったなー」と思いました。

これで四つのメインプレゼンテーションが終わりましたが、
今度は初めてに一分のエレベータピッチのフォーマットもありました。
エレベータピッチは大体前の話と同じですけど、プレゼンテーションは一分しかないです。
もうネットワーキングパーティーが始まりましたので、聞きづらかったが、起業者さんはそれでも頑張ってよかった。

## ザ・痛み

パーティはすぐに飽きて、私は窓から外に見ました。ロボットのみたいなピッチ、マウンティング、
どうしても「俺つえー」とか固いマスクを被って、負け犬と勝ち犬に分けるだね。
勝ち犬になっても、価値はどこだ？

そう、私は中二病のみたいな考えがやめられないよ。

窓から外に見て、私はあの部屋の中一番大きな芋かもしれませんでした。
エストニアでこんなに高いところに行って、首都はすぐ終わるよ。
でも東京は違う：どの辺みても、鉄筋コンクリートの輝く海は永遠に伸びていました。
都会が終わる線の上は真っ暗空でした。雲なく、星も月もなかったバグったスカイボックスでした。
そのとき、私の胸に痛みがありました。

私たち、星はもう見られないか？

インフルエンサーにシットコインに払ってるイーショップ・・・マジで要るの？
もしかしてまた自分の落ち込んでいる期間ですが、相手は何かが問題がありますよね。
相手が「素晴らしいいアイデア」があっても、相手は自作サボタージュします。
「これでお金が儲けない、投資家が興味がない・・」などなど。ああ、「ふざけるな、自信を出せ」と言いたいな。
自作サボタージュ・・なんでこんなひどい物をやっているでしょうか・・・

![sky.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393501/42442909-906b-ec13-75c3-9dbed3be5285.jpeg)

##東京のに、日本人はどこだろう？

この記事はもっと気楽に終わりたいとおもいます！

今度は成功した大きなイベントでしたね。外国人は9割でしたが、日本人は全くなかった！
まさか言語の壁だよね。この島国の中、外国人は自分の島に閉じ込められています。
日本人起業者と外国人起業者は何をやっているのは、全く分からないね。
左手は右手のやることが分からないから、協力もできない。
このシマの問題を解決ができたら、中国のビジネスに負けない起業が作れるはずです！

この問題の解決をするため、三つのものをしないといけません：
1. 外国人だらけのイベントだけではなく、この作家は日本人が参加しているイベントに行ったほうがいいかもしれません！
2. 外国起業界と日本起業会に橋を作る
→　外国人は日本語をへたくそに話す勇気を出して、日本人も勉強した英語をへたくそ話せる勇気をだします。
3. 外国人はMeetUpというアプリでイベントを作ったり発表したりしますが、日本人のユーザーはこのアプリをあんまり使いません
→　なぜでしょうか？みんなが使うアプリがあればよかったかな？みんなはツイッターを使っているから、なんかツイッターAPIのベースしてイベント管理アプリがあればいいでしょうか？

とりあえず、これからもっと面白くなるかもしれません！
GitLabでMerge時に自動でIssueをCloseされないようにするためのgitHook


# なぜ？
不具合チケットの管理にgitlabのissueを使ったら、closeしてないのに勝手にcloseしてしまう問題が頻発しました。
調べると、去年(2018年)のアップデートで追加された機能が原因らしいです。
参考
https://qiita.com/kyogom/items/710dbcdc3bc9cdbd0dfc

`close` や `fix` のような文字と合わせてissueNoをコミットメッセージに入れると、Merge時に自動でcloseされてしまう模様。。

# どうすればいい?
https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically
公式Docによると、サーバ内の  `gitlab.rb` や `gitlab.yml` のファイルを修正すればいいとありますが、
そうすると全projectに影響が出てしまいそうなので、コミット時にメッセージに制限を加えることにしました。

gitHook/commit-msg を使って、コミット時にメッセージをチェックします。
下記fileをrepositoryをcloneした`.git\hooks\`に置きます。

```sh:commit-msg
#!/bin/sh
############################
#自動でissueがクローズされてしまう用語を含む場合、コミットできないようにする
#This is a script that prevents you from committing if it contains a term that automatically closes the issue
# see https://docs.gitlab.com/ee/administration/issue_closing_pattern.html
############################
#issue closing pattern
format="(Close|Closes|Closed|Closing|close|closes|closed|closing|Fix|Fixes|Fixed|Fixing|fix|fixes|fixed|fixing|Resolve|Resolves|Resolved|Resolving|resolve|resolves|resolved|resolving|Implement|Implements|Implemented|Implementing|implement|implements|implemented|implementing) ?#[0-9]"

if grep -E "${format}" $1 >/dev/null; then
  echo "========================="
  echo "以下の単語はコミットメッセージに含むことができません(Merge時に自動でissueがcloseされるからです)"
  echo "The following words cannot be included in a commit message: Please remove it. (Because the issue is automatically closed when merging)"
  echo "Close, Closes, Closed, Closing, close, closes, closed, closing"
  echo "Fix, Fixes, Fixed, Fixing, fix, fixes, fixed, fixing"
  echo "Resolve, Resolves, Resolved, Resolving, resolve, resolves, resolved, resolving"
  echo "Implement, Implements, Implemented, Implementing, implement, implements, implemented, implementing"
  echo "========================="
  exit 1
else
  echo "[githook] commit format ok"
  exit 0
fi
```

# 注意点
**このgitHookScriptは完全にCloseを防止するものではありません。** 
たとえばissueNoの書き方を下記のようにすると、上記のgitHookScriptをすり抜けてしまいます。
`group/project#123`
`https://gitlab.example.com/group/project/issues/123`

また、公式Docに自動Closeされるメッセージの正規表現が公開されているのですが(下記)、正規表現の書き方がだいぶ異なりますので、カバーしきれていない書き方があるかもしれません。

```
((?:[Cc]los(?:e[sd]?|ing)|[Ff]ix(?:e[sd]|ing)?|[Rr]esolv(?:e[sd]?|ing)|[Ii]mplement(?:s|ed|ing)?)(:?) +(?:(?:issues? +)?%{issue_ref}(?:(?:, *| +and +)?)|([A-Z][A-Z0-9_]+-\d+))+)
```

そのため、利用する場合は、あくまで簡易的なチェック機能としてご利用ください。
systemd-bootでEFIブート変数が書き換わった時の対処

# systemd-bootでEFIブート変数が書き換わった時の対処

## TL;DR

```
# efivar --help
```

## はじめに

systemd-bootを利用している場合、F1キーを押すことで起動パラメータを編集することができます。
基本的に全てのパラメータは「/*ESP(EFI System Partition)*/EFI/loader.conf」を参照することになっていますが、`default`,`timeout`はEFIブート変数を優先するようになっています。

そのため、以下の偶然が重なると、`timeout`識別用の変数に0がセットされ、ブートメニューから何も選択できなくなります。

* PCの電源が入りブート処理が行われる
* ついうっかり「F1」キーが押される
* tキーが押される(timeoutの設定の上書き)
* 数値以外の何らかのキーが押される

## 対処

EFIブート変数は`/sys/firmware/efi/efivars`にマウントされ実際のバイナリの値を参照することは出来ますが、readonlyな領域のためUEFIのNVRAMに対して書き込みを行うことはできません。
そのため、ファイルを編集するように簡単に値を編集することはできませんが、値は`efivar`コマンドから操作することができます。

現在の値を確認するには以下のコマンドを実行します。

```
# efivar -l
...
4a67b082-0a4c-41cf-b6c7-440b29bb8c4f-LoaderConfigTimeout
...
```

たくさん出てきますが、今回問題となるのは「LoaderConfigTimeout」です。
謎のGUIDがありますが、値の規則はよくわかりませんでした。


値を書き換えるために、変更後の値を指定したファイルを作成する必要があるため、以下で作成します。今回は`timeout`を5秒にします。

```
echo -n 5 > LoaderConfigTimeout.txt
```

以下のコマンドで実際に設定を書き込みます。

```
# efivar --name=4a67b082-0a4c-41cf-b6c7-440b29bb8c4f-LoaderConfigTimeout -w -f LoaderConfigTimeout.txt
```

変更された事を確認します。

```
# efivar --name=4a67b082-0a4c-41cf-b6c7-440b29bb8c4f-LoaderConfigTimeout -p 
GUID: 4a67b082-0a4c-41cf-b6c7-440b29bb8c4f
Name: "LoaderConfigTimeout"
Attributes:
        Non-Volatile
        Boot Service Access
        Runtime Service Access
Value:
00000000  35                                                |5               |
```

再起動すると、EFIブート変数に指定した「LoaderConfigTimeout=5」が有効になることで、選択画面で5秒間待つようになり、0秒でtimeoutして適当なOSが起動するようになってしまった環境が元にもどります。
clang-format にて formatして欲しくない箇所を指定する

最近`clang-format`を知った。  
しかし現状触っているコードはC言語なのだが、組み込みSQLがあるコードなので、clang-formatでフォーマットするとSQL部分がぐちゃぐちゃになってしまっていた。  

##問題
例えばフォーマット後、下記のようになってしまう

```SQL
EXEC SQL
SELECT TEST INTO : h_VALUE
FROM TABLE_A
WHERE A = : lh_A
  AND B = : lh_B
  AND C = : lh_C
  AND D = : lh_D
  AND E = : lh_E
  AND F = : lh_F
  AND G = : lh_G
  AND H = : lh_H
  FOR
  UPDATE;
```

:(コロン）の後にスペースが挿入されてしまう。これだと現状ビルドエラーがでてしまい、フォーマット後手動で直すなんて意味がわからない状態になってしまった。  

##解決策

```C
// clang-format off
EXEC SQL
SELECT TEST INTO :h_VALUE
FROM TABLE_A
WHERE A = :lh_A
  AND B = :lh_B
  AND C = :lh_C
  AND D = :lh_D
  AND E = :lh_E
  AND F = :lh_F
  AND G = :lh_G
  AND H = :lh_H
  FOR
  UPDATE;
// clang-format on
```

上記のように、整形して欲しくない部分をコメントで囲めば、確かにフォーマットはされないようになった。
Stack Overflowには、1行ずつ、行の最後に `//` を書けば無視される、との意見もあったが自身の環境では動かなかった。
wordpress　カテゴリ、日付の取得

###記事のカテゴリを出力する

```php

<?php the_category(); ?>
```
カテゴリはul要素でまとめられている。
クラス”post-categories”が適用されている。

セパレーターの設定

```php

<?php the_category( ' / ' ); ?>
```
カテゴリを"/"区切りで表示できる

###日付を取得する

```php
<?php echo get_the_date(); ?>
```
Adobe XD で共同作業を設定した

先日のAdobe MAX 2019で発表があったように、Adobe XD 
にリアルタイムで共同作業の機能が付きました。

以前から1つのXDファイルを複数人のデザイナーが触る機会が弊社では多かったので、
この機能は待望でした。

#そもそも Adobe XD とは？
「Adobe XDは、共同作業を促進するパワフルで使いやすいプラットフォーム。webサイトやモバイルアプリ、音声インターフェイス、ゲームなどのデザイン制作をチーム全体でスムーズにおこなうことができます。 」（[公式サイト](https://www.adobe.com/jp/products/xd.html#scroll)より）

ざっくりいうと、

1. デザインカンプ/ワイヤーフレームの作成
2. デザインカンプ/ワイヤーフレームに遷移や挙動を付加
3. 成果物をオンライン上でステークホルダーに共有

といったUI/UX確認用モックアップ作成ツールになっています。

使用感としてはパワーポイントや昔あったAdobe Fireworksの様に直感的に操作でき、
サクサク作成することができます（アプリ自体もとても軽い）

# Adobe XD の共通編集について

「他のデザイナーとリアルタイムで共同作業できます。共同編集により、チームのメンバーと1つのドキュメントを共有して作業できるため、作業効率が上がり、作業の重複や競合を避けることができます。」（[公式サイト](https://www.adobe.com/jp/products/xd/features.html)）

今までも同じファイルを複数人で開くことは可能でしたが、作業内容が反映していない系のトラブルもありました。

そのため弊社では、
- ファイルの主担当者以外で作業の必要がある場合はマスターファイルをコピーして使う
- 別担当者が作業したコピーファイルをマスターファイルにマージする際は主担当者がファイルを閉じる

と運用ルールを決めて作業していましたが、
今回のバージョンアップで複数担当者で同一ファイルのリアルタイム編集が可能になりました。

# 具体的な設定方法
![イメージ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377984/687897f2-c2ad-f65e-1bb4-24e096f6daef.png)
XD右上のユーザーアイコンから「共同編集を有効にする（β版）」をクリック
![イメージ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377984/8912800b-1925-b0eb-ac94-005fa4f14659.png)
「共同編集が有効です（β版）」と表示していたら共同編集設定完了。
共有されたメンバーも同じファイルをリアルタイムで共同作業ができます。

# 気になる点


#####共同編集設定前よりアプリが重くなった
これは明らかにファイル作成中に感じています、重くなりました。
また共同編集者がリピートグリットを伸ばしている時など、毎回ではないですが、こちらの画面が固まったりも多々ありました。

#####共有用プレビューURLの更新は所有者しかできない
現状所有者以外のメンバーからのプレビューURLの更新は出来ないようです。
この点も出来ると便利ですが、Adobeの方針で機能制限している気もします。

#####共同編集の機能についてはまだβ版
2019年11月に新たに追加した機能なので、Adobe側でも懸念点はあるのか、まだβ版のリリースとのことです。
作業したファイルに影響がなければいいが。。。というのは気になる。

#結論：共同編集はとても便利
たまに作業内容が重いことも増えましたが、複数人でGoogleスプレッドシートのように共同編集できるのはとても便利。
自分のレビューコメントのラベルと意図

## これは何？
 
自分はレビューコメントにラベルをつけます。
時にコメントを沢山するかもしれませんが、レビューイには状況に応じて優先度を決めて対応して欲しいです。
そこで、自分がレビューで使うラベルとそれぞれの意図をまとめました。

## 僕のレビューで使うラベルとそれぞれの意図

|ラベル	|意図|対応が必須かどうか
|-------|---|------|
|MUST|	必ず対応して欲しい！|必須
|ASK|	実装意図の確認|必須|
|IMO|	自分ならこう実装するけどどう？|任意|
|nits|	細かい指摘|任意|
|mono|	独り言。自分用のメモ|無視してOK|


### MUST
対応してもらわないとマージできない。

ex)
明らかに既存のアーキテクチャとずれている。
セキュリティホールがあり、本番反映されるとまずい。

### ASK
要件の確認や実装意図の確認。
レビューをする上で分からないことがあるので教えて欲しい。
レビューの精度に繋がるため、解決するまでマージは出来ない。

### IMO
In My Opinion
自分が考える実装を提案する時に使う。
自分の好みが反映されている場合が多い。
マージを優先したい場合は無視しても大丈夫。

### nits
些細な指摘。余裕があれば直して欲しい。

ex)
インデントやタイポ

### mono

レビュー中の自分のメモ。
無視してもらって大丈夫です。
Go言語(1.13)で自作ライブラリをimportする

# この記事について
対象：Go言語初学者向け

Go言語に自作ライブラリをimportするときに新旧の情報が混ざっていて結局どういうやり方がいいのかよくわからなかったので調べた。
バージョンが変わって色々と変わっているらしく、今後も変わりそう。

# 実行環境
MacOS Mojave 10.14
Go言語(Golang) 1.13
VisualStudioCode 1.40

# 結論
Go1.11からはGo Modulesを使いましょう。
Go1.10以前は$GOPATH配下に全て置くしかなさそう。
相対パスも環境によっては実行できるが非推奨。

# やりたいこと
下記の構成で自作のライブラリをmainからimportしたい。

#### ディレクトリ構成

```
newmod/
├── lib
│   └── lib.go
└── main.go
```

#### テスト用ソース
```main.go
package main

import (
    "fmt"
    "newmod/lib"
)

func main() {
    s1 := "abc123-~ｱｲｳ|"
    s2 := "ａｂｃ１２３－～アイウ｜"
    fmt.Println(s1)
    ns := lib.Convert(s2)
    fmt.Println(ns)
}
```

```lib.go
package lib

import "golang.org/x/text/width"

func Convert(s string) string {
    return width.Narrow.String(s)
}
```

このままだとimportエラーが発生するのでGo Modeluesを設定する。


# やったこと
下記の記事を参考にGo Modeluesを設定。
https://techblog.asahi-net.co.jp/entry/2019/03/11/122341#Modules%E3%81%AE%E5%B0%8E%E5%85%A5


```
$ cd newmod
$ go mod init newmod
```

上記のコマンドを実行するだけ。
実行するディレクトリに注意する。(ここを間違ってハマった...)

# 結果
go.modができてここでライブラリ(モジュール)を管理するようになる。
GOPATHを設定しなくてもgo.modがあるディレクトリにパスが通るようになって自作ライブラリもnewmodディレクトリからのパス指定でimportできるようになった。

```
newmod/
├── go.mod
├── go.sum
├── lib
│   └── lib.go
└── main.go
```

```go.mod
module newmod

go 1.13

require golang.org/x/text v0.3.2
```


# Goのライブラリ管理についてわかったこと
Go1.11からライブラリ管理方法として、Go Modeulesというものが導入されていて、現バージョンのGo1.13ではGo Modulesが推奨されているらしい。
Go1.10以前のバージョンではGOPATHという環境変数を設定して$GOPATH/srcの配下で開発することが前提になっていたが色々問題があった模様。

現状、新旧のGoバージョンでの情報が混在しているのでGOPATHを設定しろ、みたいなことが書かれているが、最新のGo言語はそもそもGOPATHがデフォルトで設定されないのでこれからはGoModulesで管理するのが無難かなと。


#参考記事
Go Modules
https://qiita.com/propella/items/e49bccc88f3cc2407745
The Go Blog - Using Go Modules / Go Modulesを使う（和訳）
https://qiita.com/pokeh/items/139d0f1fe56e358ba597
全俺が全俺に送る開発体験談（愚者の学び）

# はじめに
　開発での失敗をなるべく具体的に書き残していって、再度つまづくことは避けましょうという趣旨で書きます。

# 失敗について
大きい枠組みでの開発失敗例、とかは例えば雑誌の記事だったりはあるんですが、小さな失敗談や予防策とかがどうも見つけられなかったので、自分用の備忘録として書いて順次追加していこうと思います。
　
## 仕様編
ここはどう実装するんだろう？→こうかな？
って思考になったら赤信号です。ちゃんと確認を取りましょう。蓋をあけたら全く違っててヒぃってなりました。（軽症でしたが）

## 気持ち編
「仕事大好き」とかイキっていても、残業が重なってきたりするとあっさり「もう嫌だ」とコロッと変わります。お前は超人じゃないんだから粋がらないように。何か自分が恥ずかしくなります。周りに吹聴していたら恥３倍（さすがに周りには吹いてませんが）

## 開発編
### ログについて
言語ごとにログの実装方法を（検索用単語くらいは）頭に入れておきましょう。
開発時はいつでもログを差し込む気持ちでいましょう。後から差し込むのは面倒くさく、メンタル的にマイナスです。ここにはログ打ったかな？といちいち探すのもしんどいです。

### 設計について
そのプロジェクトでコードのパターンがあるなら、なるべく寄せて（独自の流れに変更せず）実装したほうがいいかも知れません。（自分独自のコードも書きたいので必ず、とは言いたくないですが。）
寄せておくと、他メンバーがコードを参照したときにバグなどをチェックしやすいでしょう。

頭の中に汎用的に使えるようなロジックエンジンのテンプレートを入れておく、もしくはそれを資料化しておくと、新しくアプリケーションを作る際にロジック設計で多くの時間を消費しなくて済みます。（もちろん別ロジックで組まなければいけない時もありますが。）

他者に公開するインターフェースについて、その入力に信頼をおいてはいけません。むしろ攻撃されるもの、と思うぐらいバリア処理張っておけ。**大火傷しました。**
## お勉強編
なるべく学んだことはブログとかに、作ったものはGithubとかにあげておきましょう。転職活動中のことですが、ふっとそれらの提示が求められるので、慌てて死蔵していたものをあげたりすると、自分の段取りの悪さとか先見のなさに自己嫌悪すること請け合いです。

## 他に
まだまだ書き加えて行きたいと思います。（死
NuxtでFATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memoryが発生する場合の解決方法

Nuxtのdevモードで`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`が発生する場合の解決方法です。
以下のように、`standalone: true,`を`nuxt.config.js`の`build`オプションに追加して下さい。エラーが解決します。

```javascript:nuxt.config.js
// 略
  /*
   ** Build configuration
   */
  build: {
    /*
     ** You can extend webpack config here
     */
    standalone: true, //これを追加！
    extend(config, ctx) {}
  }
// 略
```
参考: https://github.com/nuxt/nuxt.js/pull/5452

## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
ImageMagickの活用方法(Mac)

## セットアップ

Homebrewからインストールします。

```shell-session
$ brew install imagemagick
```

## Convert SVG to PNG

SVGをPNGに変換します。

```shell-session
$ convert -density 100 -background none {ファイル名}.svg {ファイル名}.png
```

`-density` は密度を表すオプションのようです。
`1200` だと4MB以上になってしまいました。 `100` くらいがちょうどよさそうです。

`-background none` を指定すると背景を透過できます。必要に応じて付けてください。

## Convert Multiple PNGs to a single PDF

複数のPNGを1つのPDFに変換します。

```shell-session
$ convert *.png {ファイル名}.pdf
```

## Convert GIF to XPM

GIFをXPMに変換します。

```shell-session
$ convert -delay 100 {ファイル名}.gif {ファイル名}.xpm
```

`-delay` は一時停止して次の画像を表示するオプションのようです。

## 参考リンク

- [svgをpngに変換するワンライナー - Qiita](https://qiita.com/suin/items/0bfa07b7c29883beb50d)
- [ImageMagickを使用して、アンチエイリアスを使用してSVGを透明PNGに変換します](https://stackoverflow.com/questions/9530524/convert-svg-to-transparent-png-with-antialiasing-using-imagemagick)
- [macos-Macで多くの画像を1つのPDFに変換する-スーパーユーザー](https://superuser.com/questions/350201/convert-many-images-to-one-pdf-on-mac)
- [Image Magick](http://www-geoph.eps.s.u-tokyo.ac.jp/~s42607/imagemagick.xhtml)
Firebase Cloud Messaging(FCM)のtokenをcurlで検証

fcmのレガシーHTTPプロトコルで URLパラメータに `dry_run=true` 指定すれば、下記curlで検証できた。レガシーHTTPプロトコルが有効な間はこれで手軽に確認できるはず...!

```zsh
$ curl -H "Content-Type: application/json" -H "Authorization: key=$FCM_API_KEY" "https://fcm.googleapis.com/fcm/send?dry_run=true" -d '{"registration_ids":["$FCMTOKEN"]}'
```

```zsh:結果
{"multicast_id":-1,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"fake_message_id"}]}
```
田舎ポンコツ大学生がプログラムに目覚めた話

#自己紹介
こんにちは初めまして。Ryusei（りゅうせい）と申します。

私は2019年現在経営学部に所属している大学2年生です。

2019年1月にブラインドタッチから覚え、現在福島県会津若松市にあるIT企業、株式会社Eyes,JAPAN（http://www.nowhere.co.jp/ ）にリモートワークでアルバイトをしています。

Qiitaで投稿するきっかけは社長から、初めてやることも多いからアウトプットもかねてブログを書いてみたら？と言われたことがきっかけでした。

今年の夏にEyes, JAPANでインターンをしていたのですがそこではほぼ毎日ブログを書いていました。なのである程度文章を書くスピードだけは速くなりましたが、大目に見てください。

一応使える言語はHTML、CSS、JavaScrpt、JQuery、PHP、Rubyです。
ちなみに完全に完璧に理解できています。
→こちらを参照ください（笑）https://togetter.com/li/1268851


#なぜITの世界に？
これまでの経緯を話すと、

あることで友人に先を越された経験があり、

正直とても悔しかったです。

身近だった人がいつの間にか別の世界にいるというのは、かなり私の闘争心を燃やしました。

そこからです。

何かできることはないか。自分の得意なことはなんだ。何をしたい。何が好きだ。ということを3か月間考えました。

そんな時、そういやPC触るの好きだったな。と。ゲーミングPCも持ってる。ホリエモンがプログラミングなんて簡単だ。今は「Progate」もあるしな。

　（こちらがそのYouTubeのURLです。　https://youtu.be/nhJaRJzotTk )

...そんなこと言ってたな、「Progate」？やってみるか！
といったことで、最初はHTML、CSS（正確にはマークアップ言語）から入っていきました。

これが私がこの世界に入った経緯でした。

#楽しかった
これが一番だと思います。プログラミングをやってみて、こうやったらこうなる、こう動く。
例えば
HTMLだと

```
<p>text</p>
```
や、CSSの

```
.example {
color: red;
}
```

当たり前のように簡単なことですが、それでも作り上げる感じがとても楽しく、続けれたのがよかったかと思います。

プログラミングを独学で勉強して三か月も経つと、負けたくない。という感情より、このスキルを使って稼いでみたいという感情も湧いてきました。

#先生がいない

周りに教えてくれる人は全くいませんでした。

経営学部ですので、そういった関りもゼロでした。

そこで大学の先輩に、どうやったら社長や、そういった技術者に会うことができるのかを聞き、実際にFacebookでイベントに参加しました。

初めて参加したイベントが当たりだったらしく、ITに関わっている方が多くそこで出会ったのが現在アルバイトをしている会社の社長でした。

ここから少し時間を置いて、インターンをお願いして４週間会津に滞在するのですが、これは会社のブログにまとめたものを書いているのでそちらをご覧ください。
http://www.nowhere.co.jp/blog/archives/20190906-180024.html

#まとめ
2019年の1月からプログラミングを始めたことにより、冗談抜きで人生の岐路を迎え、新たな道を進み始めました。

まだまだ初心者ですが、学んだことをQiitaでアウトプットしていきたいと思います。

次回から「大学二年生のリモートワークでアルバイト」
何をやっていているのか、どこが分からなかったか、について記事にしていきます。
HeidiSQLを使っていたらONLY_FULL_GROUP_BYがどっか行った

## おじさんがHeidiSQLを過信しすぎてgroup byにハマった結果…
はい皆さんこんにちは

結論から言うとこの記事は
・MYSQLで厳密モードを使っている(ONLY_FULL_GROUP_BY)
・どうもHeidiSQLからの接続で厳密モードがONになっていない
・HeidiSQLから再設定した
という話です。


## この話の環境は以下の通りです。
- HeidiSQL 10.2.0.5599
- AWS EC2（Ruby on Rails）
- AWS RDS (MySQL 8.0.16)

MYSQLに繋ぐにはEC2経由でSSｈトンネルを使っています。


## 詳細。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/6e6e4b66-d49f-003e-95bc-b866f6a8ee0f.png)

SELECT @@global.sql_mode;
"@@global.sql_mode"
"ONLY_FULL_GROUP_BY,NO_ENGINE_SUBSTITUTION"

MYSQLにはONLY_FULL_GROUP_BYが設定されてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/1452b6d8-dcaa-253a-14e9-72fba8b9c388.png)

例えばこのようなテーブルで


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/ec67414a-9e44-bdee-8732-3598e42944d3.png)


SELECT A FROM mysql.test
GROUP BY C;

この時GROUP BYしていないAは取り出せないと怒られます。（5.7系からデフォでこうなっているらしい）

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mysql.test.A' 
which is not functionally dependent on columns in GROUP BY clause; this is incompatible 
with sql_mode=only_full_group_by





**HeidiSQLを利用すると何故か結果が抽出できてしまう**
**そうはならんやろ・・・ ~~なっとるやろがい~~**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/f4a84588-01fb-9003-7b2a-ab37007d0b02.png)
そこでHeidiSQLでsql_modeを変更してみたらうまくいった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/8c2703f8-6855-102d-c84d-e14e79674929.png)
↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/74a99184-77f0-cd42-a596-06f6998c9263.png)
↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/91812d64-0d71-94c4-6053-e4b2ee1e8dca.png)


### 正直おまかんな気がするんですが同じような症状の人はこれ打ってみてください。

今の設定を見る
SELECT @@global.sql_mode;

sql_modeを変更する
SET SESSION sql_mode=ONLY_FULL_GROUP_BY;



**ありがとうございました。**
「スプレッドシートによるスクレイピング」 で、取得したデータをShift_JISからUNICODEに変換する方法

# 概要
スプレッドシートで簡単にスクレイピングができる`IMPORTXML`関数を使う際に、取得したデータの文字コードがShift_JISの場合文字化けが起きてしまいます。その問題をGoogle Apps Script(GAS)を利用して`SHIFTJIS2UNICODE`という独自関数を登録することにより解決しました。

# 手順
[こちらのコード](https://gist.githubusercontent.com/pkino/5e26d16fe3d417c9a399812778157d22/raw/33005c627b4c5082ab92810154c6304b4047385f/SHIFTJIS2UNICODE.gs)をGASにコピペして、スプレッドシートのセルから`SHIFTJIS2UNICODE`関数を呼び、`=SHIFTJIS2UNICODE(IMPORTXML("https://en.wikipedia.org/wiki/Moon_landing", "//a/@href"))`のように活用します。

## 詳細な手順
1. スプレッドシートのメニューから「ツール」→「スクリプトエディタ」の順に進み、スクリプトエディタを開きます。
2. [SHIFTJIS2UNICODE.gs](https://gist.githubusercontent.com/pkino/5e26d16fe3d417c9a399812778157d22/raw/33005c627b4c5082ab92810154c6304b4047385f/SHIFTJIS2UNICODE.gs)をコピーして、スクリプトエディタにペーストして全てを書き換えます。
3. 登録が終われば、スプレッドシートのエディタから関数として`SHIFTJIS2UNICODE`関数を呼び、`=SHIFTJIS2UNICODE(IMPORTXML("https://en.wikipedia.org/wiki/Moon_landing", "//a/@href"))`のように読み込みます。
<img width="981" alt="スクリーンショット 2019-11-14 9.59.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146971/bb4d1b7f-83d3-0018-11ae-98af9987026b.png">


# 注意点
- 文字コードの関係のせいか小さいカタカナの「ュ」が「?」として表示されてしまうことを確認しています。これを修正するために次のように[`SUBSTITUTE`関数](https://officepress.net/googledocs/function-spread/substitute-spread.html)を利用するという方法が挙げられます。 
`=SUBSTITUTE(SHIFTJIS2UNICODE(IMPORTXML("https://en.wikipedia.org/wiki/Moon_landing", "//a/@href")),"?","ュ")`しかし元々「?」の場合も置換してしまうため注意が必要です。
- その他にも表示が正確でない事例も存在するかもしれないので、ご注意ください。
- 今回のコードは[encoding.js](https://github.com/polygonplanet/encoding.js/blob/master/README_ja.md)をGASで利用しています。またそのソースを直接貼り付けているためコードが長くなっています。
PsychoPyのBuilder, Codeコンポーネント, Coderの使い分け

PsychoPy、使ってますか？
本当に便利なソフトウェア（アプリケーション）ですよね。簡単なプログラムであれば、BuilderにImageコンポーネントやKeyboardコンポーネントを置いていくだけで、あっという間に作ることができます。

ただ、少し複雑なプログラムになると、Builderだけで作成するのが難しくなります。
そういったときには、Codeコンポーネント、あるいは、Coderの出番です。

CodeコンポーネントもCoderも知ってる。具体的な使い方を知りたいんじゃーというひとは[PsychoPyで円を描くように刺激を動かす。複数回のキー押し。キーを押したときの刺激の位置を記録。](https://qiita.com/kurokida/items/75b97c2aaf40e0b632d1)をご覧ください。

# Codeコンポーネント
Text, Image, Keyboardコンポーネントの仲間です。
下の図の赤で囲んだコンポーネントがCodeです。

<img width="232" alt="スクリーンショット 2019-11-14 9.44.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/ad496ba2-7eaa-2422-42d8-4a44e8d89094.png">

次の５つのタイミングで実行したいPythonのコードを記述することができます。

- 実験開始時
- Routine開始時
- フレーム毎
- Routine終了時
- 実験終了時

フレーム毎というのがイメージしにくいかもしれません。そんなかたは、ぜひ[リフレッシュ（フレーム）レートとPsychoPyのwin.flip()](https://qiita.com/kurokida/items/f0b9de54c3ef9ee22f34)をご覧ください。とりあえずは、**プログラムで操作可能な、一番短い時間ごとになにかをしたいときは「フレーム毎」を使う**という認識でOKです。（本来の意味は、画面が描画されるタイミングです）

# Coder
実験によっては、Codeコンポーネントを使っても作りにくいプログラムがあるかもしれません。
そんなときには、Coderの出番です。
下の図の赤で囲んだ箇所をクリックすると Coder が開きます。
<img width="864" alt="スクリーンショット 2019-11-14 9.52.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/0e331b67-8eb7-2d83-99cf-315ad231e9d9.png">

Coderの画面
<img width="801" alt="スクリーンショット 2019-11-14 9.54.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/50afaa76-5502-d9a4-f98e-f31b86995103.png">

ここにPythonのコードを直接書き込みます。実行するときはCoderの実行ボタン（人が走っている緑のアイコン）をクリックする必要があるので注意してください。

それから重要な点として、**Coderで編集をしたあとは、Builderでの変更ができなくなります。**
ですので、Builderでできることをすべてやり終えたあとに、Coderで編集することをお勧めします。Coderでファイルを開いたら、すぐに**別名で保存するようにしましょう。**

またCoderよりも、[Visual Studio Code](https://code.visualstudio.com/)や[Atom](https://atom.io/)などのテキストエディタを使うほうが便利だと思います。Coderで別名保存した.pyファイルを、お好みのテキストエディタで開いて編集しましょう。

編集が終わったら保存して、あらためてCoderから開き、実行します。

![texteditor.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/ead9143c-fc17-ca28-88f1-08015d51ffcd.jpeg)

ちなみに、最初からCoderのみで実験プログラムを作成することができますが、覚えなくてはいけないPsychoPyの構文が多いため、Builderでできるところを先に作り、必要に応じてCoderを使うという方法をお勧めします。

Codeコンポーネントと、Coderの具体的な使い方については、[PsychoPyで円を描くように刺激を動かす。複数回のキー押し。キーを押したときの刺激の位置を記録。](https://qiita.com/kurokida/items/75b97c2aaf40e0b632d1)をご覧ください。
SQLServerからDB2にリンクサーバを経由のViewでSELECT、UPDATEする

メモ

作業は全てSQLServerでの作業
対象がDB2 for iの場合
　IBM i Access for Windowsをインストールし、
　IBM DB2 for i IBMDASQL OLE DB Providerを入れる
対象がDB2 for windowsの場合
　IBM Data Server Clientをインストールし、
　IBM OLE DB Provider For DB2を入れる


MSDTCを有効化
サービス(Distributed Transaction Coordinator)を起動

## プロバイダに対する設定
プロバイダーの設定からInProcess許可を有効化
対象が
DB2 for iの場合：IBMDASQL
DB2 for windowsの場合：IBMDADB._xxxx_



## リンクサーバーの作成

| ページ | 項目 | 設定値(For i) | 設定値(For Windows) |
|-----------|------------|------------|------------|
| 全般 | リンクサーバー | 任意 | 同左 |
|  | サーバーの種類 | その他のデータソース | 同左 |
|  | プロバイダー | IBM DB2 for i IBMDASQL OLE DB Provider | IBM OLE DB Provider For DB2 - _xxxxx_ |
|  | 製品名 | Oracle | 任意? |
|  | データソース | サーバIPアドレス | データベース名 |
|  | プロバイダー文字列 | 空 | OleDbReturnCharAsWChar=0 |
|  | 場所 | ー | サーバIPアドレス |
| セキュリティ | ローカルサーバーのログインとリモートサーバーのログインのマッピング | なし | 同左 |
|  | 上記一覧で定義されないログインの接続方法 | このセキュリティコンテキストを使用する | 同左 |
|  | リモートログイン | DB2接続時のユーザー名 | 同左 |
|  | パスワード | DB2接続時のパスワード | 同左 |
| サーバーオプション | RPC | True | 同左 |
|  | RPC出力 | True | 同左 |

リンクサーバーを作成し、オプションを以下の通り変更
RPC:True
RPC出力:True

##UPDATE
トリガー追加
ALTER trigger [dbo].[onInsertTable1] ON [dbo].[View_DB2_Table1]
instead of insert
as
begin
SET XACT_ABORT ON
exec ('SET TRANSACTION ISOLATION LEVEL NO COMMIT') AT DB2
insert into DB2.instanceName.schemeName.Table1 select * from inserted
end


参考：https://technet.microsoft.com/ja-jp/library/ms188332(v=sql.105).aspx
リンクサーバーのデータを更新：http://going-my-way-on-job.cocolog-nifty.com/blog/2005/06/post-f6a4.html
分散トランザクション：http://ponyoth.hateblo.jp/entry/2015/08/27/141022
DB2のリンクサーバー：http://ino1970.blog119.fc2.com/blog-entry-202.html
DB2からのSELECTでデータ長が合わない(Error: Msg 7347)：http://www-01.ibm.com/support/docview.wss?uid=swg21474177
Werckerを使用する際にはまったこと

##Werckerって
ドキュメント少ない気がする・・・
業務で使用していてハマったことはメモしておこうと思います。
今回はカスタムステップを使用する場合のrun.shでの変数取得方法についてです。

##前提
- カスタムステップのプロジェクト名: `hoge-piyo`

- カスタムステップを利用する側のプロジェクトのwercker.yml

```yml:wercker.yml
# ~省略~
steps:
  - my-wercker/hoge-piyo@1.0.0:
    project: $TEST_PROJECT #このvalueはwerckerの画面上で値を設定
# ~省略~
```

##run.shでの取得

`WERCKER_HOGE_PIYO_PROJECT`
です。

つまり、、、
```"WERCKER_(固定prefix)"
   +"HOGE_PIYO_(werckerのカスタムステップ名)"
   +"PROJECT(利用する側のwercker.ymlの環境変数のkey)"
```

##注意点
- アッパーケースでアンダーバーつなぎにすること

##その他
カスタムステップを使わない場合
code: | xxxxxxxx　の部分でshellを書ける
[Linux Tips] バックグラウンドでコマンド実行するには

知ってるよって方が大半、百番煎じくらいかと思いますが、主として内輪向けに・・・

# 単にバックグラウンドで動かしたい場合

最後に`&`を付与します。

```console
user@user-VirtualBox:~$ sleep 1000 &
[1] 20723
user@user-VirtualBox:~$
```

もしくは、`Ctrl-Z`で一時停止してから、`bg`してやります。

```console
user@user-VirtualBox:~$ sleep 1000
^Z
[1]+  停止                  sleep 1000
user@user-VirtualBox:~$ bg
[1]+ sleep 1000 &
user@user-VirtualBox:~$
```

出力が鬱陶しければ、リダイレクトを使いましょう（割愛）。

# 端末を閉じても動かし（続け）たい場合

`nohup`を使います。

```console
user@user-VirtualBox:~$ nohup sleep 1000 &
[1] 20736
user@user-VirtualBox:~$ nohup: 入力を無視し、出力を 'nohup.out' に追記します
```

見ての通り、出力は`nohup.out`になされるため、こちらはリダイレクト不要です。
[Swift5]スライス処理とArraySlice型

# はじめに

Swiftで便利な配列処理の一つスライス処理をした際の
少し特殊なArraySlice型についてまとめました。

# 前提知識(スライス)
-  配列の一部だけ切り取りたい場合、Swiftでは以下のようにスライス処理が簡単に行えます。


```swift
let sortedArray = ["a","b","c","d","e","f"]
let slicedArray = sortedArray[2...3]
//["c", "d"]
```
- エラー回避のために配列の要素が4以上の時のみ処理するようにした場合

```swift
let sortedArray = ["a","b","c","d","e","f"]
let countInt = sortedArray.count //4
//要素が4以上で処理
if countInt >= 4{
    let slicedArray = sortedArray[2...3]
}
//["c", "d"]
```

- ここまでの処理では問題にならないですが、次の記述ではArraySlice型を知っていないといけません。


# 事前に宣言した場合(エラー）

```swift
let sortedArray = ["a","b","c","d","e","f"]
let countInt = sortedArray.count

var slicedArray = [String]() //エラー
//Cannot assign value of type 'ArraySlice<String>' to type '[String]'

if countInt >= 0{
    slicedArray = sortedArray[2...3]
}
//["c", "d"]
```
- Swiftでは配列をスライスするとArraySlice型になるので型が違いますよとエラーが発生します。

# ArraySlice型で宣言すべし


```swift
let sortedArray = ["a","b","c","d","e","f"]
let countInt = sortedArray.count

var slicedArray = ArraySlice<String>()

if countInt >= 0{
    slicedArray = sortedArray[2...3]
}
//["c", "d"]
```

# ArraySlice型の特徴: Indexはオリジナルの配列が基準

### sliceArrayからインデックスを取得した場合

```swift
//"c"が最初に現れるIndexを取得
let firstIndex:Int? = slicedArray.firstIndex{ $0 == "c" } ?? nil
print(slicedArray)
print(firstIndex as Any)
//["c", "d"]
//Optional(2)
```
- 取得されたindex番号はsliceArray基準ではなく、
スライスする前の元配列が基準になります。

```swift
// スライス前の配列
let sortedArray = ["a","b","c","d","e","f"]
```



以上、ArraySlice型についてでした。

ご指摘や補足などありましたらコメントにてお願いいたします。
ジェネリクスが便利

##ジェネリクス
を知りました、便利ですねこれ

##具体例
```Test2.java
package test1;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class Test2 {
	
	public static void main(String[] args) {
		createList("e").forEach(Test2::echo);
		createMap("a", 1).entrySet().forEach(Test2::echo);
		try {
			echo(nullToBlank(null));
			echo(nullToBlank("a"));
			echo(nullToBlank(1));
		} catch (NotStringException e) {
			e.printStackTrace();
		}
	}
	
	private static <T> void echo(T t) {
		System.out.println(t);
	}
	
	private static <T> List<T> createList(T t) {
		List<T> list = new LinkedList<>();
		list.add(t);
		return list;
	}
	
	private static <K, V> Map<K, V> createMap(K key, V value) {
		Map<K, V> map = new HashMap<>();
		map.put(key, value);
		return map;
	}
	
	private static <T> String nullToBlank(T t) throws NotStringException {
		if (t == null) {
			return "";
		} else if (t instanceof String) {
			return t.toString();
		} else {
			throw new NotStringException("nullでも文字列型でもありません");
		}
	}
	
	private static class NotStringException extends Exception{
		
		private static final long serialVersionUID = 1L;
		
		private NotStringException(String msg) {
			super(msg);
		}
		
	}
	
}
```

ひとつずつ見ていきましょう

###echo
```echo.java
	private static <T> void echo(T t) {
		System.out.println(t);
	}
```

型が何でもいいってことですね
引数の型、普通ならStringとかのとこがTになってます

そのかわり、急にTとか言われてもわからんので, 今からTつかうよーって宣言で
voidの前に<T>が入ってます

###createList
```createList.java
	private static <T> List<T> createList(T t) {
		List<T> list = new LinkedList<>();
		list.add(t);
		return list;
	}
```

リストなどの型にもジェネリクスが使えますね
以上

###createMap
```createMap.java
	private static <K, V> Map<K, V> createMap(K key, V value) {
		Map<K, V> map = new HashMap<>();
		map.put(key, value);
		return map;
	}
```

2つ同時にジェネリクスを使えます
大文字から始まる単語なら何でもいいので好きな文字使ってくださいな
慣例として不文律的な物があるらしいんですけど知りたかったらググってください


###nullToBlank
```nullToBlank.java
	private static <T> String nullToBlank(T t) throws NotStringException {
		if (t == null) {
			return "";
		} else if (t instanceof String) {
			return t.toString();
		} else {
			throw new NotStringException("nullでも文字列型でもありません");
		}
	}
	
	private static class NotStringException extends Exception{
		
		private static final long serialVersionUID = 1L;
		
		private NotStringException(String msg) {
			super(msg);
		}
		
	}
```

型が何でもいい引数に対して
-> nullなら空文字を返す
-> 型がStringならそのままの値を返す
-> Stringでもnullでもなければ例外を投げる

ってメソッドです
まぁまぁ便利そうですよね
nullチェックをしたいときにinstanceofの項目を増やせばわりと汎用的になるかと

型の入り口が広いほど予期せぬエラーの発生の元なので
使うときは結構注意するべきかもですね
Firebase Hosting のデプロイメッセージにgitコミットIDをつける

Firebase Hosting でdeployする際にメッセージをつけることができます。

```sh
firebase deploy --only hosting --message "DEPLOY MESSAGE"
```

こうするとFirebase Hostingのリリース履歴に時刻だけではなくメッセージも表示されます。

とはいえ、いちいちメッセージを書くのも面倒です。

なので、package.jsonのdeployメッセージを次のようにします。

```json
{
 "script":{
   "deploy": "m=`git log -1 --pretty=format:\"%h\"`;firebase deploy --only hosting --message \"git:${m}\"",
  }
}
```
これで```yarn run deploy```すれば、その時のgitコミットIDがデプロイメッセージとして付与されます。

## git log -1 --pretty=format:"%h"

これで最新の1行のコミットIDが出力されます。

当初コミットメッセージをデプロイメッセージにしようと```git log -1 --oneline```としたら、firebaseコマンドの--messageオプションの使用可能文字の関係なのかエラーがでることがあったので、コミットIDだけにしました。
【Oracle DB DDL】列にコメントを付ける

# 列コメント
```
COMMENT ON COLUMN テーブル名.列名 IS 'コメント文';
```


# テーブルコメント
```
COMMENT ON TABLE テーブル名 IS 'コメント文';
```


### ドキュメント
[COMMENT](https://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_4009.htm)
Hyper-V の設定をコマンドラインで有効にする

# 状態の確認方法
```
Get-WindowsOptionalFeature -Online | where FeatureName -Match hyper
```

# 設定
```
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -NoRestart
Restart-Computer
```

# Windowsの機能の有効化または無効化
この場所の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30116/8b3d482a-fc52-0438-aa25-8cce32a20f2d.png)
C#32bitアプリで64bitOSの64bitのregistryを開く方法

nullしか返ってこないと、方法を1時間くらい探して発見。
OpenBaseKeyでRegistry64を設定したらできました。

```regOpen.cs
RegistryKey Reg64bit = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey reg = Reg64bit.OpenSubKey("software\\xxxx");
```
経営統合とは？

## 経営統合とは？
経営統合とは、2社以上の会社がお金を出し合って新しい会社を作り、お金を出した会社がその新しい会社の子会社になること。

### 経営統合の特徴
会社が増える。

### 経営統合の例文
A社とB社が経営統合しました。
→ A社とB社がお金を出し合って、C社を作りました。そして、A社とB社はC社の子会社になりました。

## 合併とは？
ちなみに合併とは、2社以上の会社が1つの会社になること。

### 合併の特徴
会社が減る。

### 合併の例文
A社とB社が合併しました。
→ A社とB社は一緒になって、1つの会社になりました。

---
YahooとLINEが経営統合みたいなニュースが飛び交っていたので調べてみました。
GCP アップデート (11/8-11/14 2019)

### GCS: [Nov 7, 2019](https://cloud.google.com/storage/docs/release-notes#November_07_2019)
- バケットの権限管理をIAMのみにして、ACL(より細かくオブジェクトレベルで権限を操作する昨日)を無効化する"Bucket Policy Only"が"Uniform bucket-level access"にリネームされたよ。
  - 名称変更だけでベータのまま。

### AI Platform: [Nov 1, 2019](https://cloud.google.com/ai-platform/deep-learning-vm/docs/release-notes#November_01_2019)
- GCPに最適化や長期サポートがある、Tensorflow EnterpriseのVMイメージを利用できるようになったよ。

### Compute: [Nov 8, 2019](https://cloud.google.com/compute/docs/release-notes#november82019)
- Cascade LakeベースのN2マシンタイプがus-east1-c, europe-west1-b, europe-west2-aで使えるようになったよ。
  - こういうのって何CPUぐらい置かれたら使えるようになるんでしょうね。。

### GKE: [Nov 11, 2019](https://cloud.google.com/kubernetes-engine/docs/release-notes#november_11_2019)
- 11/11/2019より、gcloudでクラスタを作成した場合、デフォルトでノードの自動アップグレードが有効になる。
  - 自分で管理する/したい場合は明示的に無効にしましょう

### Billing: [Nov 12, 2019](https://cloud.google.com/billing/docs/release-notes#November_12_2019)
- Blling Budget APIがベータになったよ。
  - アラート等の操作がAPI経由でできるようになった。

### Functions: [Nov 12, 2019](https://cloud.google.com/functions/docs/release-notes#November_12_2019)
- IAMを利用してHTTP functionsへのアクセス制御ができる機能がGAになったよ。

### BigQuery: [Nov12, 2019](https://cloud.google.com/bigquery/docs/release-notes#November_12_2019)
- カラム名を指定せずにINSERTとMERGEを行えるのがGAになったよ。

### VPC: [Nov 13, 2019](https://cloud.google.com/vpc/docs/release-notes#November_13_2019)
- VPCピアリングでカスタムルートをインポート、エクスポートする機能がGAになったよ。
  - 自動でラウティング共有してくれるので楽。
- VPC内の特定のインスタンスのingressとegressをミラーリングする機能がベータになったよ。
  - VPCではなくインスタンスで転送されるので、リソースは要注意。
  - フローログにロギングされない等の[細かい制約](https://cloud.google.com/vpc/docs/packet-mirroring)があるので要確認。
  - ダークロンチとかIDSとかのセキュリティ関連で使えそう？

### Billing: [Nov 13, 2019](https://cloud.google.com/billing/docs/release-notes#November_13_2019)
- Billing ExportでBigQueryに出力する場合、サービスの使用量のデータが時間ごとになったよ。

### Cloud Run: [Nov 14, 2019](https://app.slack.com/client/TK72QEXGD/CK73H646L?cdn_fallback=1)
- GAになったよ！

### その他。(リリースノート関係なし)
- Network Intelligenceの[Topology](https://console.cloud.google.com/net-intelligence/topology)
  - ネットワークの接続状況とか転送速度を可視化してくれる機能。ベータ。
  - 外部、LB、NAT等も表示してくれるので、意図してない経路がないかとか、どこからどれだけ通信されてるかわかりやすくていい感じ。頑張って一個一個設定追わなくて済みそう。
  - 時系列でもみれる。
- Network Intelligenceの[Connectivity Test](https://console.cloud.google.com/net-intelligence/connectivity)
  - from,toのIPやインスタンス、ポート番号、プロトコルの定義をしておくと、接続できるか確認してくれる。
  - 接続できない場合、何が原因か教えてくれる(FW、routing等)
  - ネットワークの正常/異常性確認に使えそう。

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
[python][c++]逆順(降順)リストにbisect(*_bound)をする

bisectは降順リストに対応してないので作ってみた。
https://codeday.me/jp/qa/20190215/252510.html
もあるけど自力実装するのもなんだかなと。

```python
from bisect import*

cargo=[1,4,6,43,7,3,6,3,7,32]
length=len(cargo)
cargo_ascending =[1,3,3,4,6,6,7,7,32,43]
cargo_descending=[43,32,7,7,6,6,4,3,3,1]

#cargo_descending引数にとる必要ないんだけど一応
def bisect_reverse_right(cargo_descending,x,lb=0,ub=length):  
    return length-bisect_left(cargo_ascending,x,length-ub,length-lb)

def bisect_reverse_left(cargo_descending,x,lb=0,ub=length):
    return length-bisect_right(cargo_ascending,x,length-ub,length-lb)

print(bisect_left(cargo_ascending,7))  #6
print(bisect_right(cargo_ascending,7))  #8
print(bisect_left(cargo_ascending,43))  #9
print(bisect_right(cargo_ascending,43))  #10

print(bisect_reverse_left(cargo_descending,7))  #2
print(bisect_reverse_right(cargo_descending,7))  #4
print(bisect_reverse_left(cargo_descending,43))  #0
print(bisect_reverse_right(cargo_descending,43))  #1
```
```c++
int bisect_reverse_left(vector<int>cargo_descending,int x,int lb=0,int ub=length){
    return length-(upper_bound(cargo_ascending.begin()+length-ub,cargo_ascending.begin()+length-lb,x)-cargo_ascending.begin());
}
int bisect_reverse_right(vector<int>cargo_descending,int x,int lb=0,int ub=length){
    return length-(lower_bound(cargo_ascending.begin()+length-ub,cargo_ascending.begin()+length-lb,x)-cargo_ascending.begin());
}
```
コメントをいただいたので比較関数を使った版を

```c++
#include <algorithm>
#include <iostream>
#include <vector>

int length;

//こちらはcargo_descendingだけ必要
int bisect_reverse_left(std::vector<int>cargo_descending,int x,int lb=0,int ub=length){
    return *std::upper_bound(cargo_descending.begin()+lb,cargo_descending.begin()+ub, x, [](auto a, auto b) { return a > b; });
}
int bisect_reverse_right(std::vector<int>cargo_descending,int x,int lb=0,int ub=length){
    return *std::lower_bound(cargo_descending.begin()+lb,cargo_descending.begin()+ub, x, [](auto a, auto b) { return a > b; });
}



int main() {
    std::vector<int> v = {5, 4, 3, 2, 2, 1};
    length=v.size();
    std::cout<<bisect_reverse_left(v,3)<<std::endl;  //2
    std::cout<<bisect_reverse_right(v,3)<<std::endl;  //3
}
```
Google AI Platform Notebook で Kaggle 用 GPU 分析環境を作成してみる

### AI Platform Notebook とは
- GCP 上で数分で起動が可能なマネージド型の JupyterLab ノートブック インスタンス
- 数クリックで GPU インスタンスが作成、アクセスできる。裏では分析用のライブラリがインストール済みの GCE インスタンスが起動します。
- Pytorch(Anacondaベース), TensorFlowなどインスタンスのタイプを用途にあわせて起動時に選択可能
- 選べる GPU の種類は地域によって違う。例えば2019年10月時点ではus-west1が選択肢が多めだった。K80が最も安価なGPU、P100やV100は高価だが高速。

### GPU を使ってみる
- 基本的には自動的にドライバのセットアップが行われるので、インスタンスを起動したらすぐにGPUが使えます。以下のコマンドで、TensorFlowでGPUが認識、使われてるか確認できます。また、GPUの使用率は`!nvidia-smi`コマンドで確認します。

```
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```

- ~~特に何もしなくても起動直後にGPUは使えるはずだが、何か環境がおかしくなってしまった場合は`sudo chown jupyter /opt/anaconda3`してから[こんな](https://ymgsapo.com/2019/02/26/keras-gpu-deep-learning/)かんじで環境設定しなおすと良いかも。~~

```
sudo su jupyter
conda install python=3.6.6
conda install -c aaronzs tensorflow-gpu==1.12.0
conda install -c anaconda cudatoolkit==9.0
conda install -c anaconda cudnn
conda install ipykernel
python -m ipykernel install --user --name tf-gpu --display-name "TensorFlow-GPU"
jupyter notebook
pip install keras
sudo service jupyter restart
```

- なお、tensorflow1.14だとkerasに[GPU使用モードにできない](https://github.com/keras-team/keras/issues/13057)という問題がありますが、以下のようにtensorflow版kerasを使うと回避可能です。

```
from tensorflow.keras.utils import multi_gpu_model
# gpuの個数をカウントするmethod
def get_available_gpus():
    from tensorflow.python.client import device_lib
    local_device_protos = device_lib.list_local_devices()
    return len([x.name for x in local_device_protos if x.device_type == 'GPU'])
   
with tf.device('/cpu:0'):
    model = Unet()
model = multi_gpu_model(model, gpus=get_available_gpus())
```
- [GPU monitoring](https://cloud.google.com/compute/docs/gpus/monitor-gpus#setup-script)について（検証中）

### ノートブックから Cloud Storage への接続
- gcsfuseで直接 Google Cloud Storage のバケットをマウントできますが、AI NotebookだとpythonのgcsfuseにPATHが通ってしまうので`ImportError: No module named 'fuse'`エラーになってしまうケースがあります。その場合、/usr/bin/gcsfuseを指定しているか確認してみてください。
- GCEのカスタムメタデータでstartup-scriptに`sudo su - jupyter -c "/usr/bin/gcsfuse bucket_name /home/jupyter/xxxx"`しておくと自動でマウントも可能です。

### FAQ
- Jupyter Lab からコンソールを起動すると全角文字になってしまう問題があります。あと、ノートブックからpipなどを実行すると遅いようなので、Compute Engine に直接sshして`sudo su jupyter` でpipやkaggle api を使えるようにしておいたほうがよいかもしれません。
- ブラウザからJupyterに接続してるとセッションタイムアウトになってしまう場合があるので、SSHして.pyファイルを実行するか、[papermill](https://github.com/nteract/papermill)を使うと便利です。
- GPU の上限は、IAMの割当画面から2〜3程度なら申請すれば数時間であげることが可能ですが、5以上などあまりにも大きい数だと何日も待つことになります。
- Kaggleコマンドをインストールすると、デフォルトで ~/.local/bin/ 以下にインストールされるのでパスを通す必要があります。
- 再起動は `sudo service jupyter restart`で可能です。
- ノートブックがフリーズした時
sshからjupyterを再起動しようとしたところ、
No space left on device: '/home/xxx/.local  
というエラーに。sshから./.jupyter配下のいくつかのディレクトリを管理者権限付きで削除した結果元通りに動くようになりました。
簡潔にflashメッセージを実装する。 ❏Rails❏

#基本の書き方

コントローラー

```ruby:xxx_controller.rb
if article.save
  flash[:success] = "成功したよ！"
  redirect_to root_path
else
略
```

ビュー

```xxx.html.haml
= flash[:success]
```

<br>
これでsaveが完了したら、フラッシュメッセージが表示されるようになったよ！
やったね！！

<br>
ではまた！