OmniAICreator/Qiita-1.07M huggingface dataset:
php-master-changes 2019-01-03

今日は PDO のコンストラクタに参照を持つオプション配列を渡すと正常動作しない問題の修正、CPUID 利用方法の誤りによる AVX2 誤検知の修正があった！

# 2019-01-03
## nikic: Fixed bug [#77273](https://bugs.php.net/bug.php?id=77273)
- https://github.com/php/php-src/commit/cb009b12a54c3dbb0e10b79c6ca77db8736d55b9
- [7.2~]
- ext/pdo で、参照の入る配列を [PDO](http://php.net/manual/ja/class.pdo.php) のコンストラクタに渡してインスタンスを生成する際に失敗する問題の修正
- zend_hash_index_find_deref() は zend_hash_index_find() の見つけてきた要素が参照だった場合のデリファレンスを伴う版
- しかしこういう系、参照かどうかの判定がふつうに UNEXPECTED の分岐予測ヒント付くのになんかふく（普通に考えてそりゃそうだ、というやつではあるが）

## nikic: Possible fix for bug [#77357](https://bugs.php.net/bug.php?id=77357)
- https://github.com/php/php-src/commit/5a361c3a54c055cdf7088e76aa8efa159334e096
- [7.3~]
- [base64_encode()](http://php.net/manual/ja/function.base64-encode.php) / [base64_decode()](http://php.net/manual/ja/function.base64-decode.php) が esx -> OpenStack -> Windows 2012R2 のように VM をネストした環境等で失敗する問題の修正
- AVX2 が利用できない環境の筈なのに AVX2 命令を使うコードを起動しようとしてしまう
- CPUID の利用方法に誤りがあり、利用できる最大の機能レベルが 7 未満（AVX2 使用不能）の際に CPUID 
を 7 で呼ぶのをやめた
WSL UbuntuにElasticsearch6.5.4とKibana6.5.4のインストール

Qiitaの記事を読んで学習していこうと思ったので，環境設定をした．
元になったQiita記事はこちら．

- [はじめての Elasticsearch](https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329)

# Javaのインストール

そもそもJavaがWSLにインストールされていなかったので，最初は**openjdk-9-jdk-headless**を試した． しかしWindows側のJavaと干渉しているのか，**Invalid decorator 'utctime'**のエラーを吐いた．ネット上を見ていると，どうもJavaのバージョンが悪いみたいな話なので，直接新しいバージョンを入れた．

ここからGAリリース版をダウンロード

- [JDK 10 General-Availability Release](https://jdk.java.net/10/)

以下の手順でUbuntuに登録

```bash
tar xzvf openjdk-10.0.2_linux-x64_bin.tar.gz
sudo mv jdk-10.0.2 /usr/local/lib
sudo update-alternatives --install /usr/bin/javac javac /usr/local/lib/jdk-10.0.2/bin/java 10
sudo update-alternatives --install /usr/bin/java java /usr/local/lib/jdk-10.0.2/bin/java 10

# /usr/local/lib/jdk-10.0.2/以下のjavac/javaを利用
sudo update-alternatives --config javac
sudo update-alternatives --config java
```

# Elasticsearchのインストール

適当なパスにダウンロードして解凍して実行した

```bash
cd ~/
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.tar.gz
tar xzvf elasticsearch-6.5.4.tar.gz
cd elasticsearc-6.5.4/bin
./elasticsearch
```

いろいろ出力されるけど，しばらく待ってlocalhost:9200にアクセスすると次の出力を得た

```json
{
  "name" : "lhCgaXq",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "q4E2WvKuSbaS1uWCWsmqMg",
  "version" : {
    "number" : "6.5.4",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "d2ef93d",
    "build_date" : "2018-12-17T21:17:40.758843Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
```

一度再起動した

# Kibanaのインストール

Elasticsearchと似た感じでダウンロードして展開する．WSLを2つ開いて，Elasticsearchを起動した状態にしておくことを忘れない．再起動なしで実行すると上手く起動しなくて積んだけど，再起動したら上手く動いた．プロセスの関係かもしれない（未確認）．

```bash
cd ~/
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.4-linux-x86_64.tar.gz
tar xzvf kibana-6.5.4-linux-x86_64.tar.gz
cd kibana-6.5.4-linux-x86_64
./bin/kibana
```

ダッシュボードの画面

![kibana.png](https://qiita-image-store.s3.amazonaws.com/0/7181/0bc6d863-a753-e6fc-7ca7-ccd5a4d88447.png)


# Next

引き続きやっていく
今日の変更点: BashをVimモードに。VimでRedo、テンプレート

# 今日の変更点 #

* BashをVimモードに
* VimでRedo
* Vimでテンプレート呼び出し

## BashをVimモードに ##

```sh
set -o vi
```

便利だと思ったのはノーマルモード(コマンドモード)で`v`を押すとVimが立ち上がること。
そのまま(単行だろうが複数行だろうが)コマンドラインで実行したい内容を書き込んで`ZZ`などで閉じると実行される。

## VimでRedo ##

```vim
Ctrl+r
```
これ、なぜか忘れがちなのでこの機会にメモを残します。

## Vimでテンプレート呼び出し ##

Vimがファイル名と関連付けたテンプレートを新規作成時に呼び出してくれる。

自分が用意したテンプレートを参考までに載せます。

~/Templates/python.py

```py

# -*- coding: utf-8 -*-
#

import sys

def main():
    pass

if __name__=='__main__':
    main()
```

~/Templates/shell.sh

```sh
#! /bin/bash
# Fail on unset variables and command errors
set -ue -o pipefail
# all alias clear
unalias -a
```

上記を準備した上で下記の設定を`~/.vimrc`に書きます。
(自分がNeoVimを使っているので`~/.config/nvim/init.vim`を変更しました。)

```vim

" https://qiita.com/Pseudonym/items/2cb442ff257a2f9f9d70
" 拡張子に関連付けてテンプレートを開く
autocmd BufNewFile *.sh 0r ~/Templates/shell.sh
autocmd BufNewFile *.py 0r ~/Templates/python.py

```

## 参考 ##

[vim色に染まれ．機能紹介のついでにbashをvi仕様に．](https://qiita.com/Pseudonym/items/2cb442ff257a2f9f9d70)

[Vim のすゝめ 第5回 アンドゥを極める ](https://www.soum.co.jp/misc/vim-no-susume/5/)
Firefoxの独自ビルドカスタムビルドを行う方法

①下記の手順で一旦ArtificialBuildを生成してFirefox自体が動作することを確認する

https://developer.mozilla.org/ja/docs/Mozilla/Developer_Guide/Build_Documentation/Windows_Build_Prerequisites

②mozconfigに下記を入れる

```
export MOZ_APP_BASENAME=Mybrowser
export MOZ_APP_VENDOR=Myvendor
```

③mozconfigから下記を削除する

```
# Automatically download and use compiled C++ components:
ac_add_options --enable-artifact-builds
```

④browser/confvars.shに下記を入れる。

```
export MOZ_APP_BASENAME=Mybrowser
export MOZ_APP_VENDOR=Myvendor
```


⑤非ArtificalBuild用にコンフィグ

```
./mach bootstrap （今度は非ArtificialBuild二番を選択する）
```

⑥ビルドする

```
./mach build （ビルドに一、二時間かかる）
```

⑦起動を確認する

```
./mach run
```

この段階ではtmpのプロファイルを使用しているので、自分の独自ビルドのプロファイルを使うようにする。
（あらかじめ上記でヘルプ→トラブルシューティングでmyprofileを生成しておく)


⑧myprofileで起動

```
./mach run -P myprofile
```

⑨下記にプロファイルが生成されていることを確認する。

```
C:\Users\＜ユーザ名＞\AppData\Roaming\MyVendor\MyBrowser\Profiles\vkghx6h0.myprofile
```

お疲れさまでした。
Ubuntu 18.04 Debian 9.x 'gnome network windows 共有' の動作修正。

Ubuntu 18.04とDebian 9.x のgnomeのwindows共有が動作しなかったので修正しました。

問題点：
gnome−flashbackの「場所」から、「ネットワーク」を開き、
ファイルの共有をしようとしても、開かない。フォルダが空の状態になる。

解決：
①/etc/samba/smb.conf の、[global]の下のworkgroupの指定の下辺りに、

```
client max protocol = NT1
```
と入れる。
②sambaサービスの再起動、もしくはパソコンの再起動をする。

各々のパソコンに、すると良い。
boost::interprocess::message_queueを使ってプロセス間通信

#はじめに

message_queueを使うと、別プロセス間（それぞれ別に起動している異なるアプリ間など）で簡単に通信をすることができます。

#準備
送受信するデータ構造を定義しておきます。

```C++:データ構造の定義
struct Data {
 .....
};
```
なんでもいいです。ただし、送受信側両方で知っておく必要があります。

#受信

受信用キューを作成します。

```C++:キュー作成
// キュー作成。識別用として、固有のキーを指定します
boost::interprocess::message_queue msgq( boost::interprocess::create_only, "UNIQUE_KEY_HOGEHOGE", max_msg_num, sizeof(Data) );

```

受信をします

```C++:受信

Data message;
uint64_t recv_size;
unsigned priority;
msgq.receive( &message, sizeof(Data), recv_size, priority );

```

タイムアウト付き受信もあります

```C++:タイムアウト付き受信

// タイムアウト「時刻」を指定するようです
boost::posix_time::ptime timeout = boost::posix_time::microsec_clock::universal_time() + boost::posix_time::milliseconds( 100 ); // 今から100ms後

if ( msgq.timed_receive( &message, sizeof(Data), recv_size, priority, timeout ) ) {
  // 受信成功
} else {
  // タイムアウト
}

```

#送信

次は送信です。

```C++:キュー作成
boost::interprocess::message_queue msgq( boost::interprocess::open_only, "UNIQUE_KEY_HOGEHOGE" );

```

```C++:送信
Data data
data.xxx = xxxxx;
..

msgq.send( &data, sizeof(Data), 0 );

```

受信と同様にタイムアウト付きのtimed_sendなどもあります。

#おわりに

送信も受信も、失敗すると例外を投げてくるので、実際はtry～catchを使ってエラー処理します。

クライアント・サーバー型で送受信する場合の例ですが、
例えばサーバー側では公開した固有のキーで受信待ちループを回しておき
クライアントは、そのキーめがけて送信します。このとき、送信データの中にクライアント自身が生成した受信用固有キーを入れておきます。
サーバーは受信後、その受信用固有キーに対して返信する、という方法で１対多の接続をさばくことができます。

以上、boost::interprocess::message_queueの基本的な使い方をご紹介しました。
cloud9でテキストエディタがブラウザに反映されなくなった時

#cloud９が急に反映されなくなる
cloud９のエディタが急にブラウザに反応されずコードを書いても無反映となりました。そこで以下を試しました
・PUMA（rails）を止めて再起動
・プロジェクトを消して再作成（githubからクローン）
・PCの再起動
・AWSをログアウトして再ログイン

以上をやりましたが直りませんでしたが、以下の方法で解決？できました
・Workspaceを作り直す

原因は解明できませんでしたがcloud９で再度Workspaceを作って作成したところまたちゃんと反映されるようになりました。もし同じ状況で困っている方や原因がわかる方いればコメントで教えて頂けると幸いです。
Twitchで #2000 エラーが出たときに自動復帰するユーザースクリプト

Twitchをライブ視聴中に
**Twitchマシンのコンセントが抜けてしまったようです。しばらく経ってから再度お試しください。 (エラーコード #2000)**
というエラーが出たときに再生ボタンを押してすぐに再接続するスクリプトです。

# 動作検証環境

* Firefox 64
* Tampermonkey v4.8.5849
* Twitch非ログイン状態

# コード

(gist連携消えたんでしたっけ)

```js
// ==UserScript==
// @name         Twitch replay with 2000 error
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  #2000 エラーが出たときに再生ボタンをクリックする
// @author       khsk
// @match        https://www.twitch.tv/*
// @grant        none
// ==/UserScript==

(function() {
  'use strict';
  // まずはメイン画面のロード完了を待つ
  const mo = new MutationObserver((data1, data2) => {
    const videoPlayer = document.querySelector('.video-player')
    if (videoPlayer) {
      errorWatcher()
      mo.disconnect();
      return
    }
  })
  mo.observe(document.body, {
    childList: true, subtree: true
  });



  // ビデオ監視処理定義
  const errorWatcher = () => {
    const errorMessage = 'Twitchマシンのコンセントが抜けてしまったようです。しばらく経ってから再度お試しください。 (エラーコード #2000)'

    // 検知クリックによる変更検知無限ループを防ぐためのフラグ。筋が悪い後から追加の場当たり処理
    let isCallbackClicked = false

    const videoPlayer = document.querySelector('.video-player')
    if (!videoPlayer) {
      console.log('no player')
      return
    }

    const mo = new MutationObserver((data1, data2) => {
      const message = document.querySelector('.video-player__container .pl-error p')
      if (!message) {
        isCallbackClicked = false
        return
      }

      if (message.textContent != errorMessage) {
        isCallbackClicked = false
        return
      }

      if (isCallbackClicked) {
        return
      }
      document.querySelector('.qa-pause-play-button').click()
      isCallbackClicked = true
      console.log('再再生しました')
    });

    const options = {childList: true, subtree:true};
    mo.observe(videoPlayer, options);
    console.log('監視開始')
  }
  })();
```
[Rails] options_for_selectのデフォルト値(selected)を設定

##options_for_select ヘルパーで規定値(selectedの値)を設定したい時は次のようにする

```rb
# 女性をデフォルトにする場合
options_select_for({"male" => 1, "female" => 2}, 2)
# hashで明示的にする場合は
options_select_for({"male" => 1, "female" => 2}, :selected => 2)
```
カメラを止めるな！迷わず試した方が速い。おそらくセキュアなアプリなら説明書を読むよりも。

Do not fear install secured app and be KID in playground! Device Software Life Hacking  

# e.g Markdown editor Chrome Google Trying

I wanted to in Formal input  area Comfortable markdown editting

Found this chrome extension by googling

![image](https://user-images.githubusercontent.com/13635059/50667094-17157180-0ffb-11e9-99a9-a3b801058275.png)

immediately installing before i understand "What is this".

![image](https://user-images.githubusercontent.com/13635059/50667113-33191300-0ffb-11e9-8f38-3c0428c931ec.png)

this is not match to my hope but...

# Good points

- Super high speed not cost you much
- You can get app you did not hope before but it maybe will be other tipis or good ideas Serendipity
- not security is the biggest reason you fear install or download yes that reason is "Anti New Challenge" cell act.

# Be Kid!

- but warning e.g Android app or Windows software sometime dangerous
- In probably safety ground you can play like a kid


# カメラを止めるな！迷わず試した方が速い。おそらくセキュアなアプリなら説明書を読むよりも。


---

https://twitter.com/yumainaura

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


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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Swiftのステップ数を"cloc"で算出する

Swiftで作ったiOSアプリのステップ数（ラインカウント）を算出したくて、少し調べてみました。

[cloc](https://github.com/AlDanial/cloc)というOSSが使い勝手が良かったのでレポートします。

| 環境 | バージョン |
|:--|:--|
| macOS | High Sierra 10.13.6 |
| Swift | 4.2 |

# 算出結果のサンプル

```sh
$ cloc プロジェクトのpath
      61 text files.
      59 unique files.                              
      23 files ignored.

github.com/AlDanial/cloc v 1.70  T=2.20 s (17.7 files/s, 1203.8 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Swift                           29            404            281           1427
JSON                             9              0              0            510
Markdown                         1              9              0             15
-------------------------------------------------------------------------------
SUM:                            39            413            281           1952
-------------------------------------------------------------------------------
```

# 留意点

GitHubの[README](https://github.com/AlDanial/cloc)に以下のように記載されています。

>cloc counts blank lines, comment lines, and physical lines of source code

physical lines of source code ＝ 物理行数とは、コードの論理的な解釈を行わないということです。
例えば、以下のように一行に2つの文を書いている場合、1行とカウントされます。

```swift
print("foo"); print("bar")
```

# 使い方

インストールも、基本的な使い方も、至ってシンプルです。
[Homebrew](https://brew.sh/index_ja)がインストールされている前提です。

ターミナルで、
1) `brew install cloc`でインストール。
2) `cloc プロジェクトのpath`でカウント実行。

オプション指定によって以下のようなこともできます。

- gitのコミット間で追加/修正/削除ステップ数を算出できたり
- 結果をファイルに出力したり
- 対象にフィルタをかけたり
 
オプションはたくさんあって紹介し切れないので、詳細は[README](https://github.com/AlDanial/cloc#options-)か、`cloc --help`で参照してください。

# その他の情報

clocは[WindowsやLinuxでも使える](https://github.com/AlDanial/cloc#install-via-package-manager)とのことですし、[たくさんの言語に対応している](https://github.com/AlDanial/cloc#recognized-languages-)とのことなので、入れておいて損はなさそうです。
Mac book 2018を買って本当に良かったこと！大量アウトプット爆速学習

Mac book 2018を買って本当に良かったこと！大量アウトプット爆速学習

- 軽くなった、これが最強、思いと肉体物理的移動が遅くなったり、realworldでのハンディを背負わされるので
- type-c充電になった！これでケーブルの数を減らせそう、ちなみに充電アダプタも軽くなった
- タッチパッドめちゃくちゃ良好！手足に近い感覚でするすると動く
- バタフライキーボード良好！薄いのでかなり不安だったけど今までよりも爆速でインプットできる
- SpotLight検索便利だなと思ってDocを消した！2018モデルは関係ないけど、設定無効にしていたのが機種移行で有効化されて気づいた
- Alfredはやっぱり最高！2018 Mac OS Mojave でも使えた！ これなくしては生きることさえできぬ Accecivility で Alfred を有効にするのが抜けてて2時間さまよった価値はある‥
- 指紋認証！！！！lこれが欲しかった理由の30%ぐらい。何より感覚的コストが低いのが良い。もうパスワードは打ち込んでいられない。といいつつ今日もパスワードを打っていたような気もする…。
- 新しい興奮感！これは3日も続かないだろうけれど、他の人より進んだモデルを持っている、新しいものを触れいるexcitedな感覚がある。
- とにかくキーボードを叩く音が心地よい！たぶん耳から入ってくる音も自分の自律神経の何かを変えてくれる気がする。生産性アップ。心地よさは生産性の味方である。大いなる。

---

https://twitter.com/yumainaura

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



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


[Google Translate](https://translate.google.com/translate?hl=en&sl=ja&tl=en&u=https%3A%2F%2Fgithub.com%2FYumaInaura%2FYumaInaura%2Fissues%2F218&sandbox=1)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
1日100本アウトプットするITエンジニアのトライアル、現時点のまとめ

1日100本アウトプットするITエンジニアのトライアル、現時点のまとめ

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

# Important

- とにかくベスト設定を探す、Google IME Google Chrome MAc Settings ストレスがなくなるのが良い方向
- とにかく迷わない、迷うということはどちらでも良いということなので、先に思いついた方を採用する、顔文字の種類一個にしてもそうだ
- とにかく戻らない、バックスペースを極力押さない、多少のタイポや間違いは許容する、意味は伝わればok意味ってやつは

# Mental and Body

- マインドフルネスの技術を活用して平常心を保つ、呼吸を最適に保つ
- デバイスやソフトウェア側でのハックが難しい場合は自分の肉体動作をハックする
- 食事時間を極力削って、なおかつ健康を保ちたい、コンビニおでんをほぐして食べるのはgood

# Soldier device 

- 最強のリュックサック装備を揃えて、その中を毎日リファクタリングする、試行錯誤の連続なので個体させない
- iPhone 二個、ipad mini 、スマホリングをつけるなど、完全武装兵士になるため毎日いろいろとショッピングしたり、リファクタリングの連続
- 新しいデバイスを買う、実はこれが最強、MacBookAir2018に買い換えてからまたアウトプット効率が1.3倍ぐらいになった気がする、キーボードを叩くのも心地よい


---

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 -->
Bundler 2 系を使ったアプリを Heroku にデプロイする (You must use Bundler 2 or greater with this lockfile. (Bundler::LockfileError))

## 更新
現在は公式で Bundler 2 に対応しているので、本記事の内容は古くなっています。
デフォルトの Buildpack に戻すには下記が参考になります。

[heroku] bundler 2.0+ をつかえるようにbuildpackをカスタムしていてpushが弾かれた話 - Qiita
https://qiita.com/hirocueki2/items/4da0ff2f6e8d2f8002c3

## 古い内容

Heroku の公式の Ruby buildpack では Bundler のバージョンが 1.15 なので、Bundler 2 で作成した Gemfile は現時点ではビルドに失敗してしまう。

Heroku が公式に対応するまでの間に Heroku で Bundler 2 を使いたい場合は、Bundler チームが作成した [bundler/heroku-buildpack-bundler2] を利用することができる [^3]。

ただし、これは Heroku が公式にサポートする buildpack ではなく、Bundler チームからのサポートも限られているため、production で使用するには事前にテストすることが強く推奨されている [^2]。

```
# Buildpack を入れ替える
heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2.git

# 次回デプロイ以降 Bundler 2 が利用される
git push heroku master
```

[bundler/heroku-buildpack-bundler2]: https://github.com/bundler/heroku-buildpack-bundler2
[^1]: [Bundler Version | Heroku Dev Center](https://devcenter.heroku.com/articles/bundler-version)
[^2]: https://github.com/bundler/heroku-buildpack-bundler2/blob/master/README.md#important
[^3]: https://bundler.io/v2.0/guides/bundler_2_upgrade.html#will-heroku-have-bundler-2
Ubuntu sudo をパスワード無しで実行できるようにする。

sudoの時、パスワード入力を省略する方法。

/etc/sudoers.d/   に、以下のようなファイルを作る（一行）ファイル名はユーザーの名前(user)が良い。

```user
user ALL=(ALL) NOPASSWD:ALL
```
ターミナルに雨が降るまで後何秒か表示させた話

## 成果物
https://gist.github.com/Goryudyuma/e9b856366c457799d0a4c0c71ced54ff#file-zshrc

<img width="572" alt="スクリーンショット 2019-01-04 5.58.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/67255/5188c7d3-466f-c9cb-ae0d-4696e20c5a2b.png">
雨が降りそうになると、
<img width="572" alt="スクリーンショット 2019-01-04 6.03.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/67255/b31e3d7c-5a26-2c27-fe62-be387ea579ee.png">

なんとなく便利そうって感じてくれたら、読んでってください。

## 使い方

今回、天気のAPIに、Yahoo!Japan様のものを用いているので、

https://developer.yahoo.co.jp/start/

これを読んで登録する。
アプリケーションの種類は「クライアントサイド」で。
<img width="964" alt="スクリーンショット 2019-01-04 6.19.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/67255/4e98cd14-0705-0405-9415-e8f7ee62b89b.png">

次に、知りたい地点の座標を出す。
「Yahoo!地図」でも「Googleマップ」でも、URLに座標情報が入っているので、適当に取り出してやる。

その後、[gistのコード](https://gist.github.com/Goryudyuma/e9b856366c457799d0a4c0c71ced54ff#file-zshrc)を.zshrcに貼って、APIクライアントIDと座標を入れて、`RPROMPT`なりを調整してあげれば完成する。

## やってること

指定座標で、今から1時間後まで、5分間隔で、どのくらい雨が降るのかを予測取得するAPIを使っている
そこから、今から一時間後までに雨が降るかどうかを調べ、降るならそれは何秒後なのかを計算しています。

APIはとりあえず1分おきに叩いていますが、お好みで調整してください。

## 作ったきっかけ

世の中の天気予報は難しすぎるから。
毎日毎朝天気予報を確認して、雨に逢わないように避けるのは至難の技。
こうやってターミナルで、あと何秒後に雨が降るのか教えてくれた方が、直感的でわかりやすい。

## なんか技術的なメモ

- `RPROMPT`のなかに絵文字を入れていると、次に`zle reset-prompt`が走るまで少しズレる。絵文字で天気出した方がわかりやすそうだったんだけどなあ。
- ShellScript初心者なので、直した方が良いポイントなどがあれば教えて欲しいです。
    - 無理やりやった感が・・・

## 最後に

- Yahoo様、便利なAPIをありがとうございます。
- 今晩は日本は全国的に雨は降ってませんでした。なのでデバッグにものすごく苦労しました。唯一少し降っていた新潟県の座標でデバッグしました。
- 変数名とか、全然考えずに作ったので、色々と酷いですね。
- 「とある魔術の禁書目録」の中で、"あと何秒後に雨が降ります"的なことが飛行船かなんかが放送してるシーン、ありませんでしたっけ？少しは近づけたかな？
- シェルスクリプト難しい・・・
pythonで1スレッドで流してるつもりなのにcpu使用率が100%になっている時の対処法

# はまった状況
複数コアで並列計算をやろうとしたら全然速くならない。試しに並列数を1にして流すとcpuが100%使われていた。

# 解決策
どうやらnumpyが並列計算で全スレッド使っているらしい。
numpyやscipyをimportする前に使えるスレッド数を制限すれば解決する。

```test.py
import os
os.environ["OMP_NUM_THREADS"] = "1"
```
私の場合、importしたモジュールにnumpyを使っていたが、メインモジュールに書くだけで良いらしい。
参考：https://github.com/numpy/numpy/issues/11826
matplotlib でグラフと表を合わせて表示する方法（質問付きです→解決済）

Matplotlibでグラフと表を合わせて表示させようとすると、以下のように一部文字が重なってしまいます。いい方法がございましたら、教えてください。

######Pandasとmatplotlibをインポート

```ruby:test.ipynb
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
```
######グラフと表の元データ
```ruby:test.ipynb
name=["1","2","3","4","5","6","7","8","9","10"]
value=[[-0.49409999999999998],
 [-0.48880000000000001],
 [-0.49059999999999998],
 [-0.4879],
 [-0.48899999999999999],
 [-0.48770000000000002],
 [-0.48859999999999998],
 [-0.48720000000000002],
 [-0.4879],
 [-0.48630000000000001]]
```
######グラフと表の表示
```ruby:test.ipynb
plt.figure()
plt.title("TEST")
plt.scatter(name, value)
plt.xlim(None)
plt.ylim(-1.0,0.0)
plt.table(cellText=value,
          rowLabels=name,
          loc="bottom")
```
######結果
![test_graph.png](https://qiita-image-store.s3.amazonaws.com/0/319484/9e4a63cd-908b-4aaa-b785-c2882d8dfb64.png)
X軸と表が一部重なってしまいました。。。
この重なりを解消する方法をご存じの方いらっしゃいましたら、教えてください。
よろしくお願いします。
来そうで来ない言語・来なかった言語


　
個人的にはいいと思ったんだけど訳あって消えた天才を偲ぶ的な、
若しくは実力はあるんだけど今の所あんまり流行ってない言語を推していく的な記事です。
どれがどっちとははっきり言いません。

# D

ポストC++として2001年にWalter Brightによって設計された。
関数型プログラミングをサポートしていたり、UFCS(Unified Function Call Syntax)を採用していたり、
某Go言語然りなんか違うマスコットキャラがいたりと十分に人気爆発しそうな雰囲気を漂わせていたが
、ver1.0までモタモタしているうちにライバルのC++などに機能を次々と模倣され、優位性を失ってしまった。

```d:UFCSについて
foo(bar(a))
// が
a.bar().foo()
/* として呼び出せる。割と最近の言語で見かけるが多分Dがオリジナル。
   メソッドチェーン的なのがしやすくて気持ちがいいが、
   クラスにメソッド(っぽいの)が後付けできてしまう。
   クラスを採用していない最近の言語と相性がいい。*/
```

# Dart

いわゆるAltJS。2011年に公開。Googleに梯子を外されたとかひどい言われようであるが
決して悪い言語ではない。TypeScriptに駆逐されたかに見えたが、Flutterがあるのでネイティブアプリ分野で生き残るかもしれない。

# Pike

超マイナー。AltJSでもないくせに静的なスクリプト言語。1994年製。
importしなくても多数のメソッドが使えたり
変数を宣言しただけで使うと0(stringでも)になったりbool型がなかったり
色々よく分からないコンセプトだったせいか流行らなかった。
目の付け所は良かったんですが。

```cpp
/* スクリプト言語のくせに構文が基本的にC/C++なのもいただけない。
   シンタックスハイライトも対応してないのでC++だし。
   (ただ流石にこの例はC++に寄せすぎた感じもある。) */
class animal
{
  string name;
  float weight;

  void create(string n, float w)
  {
    name = n;
    weight = w;
  }

  void eat(string food)
  {
    write(name + " eats some " + food + ".\n");
    weight += 0.5;
  }
}
```

```cpp
// mixed型を利用すると動的型付け言語っぽくなる。
mixed a;
a = 1;
a = 1.0;
a = "1";
```

# Crystal

もしかしたら来ているのかもしれないRuby似のコンパイラ言語(らしい)。2014年製。
速いらしいので使ってみたいが、使う機会がない。

# F# 

Microsoftが開発した永遠の次世代言語。2005年製。
関数型対応、.NET言語、C#を呼べるなど三拍子揃った素晴らしい言語だったが、
ポテンシャルの割に主要言語の地位に食い込めていない気がする。
Microsoftは言語を作りすぎたのかもしれない。

# Hack

Facebook謹製の改良型PHP。2014年製。
Null安全だったり型アノーテーションが付いていたりする。
PHP界のTypeScriptを目指そうとしたのかも分からないが少なくとも日本ではあまり流行っているという噂は聞かない。
~~そもそも何故FBはPHPにこだわった感がある。~~
私はPHPそんなに嫌いではないですけどね。

# Nim

Python風味のD言語といった雰囲気だが、機能はこちらの方が豊富でモダンなイメージがある(実際そうかはDあんまり使ってないので分かりません。すいません)。2008年製。マクロが非常に強力であり、メタプログラミングが楽しい。
RustやGoに押されて埋もれている感があるが、どこぞの有名IT企業がこいつを開発して発表していたらいい勝負をしていたかもしれない。設計思想的にないと思うけど。

```nim
stdout.writeLine("aaa")
# は
stdout.write_line("aaa")
stdout.write_line "aaa"
stdout.write_line"aaa"
s_t_d_o_u_t.w_r_i_t_e_l_i_n_e "aaa"
writeLine(stdout, "aaa")
# と同じになる。なかなか融通が効くけど混乱の元では？
```

# Zig

アンドリュー・ケリーによって設計されたシステムプログラミング言語。2015年製。
importやtypeofが関数で表される、無名構造体が作れる、型を値として操作できるなど、Go, Rustよりも強い式志向の香りがする。

```zig
const std = @import("std");

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();
    try stdout.print("Hello, {s}!\n", .{"world"});

    var a: i8 = 12;
    var b: i16 = 34;
    var c = a + b;
    try expect(c == 46);
    try expect(@TypeOf(c) == i16);
}
```

興味深い点として、ジェネリクスがコンパイル時引数を持つ関数（`LinkedList`は[単項カインド](https://en.wikipedia.org/wiki/Kind_(type_theory)) に相当?）で表現される。

```zig
fn LinkedList(comptime T: type) type {
    return struct {
        pub const Node = struct {
            prev: ?*Node,
            next: ?*Node,
            data: T,
        };

        first: ?*Node,
        last:  ?*Node,
        len:   usize,
    };
}
```

# Ceylon

Red Hatが開発したいわゆるJVM言語。2011年製。ScalaよりもJavaに近く簡潔な言語仕様でJavaを抹殺しにかかろうとしたようだが、実態としては薄味のJavaみたいな感じであり、まあわざわざJavaから乗り換えようとした人は少なかったのであろう、あまり流行らなかった。
WSL上でDockerを動かす際に躓いたこと

# 追記（2020/08/24）
皆様、LGMTやストックありがとうございます。
最近こちらの記事を見てくださる方が増えていらっしゃるので念の為追記いたしますが、こちらの記事は<span style="color: red; ">WSL1</span>を対象とした記事になります。
WSL2では挙動が変わっている可能性がございますのでご注意ください。:bow:

# 概要
初投稿です。
拙い部分はご容赦を

今までDockerを動かす際は、仮想マシン上やDocker for Windowsを利用していたのですが、LinuxネイティブのでDockerに移行することにした。
その際に躓いたことをまとめる。


# とりあえずインストール
まずは以下の記事を参考にWSLにDockerをインストールしていく。
ここまではとっても簡単でインストールは終了。

参考：[WSL上でDocker Engineが動くようになっていたっぽいという話](https://qiita.com/yanoshi/items/dcecbf117d9cbd14af87)

# Docker Daemonを起動
先程紹介した記事を参考にDaemonを起動

```
$ sudo cgroupfs-mount
$ sudo service docker start
 * Docker is running
```
よしよし起動したなと思ったのですがここで問題が

そのままの流れでhello-worldを表示してみると

```
$ sudo docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
```
なぜかデーモンが起動していない

そこでstatusをチェックする

```
$ sudo service docker status
 * Docker is not running
```

起動していないぞ？
ここから何度も`sudo service docker start`を叩いても起動せず困った。

# 原因

**Docker for WindowsをWSLから呼び出せるようにしていたため**
まず、自分はもともとDocker for WindowsをWSLから呼び出して使っていた。
どうやらその辺りの設定が悪さをしていたようだ。

もともとのDockerの環境構築方法はこちら
（こちらの環境でも特に不便はしていませんでしたが、個人的な趣味で移行を始めた次第です）
参考：[Docker for Windowsで快適な環境を得るまでの そこそこ長い闘い](https://qiita.com/YukiMiyatake/items/73c7d6c4f2c9739ebe60)

Docker for Windowsの`Expose daemon on tcp://localhost:2375 without TLS`のチェックを外す必要があった。
すると無事、Docker Daemonの起動に成功した。

# まとめ
もし、似たような状態の方の助けになれば幸いです。

また、引用させていただいた2つの記事はWSLでDockerライフを送るためにはどちらも良い記事だと思います。
これらの記事を読んで、もっとWSLが普及するといいな
共通の項目はprotocolで制約を付ける の手順

### はじめに
[1.共通するものを見つける](#1-共通するものを見つける)
[2.protocol内に共通部分を書き出す](#2-protocol内に共通部分を書き出す)
[3.制約を与える](#3-制約を与える)
のポイントを押さえます。

### 「家族が自己紹介する」のテンプレートを作る
1.🙋‍♂️ < 父です。50才です。
2.💁‍♀️ < 母です。48才です。
3.🐕 < ペットです。1才の雑種犬です。

##1. 共通するものを見つける
自己紹介文に共通するワードとして下の２点を見つけました。
また、各自に喋ってもらうので「話す」という共通点もあります。

- 続柄 `relationship`
- 年齢 `age` 
- 話す`func speak()`

##2. protocol内に共通部分を書き出す
Family という名前のprotocolの中に、全員の共通部分を書き出します。

``` swift
protocol Family {
    var relationship: String { get }
    var age: Int { get }
    func speak() -> String
}
```

##3. 制約を与える
#### `Person`作成
父と母は人なので Personという名前で構造体を作成します。

``` swift
struct Person: Family {
    }
}
```
作成した`protocol Family`の内容が必ず守られるよう、構造体名のあとに`: Family` を付けます。
が、すぐに下記のエラーが出ます。
`Type 'Person' does not conform to protocol 'Family'
Do you want to add protocol stubs? [Fix]`
Familyで書き出した共通部分の宣言がないためです。エラーのFixボタンを押すとXcodeが足りない宣言を補完してくれます。

補完して、`func speak()` に定型文を入れます。

``` swift
struct Person: Family {
    var relationship: String
    var age: Int
    func speak() -> String {
        return "\(relationship)です。\(age)歳です。"
    }
}
```

#### `Pet`作成
`Person`と同じ流れでペット用の`Pet`という構造体を作成します。

``` swift
struct Pet: Family {
    var relationship
    var age: Int
    var kind: String  // 犬 or 猫 or うさぎ …
    func speak() -> String {
        return “\(relationship)です。\(age)歳の\(kind)です。”
    }
}
```
`Person`と違う点は、
何の動物かわかるように`kind`という項目を増やしたことです。

## 各自に喋らせる

``` swift
print("🙋‍♂️\(Person(relationship: "父", age: 50).speak())")
print("💁‍♀️\(Person(relationship: "母", age: 48).speak())")
print("🐕\(Pet(relationship: "ペット", age: 1, kind: "雑種犬").speak())")

// 🙋‍♂️父です。50歳です。
// 💁‍♀️母です。48歳です。
// 🐕ペットです。1歳の雑種犬です。
```

### 参考
[Swift では Protocol を積極的に使おう
](https://qiita.com/mokumoku/items/2744c68fdb4bb53d0376)
Moodle Form API - date_selector

Moodle Form APIのdate_selectorで初期値設定どうやるの？？？:worried:って一瞬なったのでdate_selectorまわりのメモ。

# コード

`moodleform::setDefault`の第2引数にタイムスタンプ入れると任意の日付を初期値にできます。


```:ファイルの配置
plugintype/
　└ pluginname/
　 　│ classes/
　 　│　└ form/
　 　│　 　└ my_form.php
　 　└ view.php
```

```PHP:my_form.php
<?php

namespace plugintype_pluginname\form;

require_once($CFG->libdir . '/formslib.php');

class my_form extends \moodleform {
    public function definition() {
        $mform = $this->_form;

        list($year, $month, $day) = [2018, 10, 31];
        $mform->addElement('date_selector', 'date_selector_1', 'Label1');
        $mform->setDefault('date_selector_1', make_timestamp($year, $month, $day));
        $mform->addElement('date_selector', 'date_selector_2', 'Label2');
    }
}

```

# 表示例

初期値を指定しなかった場合、ページを開いた日(語弊あるかも？)が入ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/169093/d5bf8464-a9c7-e243-e8ff-d83dacf84442.png)
C言語とC#で剰余演算対比

主に浮動小数点数型での剰余演算の対比表。

## int
| C     | C#(.Net)      |
| ----- | ------------- |
| `div` | `Math.DivRem` |

## double
| C            | C#(.Net)                                                                                        |
| ------------ | ----------------------------------------------------------------------------------------------- |
| `operator /` | `operator /`                                                                                    |
| `fmod`       | `operator %`                                                                                    |
| `remainder`  | `Math.IEEERemainder`                                                                            |
| `modf`       | `static double modf(double x, out double intptr) { intptr = Math.Truncate(x); return x % 1f; }` |

## float
| C            | C#(.Net)                                                                                       |
| ------------ | ---------------------------------------------------------------------------------------------- |
| `operator /` | `operator /`                                                                                   |
| `fmodf`      | `operator %`                                                                                   |
| `remainderf` | `MathF.IEEERemainder`                                                                          |
| `modff`      | `static float modff(float x, out float intptr) { intptr = MathF.Truncate(x); return x % 1f; }` |
メモ：golangでのrequest（cencelあり）

* 忘れがちになる、golangでの外部リクエストの方法についてちょっとメモを残す。
* いくつか方法はある（`http.Get`を使うであるとか）のだが、ここでは外部のAPIへGet/Postでリクエストすることを想定するので、ヘッダの操作なでもする。あと、リクエストタイムアウトなどの要因で応答がある前にキャンセルもしたい。

```golang:main.go
package main

import (
	"context"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/http/httptest"
	"net/url"
	"strings"
	"time"
)

type localClient struct {
	client *http.Client
}

func main() {
	lc := &localClient{}

	// ダミーのmockServerを用意している。実際の処理ではいらない
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		log.Print(r.URL, r.Header, r.Body) // requestの内容を確認するためにログ出力
		time.Sleep(10 * time.Second)	// request cancelを試すためにわざと応答をsleepしている
		fmt.Fprintln(w, "Hello, client")
	}))
	defer ts.Close()

	// context.Backgroundでcontextを生成している
	ctx, cancel := context.WithCancel(context.Background())

	// client側の処理
	lc.client = &http.Client{}

	// request bodyの準備
	values := url.Values{}
	values.Set("token", "testtoken")

	req, err := http.NewRequest(
		http.MethodPost,
		ts.URL, // mockServerへのrequestにしてあるが実際の処理ではちゃんとendpointを書く
		strings.NewReader(values.Encode()),
	)
	if err != nil {
		panic(err)
	}

	req = req.WithContext(ctx)

	// request Headerを指定
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

	// response受け取り用のchannel
	ch := make(chan []byte)
	var res []byte

	// requestのgoroutine
	go func() {
		resp, err := lc.request(req)
		if err != nil {
			ch <- nil
			return
		}
		ch <- resp
	}()

	// 5秒でcancelしている
	go func() {
		time.Sleep(5 * time.Second)
		cancel()
	}()

	// requestのgoroutineがchannelへデータを入れるまでwaitする
	res = <-ch

	log.Print("response:", string(res))
}

func (lc localClient) request(req *http.Request) ([]byte, error) {
	log.Print("start request")

	resp, err := lc.client.Do(req)
	if err != nil {
		log.Print("error request :", err)
		return nil, err
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Print("error response body")
		return nil, err
	}

	log.Print("end request")

	return body, nil
}
```
- ざっと書いてはみたが、ちょっとcencelの方法に疑問が残るので、もう少し調べて修正するかも。
gitでPermission denied (publickey)と言われた時の解決法

`npm　install`でローカルのモジュールをインストールしたいときにこんなエラーが出た

`/usr/bin/git ls-remote -h -t ssh://git@github.com/hoge.git`

```
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

exited with error code: 128
exit [ 1, true ]
```

`ssh-add ~/.ssh/id_rsa`

でいけた。
Amazon Echo Buttonをセットアップ (at LasVegas)

# はじめに
2018/11/26〜2018/11/30、アメリカのラスベガスで開催されましたAWS re:Invent 2018に行ってきました。
そこで「HAC04 Alexa Hack Day」に参加してきました。
IrfanさんとKimlerさんと同じ組でものを作った際にいただいたAmazon Echo Buttonを頂いたので、
早速使ってみたお話です。
ただ、日本ではまだ技適が通ってないので、もし持っていらっしゃる方はアレですね。
ちなみに、その時の映像に一瞬映ってたので、[こちら](https://youtu.be/EbOXY93zgYI)を。

# 前提条件
デバイスとペアリングが必要になるので、ペアリングできるAlexaデバイスを使う必要があります。
ちなみに、僕はEcho Dotしか持ってないので、Echo Dotを利用しました。

# 設定
ほぼほぼ[ココ](https://github.com/alexa/skill-sample-nodejs-buttons-hellobuttons)を見れ実行すればOKでした。
一応、なくなると困るので、手順は一番下の画像を参照してください。

# やりたかったこと
やりたかったのは、Timeoutするまでの間にどれだけの回数ボタンを押せるか。そして、その結果を伝えるというものを作りたかったです。
ただ、サンプルのままだと一度、Echo Buttonを押すと毎度Button情報を教えてくれたり、ボタンを一度押すと回数を数えてくれないので、コードを色々修正しました。　
ここでは一部だけですが、以下を修正しました。

```javascript
  GameEngineInputHandler: {
    canHandle(handlerInput) {
      let { request } = handlerInput.requestEnvelope;
      console.log("main.GameEngineInputHandler: checking if it can handle " + request.type);
      return request.type === 'GameEngine.InputHandlerEvent';
    },
    handle(handlerInput) {
      console.log('Received game event');
      let { attributesManager } = handlerInput;
      let request = handlerInput.requestEnvelope.request;
      const sessionAttributes = attributesManager.getSessionAttributes();

      var gameEngineEvents = request.events || [];
      console.log(gameEngineEvents.length);
      for (var i = 0; i < gameEngineEvents.length; i++) {        
        switch (gameEngineEvents[i].name) {
          case 'button_down_event': {
            sessionAttributes.buttonCount += 1;
            let response = handlerInput.responseBuilder.getResponse();
            return response;
          }
```

# 結果
これでタイムアウトまでの時間の中で、100回ボタンをプッシュしましたが、50%程度までしか回数をカウントできませんでした。
そもそもJavaScriptがあまり得意じゃないので、コードを読み込んではないですが、時間を見つけて改善していければなとおもっています。
無駄に、ボタンをプッシュするスキルが今後公開できればなくらいにおもってます。

# 参考画像（手順）
![skill-sample-nodejs-buttons-hellobuttons.png](https://qiita-image-store.s3.amazonaws.com/0/105220/af67a031-2407-db15-c676-b4139e7b0dda.png)
Scalaでフォルダ圧縮。java.util.zip.ZipOutputStreamを使って。

### やりたいこと
タイトル通りです。メモ用。

```scala
  import java.io._
  import java.nio.charset.Charset
  import java.util.zip.{ZipEntry, ZipOutputStream}

  def main(args: Array[String]): Unit = {
    zipFolder("file\\folder", "file\\folder.zip", "Shift_JIS")
  }

  def zipFolder(targetDir: String, outputZip: String, mojiCode: String): Unit = {
    val baseFile = new File(targetDir)
    val zos = new ZipOutputStream(new FileOutputStream(new File(outputZip)), Charset.forName(mojiCode))
    val fileList: Seq[File] = baseFile.listFiles()
    zipFileList(zos, fileList, baseFile)
    zos.closeEntry()
    zos.close()
  }

  private def zipFileList(zos: ZipOutputStream, fileList: Seq[File], baseFile: File): Unit = {
    for (file <- fileList) {
      if (file.isDirectory) {
        zipFileList(zos, file.listFiles(), baseFile)
      } else {
        entryZos(file, zos, baseFile)
      }
    }
  }

  private def entryZos(targetFile: File, zos: ZipOutputStream, baseFile: File): Unit = {
    val entry = new ZipEntry(targetFile.getAbsolutePath.replace(baseFile.getParentFile.getAbsolutePath, "").drop(1))
    zos.putNextEntry(entry)
    val in = new BufferedInputStream(new FileInputStream(targetFile))
    writeZos(zos, in, targetFile)
    in.close()
  }

  private def writeZos(zos: ZipOutputStream, in: BufferedInputStream, targetFile: File) : Unit = {
    val readBytes = in.read()
    if (readBytes != -1) {
      zos.write(readBytes)
      writeZos(zos, in, targetFile)
    }
  }
```
TyporaとMarkDownのカンタンな使い方 

### 1.Typoraとは？

マークダウン方式の文書を見た目直感的に編集できるエディタ。

[公式サイト](https://typora.io/)

この記事でも詳しく説明されています。

[どうしてみんなMarkdown書くときTypora使わないの?](https://qiita.com/AnchorBlues/items/532dba54cd2f0465af97)



------

### 2.よく使うショートカット

| 見出し1          | 見出し2          | 見出し3             | 見出し4            | 見出し5  |
| ---------------- | ---------------- | ------------------- | ------------------ | -------- |
| Ctrl + 1         | Ctrl + 2         | Ctrl + 3            | Ctrl + 4           | Ctrl + 5 |
| ストロング       | 下線             | 打ち消し線          | コード             |          |
| **Ctrl + B**     | <u>Ctrl + U</u>  | ~~Alt + Shift + 5~~ | `Ctrl + Shift + @` |          |
| 表/テーブル      | コードブロック   | 数式ブロック        | 引用               |          |
| Ctrl + T         | Ctrl + Shift + K | Ctrl + Shift + M    | Ctrl + Shift + Q   |          |
| 順序つきリスト   | 順序なしリスト   | ハイパーリンク      | 画像               |          |
| Ctrl + Shift + [ | Ctrl + Shift + ] | Ctrl + K            | Ctrl + Shift + I   |          |

自分がよく使うショートカット表です。これだけあれば大抵の事はできると思います。

------

### 3.コードブロック

**<u>Ctrl + Shift + K</u>**

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

public class transe_delta : MonoBehaviour {

・・・以下略
```

Ctrl + Shift + K　で薄い色がついたブロックが出来るので、そこでコードをペーストするだけ。

------

### 4.数式ブロック

**<u>Ctrl + Shift + M</u>**
$$
1234+5678-910/01122*3344=???
$$
コードではなくて数式なので数学的な文書を作る時に使うと思われる。

------

### 5.引用

**<u>Ctrl + Shift + Q</u>**

> https://qiita.com/glaciesworkspace/items/dd1e21ba8cb1c2e90b35
>
> # よく見るコードが貼られているアレってどうやんの？
>
> - まず貼りたいソースをクリップボードにコピー
> - 半角で`（バッククォート。「＠」をShiftキー押しながら入力）を3回＋言語指定
> - C#(cs), C++(cpp), css, html, xml, java, javascript, php, perl, python, ruby, sql など
> - 最後`を3回

文書内で引用を活用する場合にもよるのだが、URLは貼るだけでハイパーリンクがかかる。

------

### 6.ソース切り替え

**<u>Ctrl + /</u>**

プレビュー画面←→ソース画面　と切り替えられる。改行や段落などをミスった時に直接ソースを編集する、といった使い方。

------

### 7.Qiita記事作成・編集へのコピペ

<u>*☆☆全選択→コピー→Qiita記事編集画面でペースト☆☆*</u>

つまりただのコピペでイケます。
dockerだけでなんとかするコマンド

## こまんど

git

```bash
docker run -it --rm -v $(pwd):/git bwits/docker-git-alpine
```

docker-compose

```bash
docker run --rm -v $(pwd):/tmp -v /var/run/docker.sock:/var/run/docker.sock -w /tmp docker/compose:1.14.0
```

## aliasはる

```sh
alias git='docker run -it --rm -v $(pwd):/git bwits/docker-git-alpine'
alias dc='docker run --rm -v $(pwd):/tmp -v /var/run/docker.sock:/var/run/docker.sock -w /tmp docker/compose:1.14.0'
```
Command PhaseScriptExecution failed with a nonzero exit codeとの戦い

Command PhaseScriptExecution failed with a nonzero exit code
というエラーを倒すのに、５時間以上かかってしまった。他の人にはこの大変さを経験して欲しくないので、できる限り覚えていることを記述しておこうと思います。

結論から言うと、
Carthageで導入したフレームワークを消すことで解決しました。

消し方は、[こちらの記事](https://qiita.com/y-some/items/85c2606928b0f1ef5d72)を参照。いたって普通に消しました。

ただ、なぜ解決したのかは結局のところわかりませんでした。
ので、Carthageを使うのは怖いです。たまたま自分はCarthageで導入したフレームワークはあってもなくても良いような存在だったのでなんとかなりましたが、もしコアの部分にCarthageでインストールしていたらどうなっていたのか…

☆


さて、
まずは自分の実行環境を説明しておこうと思います。
XcodeはVersion 10.1
OSはMojave
CocoaPodsもCarthageも最新です。

自分はついこの間Macbook Proを購入し、プロジェクトを今まで使っていたMacbookから新しいMacbook Proへと移行するタイミングにありました。
アップデートをいくつかして、さぁArchiveしてValidateしてDistributeしようと思っていたら、Archive時にエラーが出たって次第です。
通常のBuild時や実機で試す時にはエラーは起こるときもあれば起こらないときもあるって感じでした。

☆

Command PhaseScriptExecution failed with a nonzero exit codeについて、Google検索で
上位表示されるあらゆるサイト（英語を含む）は読みました。

だいたい書かれているのは、以下の方法です。
・Clean（Command + Shift + K）
・DerivedDataファイル以下全ての中間ファイル（キャッシュ？）を削除
参考：[[Xcode][小ネタ] DerivedDataの削除についての備忘録](https://dev.classmethod.jp/smartphone/iphone/remove-xcode-derived-data/)
・Podfileを編集して、Podの再インストール。
・最近アップデートしたライブラリがあれば、ダウングレードして試してみる。
・Cocoa Podsのアップデート
・Carthageのアップデート
・キーチェーンのログインをロック＆解除を１度繰り返す
・古いMacbookの証明書をコピー
参考：[iOSアプリ開発で実機による開発を複数台（メイン機ではない2台目以降）のMacで行いたい場合](http://makotton.com/2014/10/24/625)
・Build Phases＞Run Script＞Shellにて、タイピングミスがないか（余計なスペースが入っているケースがある）・・・①
・Xcodeの再起動
・Macbook本体の再起動


上の方法は全て試しました。
自分は古いMacbookの動作が遅すぎて確認できてませんでしたが、古いMacbookであればちゃんと動作するのかも試そうと思ってました。

☆

しかし、これでも解決しませんでした。
正直諦めかけていましたが、自分は以前R.swiftを導入した時に、上の①のミスで、
Command PhaseScriptExecution failed with a nonzero exit codeというエラーが出るケースに遭遇したことがあったんですよね。

ですので、
このエラーはShellのアクシデントで起こってもおかしくないのでは？って仮説を立てました。
そこで、

```shell
# /usr/local/bin/carthage copy-frameworks
```

とcarthageの部分を消してみました。そしたら、Archiveでもエラーが起きない！
これはと思い、[[Xcode] Carthageで導入したライブラリを削除する、またはCarthage自体の利用を止める手順](https://qiita.com/y-some/items/85c2606928b0f1ef5d72)を参考にCarthageで導入したファイルを削除。
それに伴いコードを微調整したら、無事Archive後にUploadできました。

無事解決してよかったです。
Ubuntuの翻訳ファイル変更方法

# はじめに
デスクトップに表示されている”ゴミ箱”の名前を変更したいと思い、
翻訳情報を持つファイル(以下、翻訳ファイル)を変更することで成功したので、
翻訳ファイルの変更方法を備忘録として残しておきます。

# 変更するファイルの在り処

```shell
/usr/share/locale/ja/LC_MESSAGES
```
または、  

```shell
/usr/share/locale-langpack/ja/LC_MESSAGES
```


このディレクトリ下にある、`アプリ名.mo`ファイルが各アプリの翻訳ファイル。  


# やり方
## .moファイルを.poファイルに変換  
.moファイルはバイナリ形式なので、以下のコマンドで編集可能な.poファイルに変更します。
```shell
sudo msgunfmt XXXX.mo -o XXXX.po
```

## .poファイルを編集 
.poファイル内では、翻訳する言葉をしめす`msgid`と翻訳結果である`msgstr`がセットで保存されています。
翻訳の結果を変更するには、`msgstr`を書き換えます。

## .poを.moに変換  

```shell
# バックアップを取る
sudo cp XXXX.mo XXXX.mo.org
# 先程編集した.poファイルで新しくXXXX.moを作成し、もともとのXXXX.moファイルに上書きする
sudo msgfmt XXXX.po -o XXXX.mo
```

以上です。
12ステップで作る 組込みOS自作入門　Macでのシリアルを利用したフラッシュROM書き込み

##概要
組込みOS自作入門のフラッシュROM書き込みをMacで実施してみた。

##使用機器
H8マイコン本体と電源はいいとして、シリアルUSB変換ケーブルは以下を利用。

ＵＳＢシリアル変換ケーブル　グレー色
http://akizukidenshi.com/catalog/g/gM-02746/

秋月のホームページでは商品説明欄にMac対応の記載の旨はないが、問題なく利用できた。


##利用ソフト

 - H8書き込み
     h8writeを利用すればよい

 - コンソール
     screenを利用した


##作業内容



###イメージの用意
OSのイメージは自分でコンパイルして作成すべきだが、問題の切り分けがスムーズに行えるよう、公式のVMイメージを利用するのがよい。
http://kozos.jp/books/makeos/index.html#vmimage


###ドライバのインストール

秋月の商品紹介ページのQA部から、メーカのサイトに移動する。
http://akizukidenshi.com/catalog/faq/goodsfaq.aspx?goods=M-02746

すると、Mac用のドライバがあるのでそれをインストールする。
http://www.prolific.com.tw/JP/ShowProduct.aspx?pcid=126&showlevel=0126-0126

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222043/25c2503b-1f15-cea6-60d5-906d3ef25a66.png)
PL2303 Mac OS X Driver Downloadから取得すればよい。

インストールはzipを解凍して、中身の実行ファイルを実行するだけ。
途中で一度再起動がもとめられる。


###h8writeのインストール

ソースからコンパイルすればよい。

```
curl -O http://mes.osdn.jp/h8/h8write.c
gcc -Wall -o h8write h8write.c
ls -l h8write
```


###イメージ書き込み
```
$ ls -l /dev/tty.*
crw-rw-rw-  1 root  wheel   20,   0  1  4 00:02 /dev/tty.usbserial
```

```
$ ./h8write -3069 -f20 kzload.mot /dev/cu.usbserial 
H8/3069F is ready!  2002/5/20 Yukio Mituiwa.
writing
WARNING:This Line dosen't start with"S".
Address Size seems wrong
WARNING:This Line dosen't start with"S".
Address Size seems wrong
.....
EEPROM Writing is successed.
```



###書き込んだプログラムの実行

ピンを実行モードに変えて接続をし直す。
screenコマンドで接続する。
そのままではマイコン側のリセットボタンを押すことで、メッセージがかえってくる。


```
screen /dev/tty.usbserial
切断はCtr + a + \
```


##参考リンク
http://d.hatena.ne.jp/satfy/20101226/1293370919
ポリモーフィック関連を定義する設定をまとめてみた[Rails]

#**はじめに**
ポリモーフィック関連を定義するのに必要な設定をまとめておきます。

#**ポリモーフィック関連とは**
ポリモーフィック関連とは、一つのモデルが複数の親モデルに紐付く関連のことです。

#**必要な設定**
ここでは、複数の親モデルとして、BookモデルとAuthorモデルが存在し、子モデルとしてMemoモデルが存在しているとします。

##**親モデル**
**asオプション付きのhas_manyメソッドを宣言します。**
asオプションで関連名を変更します。

```book.rb
class Book < ApplicationRecord
  .
  .
  has_many :memos, as: :memoable
  .
end  
```

```author.rb
class Author < ApplicationRecord
  .
  .
  has_many :memos, as: :memoable
  .
end
```


##**子モデル**
**polymorphicオプション付きのbelongs_toメソッドを宣言します。**

```memo.rb
class Memo < ApplicationRecord
  .
  belongs_to :memoable, polymorphic: true
  .
end
```

##**子テーブル**
子テーブルには下記の二つのカラムを用意します。

```
memoable_type
memoable_id
```


#**おわりに**
各々の状況に応じて、`memoable`の箇所を書き換えるとポリモーフィック関連が成立します。
思ったより簡単ですね。

こちらの記事が役に立ったという方は、いいね、よろしくお願いします(^^)

また、[takuyaninのマイページ](https://qiita.com/takuyanin)にRails, Rubyに関していくつか記事をまとめてますので、よければご参考ください。
「ActiveRecord::PendingMigrationError」と出た時のエラー解決方法【rails】 

この記事は、RubyOnRailsの基礎学習で、Twitter風のWebアプリケーション作成中に発生したエラーについて、備忘録としてまとめたものです。

##発生している問題・エラーメッセージ
ユーザー登録機能を作成中に、ページを表示しようとしたら以下のエラーメッセージが出た。

[![Screenshot from Gyazo](https://gyazo.com/a000a9ddecfc16173a9915b0a01304d1/raw)](https://gyazo.com/a000a9ddecfc16173a9915b0a01304d1)

「Migrations are pending」
マイグレーションが保留になっている

##開発環境
・データベース：MYSQL
・railsのバージョン：5.0.7.1
・クラウド環境：AWS Cloud9
・使用PC：macbook pro

##エラーの原因
今までにマイグレーションした履歴を確認

```
$ rails db:migrate status
```

[![Screenshot from Gyazo](https://gyazo.com/3929cf5d179b74365d26822db99fbb41/raw)](https://gyazo.com/3929cf5d179b74365d26822db99fbb41)

usersテーブルがすでに作られているのに、もう一度作ってしまったため、エラーが出ているようです。

##エラーの解決方法
今回は、usersテーブルに登録したuser情報が2つしかなかったため、データベースをリセットする方法をとります。

```
$ rails db:reset
```

これで、`rails db:migrate`（実行）、`rails db:drop`（削除）、`rails db:create`（作成）を同時にやってくれる。

エラーが解決して、ページが表示されるようになりました。

[![Screenshot from Gyazo](https://gyazo.com/1f32b682cfd39e91fec51dd663b35cb0/raw)](https://gyazo.com/1f32b682cfd39e91fec51dd663b35cb0)

ユーザーを作成

```
$ rails console
```
```
> user = User.new(name: '〜' , email: '〜', password: '〜')

> user.save
```

##ステップアップのための備忘録
今回は、データベースをリセットする方法を用いたが、重複して作成してしまったデータのみを削除できるようにしたい。
Permissionエラーで詰まったので大まかにまとめてみた

##最初に
permissionエラーで詰まったので今回はpermissionに関することを自分用のメモとしてまとめてみました。

##permissionとは

- permission:フォルダやファイルに対してのアクセス権のこと。


この権限には、「①読み取り権限②書き込み権限③実行権限」の3つがあり、それぞれには記号が割り当てられている。権限の割り当ては、

- d:　ディレクトリ
- r:　読み取り権限
- w:　書き込み権限
- x:　実行権限

となっている。

##permissionを確認
permissionエラーが出たディレクトリまたはファイルで権限を確認。

```
$ ls -l
```

<br />
すると、こんな感じで表示される。

```
drwxr-xr-x 1 user名　group名　2000 1 3 2:11 app
```
<br />
先頭からみていくと...

```
drwxr-xr-x
```

- d:ファイルの種類がディレクトリ（ファイルの場合は「-」）。
- rwx:ファイルの所有者に対する権限で、所有者にrwx全ての権限がある。
- r-x:ファイルの所有グループに対する権限で、所有グループに読み取り、rxの権限がある。
- r-x　:その他にrxの権限がある。

<br />

```
1 user名 group名
```

- リンク数、所有者名、所属するグループ名

<br />


```
2000 1 3 2:11 app
```

- サイズ、最終更新日時、ファイル名orディレクトリ名



##ファイルを変更して保存しようとするとエラーが発生
エディタでファイルに変更を加え、保存しようとすると「アクセス権限が不十分です。[Sudo 権限で再試行] を選択してスーパーユーザーとして再試行してください。」とのこと。
<br />

そこで

```
$ ls -l
```

で確認したところ所有者はrootに。
<br />


そこで下記のコマンドで所有者をrootからユーザー名に変更。

```
$ sudo chown -R ユーザ名 ディレクトリ名
```

上記のコマンドでは、ディレクトリ内の全てのファイルおよびディレクトリの所有者をユーザ名にしています。
<br />

これでアクセス権限に引っかからずに保存することができました！

##補足
###root、sudoについて

- root:管理者権限
- sudo:コマンド単位で一時的にroot権限を使う方法
- su:任意のユーザーに切り替え可能(ただしユーザー名を省略するとrootユーザーになる)

<br />

```
$ su -l
```

とするとrootユーザーとしてログインし直してくれる。```-l```オプションをつけないと単にユーザーを切り替えるだけに。通常はログインし直した方が良い。

<br />

上記のコマンドは、lを省略することもでき、下記のコマンドでも可。

```
$ su -
```

ただrootユーザーの権限は広すぎることから、うっかりrmコマンドなどを使って消してはいけないファイルなどを消してしまっては困るので、```sudo```を先頭につける。（rootユーザーに切り替えて作業することは滅多にないらしい...）

###chown（changeowner）コマンドについて

- chown:所有者を変更するコマンド

ユーザー名とグループ名ともに変更したい時は、下記のコマンドを実行する。

```
$ sudo chown ユーザー名:グループ名 ディレクトリorファイル名
```

##終わりに
今回はPermissionに関してまとめて見ました。何か間違っているところなどがあればコメントください。

##参考資料
- [パーミッション（permission）とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1169.html)
- [permission deniedで悩まされたので勉強してみた
](https://qiita.com/takuyanin/items/18590600d077df707923)
- [【完全初心者向け】Linuxのrootユーザとは？](https://eng-entrance.com/linux-root)
- [UNIXコマンド入門 [一般ユーザー編]/(全24回)の#12~#19](https://dotinstall.com/lessons/basic_unix_v2)
CloudBuildで設定した環境変数をDockerに渡す

最近会社でGCPを使っている@kshibata101です。

GCPのCI/CDサービスであるCloud Buildで環境変数を設定しDockerを動かすときにちょっと詰まったので、方法を備忘録的に残そうと思います。

# Cloud Build
GCPでCI/CDを可能にしてくれるサービスです。
まだ出て間もないサービスで、2019年1月現在ではトリガーの機能がベータ版のようです。

<img width="386" alt="cloud-build_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/5964/cad7c7bd-ba4b-868d-513a-aae4d21c4fb9.png">

基本的にはcloudbuild.yamlというファイルを用意し、そこにコマンドを書いていくことでCI/CDを実現します。
cloudbuild.yamlを用意せずとも、Dockerfileを与えればそれを勝手にビルドしてくれる設定も可能ですが、ここではyamlで設定する方法を記載します。

# 変数を渡すフロー

上でも触れた通り、CloudBuildではビルドの対象として

- Dockerfileをそのまま指定する
- cloudbuild.yamlというビルド手順を書いたファイルを用意する

という2通りがありますが、2番目のcloudbuild.yamlを用意する場合は変数代入の機能が使えます。

ただ、ここの変数はあくまで**cloudbuild.yaml内で使える変数**なので、そのままではDockerfile内のコンテナで扱う変数を設定することはできません。

しかし、Dockerfileで変数を取り扱う設定には**ARG**と**ENV**があり、

- ARG: docker imageをビルドするときに使える**外から渡す**変数
- ENV: ビルド後のコンテナ内に設定される**内部で使う**環境変数

ということなので、ARGで受けてENVに設定すれば、コンテナ内の変数として扱うことができます。

最終的には

CloudBuildの代入変数 => cloudbuild.yamlの--build-arg引数 => DockerfileのARG => ENV

といった感じになります。

# 設定

具体的な設定方法です。

今回はRailsで5.2から導入されたcredentialsを扱うための環境変数「RAILS_MASTER_KEY」をCloud Buildから設定してみました。

まずレポジトリにDockerfileとcloudbuild.yamlを用意します。
コードはこんな感じになります。

```
# Dockerfile
FROM gcr.io/google-appengine/ruby

ARG _RAILS_MASTER_KEY
ENV RAILS_MASTER_KEY ${_RAILS_MASTER_KEY}

:
```
DockerfileでARG変数はアンダースコアで始めてますが、これはFROMに指定したイメージがすでにRAILS_MASTER_KEYを定義していたのであえてアンダースコアをつけています。

```
# cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ["build", "-t", "gcr.io/$PROJECT_ID/appengine/default:$_TAG",
         "--build-arg", "_RAILS_MASTER_KEY=$_RAILS_MASTER_KEY", "."]

- name: 'gcr.io/cloud-builders/docker'
  args: ["push", "gcr.io/$PROJECT_ID/appengine/default:$_TAG"]

- name: 'gcr.io/cloud-builders/gcloud'
  args: ["app", "deploy", "gcp/app-${_PROJECT_ENV}.yaml", "--quiet"
         "--image-url=gcr.io/$PROJECT_ID/appengine/default:$_TAG"]
```

cloudbuild.yamlは、「build」「push」「deploy」に分けて実行しています。
こちらの変数をアンダースコアで始めているのはCloudBuildの代入変数の仕様のためです。

ファイルの用意が終わったら、gitのレポジトリにpushしておきます。

続いて、CloudBuildに行きトリガーを設定します。
設定方法は公式や他の記事などに譲りますが、gitレポジトリと連携して先程pushしたブランチを指定すればOKです。

<img width="999" alt="Cloud_Build_-_consulting-cloud-prd_-_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.amazonaws.com/0/5964/c2d076b4-2562-ea08-a3c2-19bf649274b6.png">


設定画面内の「ビルド設定」でcloudbuild.yamlを選択し、レポジトリ内のパスを入れておきます。

また、その下に代入変数を設定します。
先程書いたDockerfileのARGに相当するkeyとvalueを設定します。

なお、\_RAILS_MASTER_KEYの他に、環境分割用に\_PROJECT_ENV、バージョン管理用に\_TAGを設定しています。

あとは保存をして、トリガーを起動させます。
pushしてもいいですし、手動でも起動は可能です。

<img width="1013" alt="Cloud_Build_-_consulting-cloud-prd_-_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.amazonaws.com/0/5964/ab2ee390-0318-37f3-0e98-9c8a1dff92b3.png">

実行するとログが出るので正しく設定されたか確認します。
deploy後Google App Engineでちゃんと動くか確認できれば設定は完了です。

# おわり

鍵などの秘密にしたい変数の場合はIAMで閲覧権限を絞るか、絞れない場合は秘密情報の設定は避けた方が懸命かもしれません。

秘密情報についてはCloud KMSで暗号化しておきbuild時に復号して渡す方法もあったりするので、実現できたらまた残します。

今回はあくまで設定方法の共有ということで、参考になれば幸いです。
RailsでよくみかけるGem備忘録

## 概要
使う前の概要メモ。

## turbolinks
jsファイルに`//= require turbolinks`を書く

**参考リンク**
[turbolinksチートシート \- Qiita](https://qiita.com/morrr/items/54f4be21032a45fd4fe9)

## guard
ファイル変更を検出して自動的に動作する

**参考リンク**
[Guardをつかってみた \- くろねこ日記](http://kuroneko0208.hatenablog.com/entry/2014/12/29/231705)


## rack-dev-env
Railsenvがdevelopmentのとき画面にリボンが表示される

**参考リンク**
[Rack\_dev\_markで開発環境と本番環境を視覚で判断しよう \- コンユウメモ](https://konyu.hatenablog.com/entry/2014/11/12/225705)


## web-console
rubyコード内で`console`メソッドを呼び出すと、ブラウザで画面表示したときに、画面上にconsoleが立ち上がる。
CLIから`rails console`やったときの画面と同じ

**参考リンク**
[web\-console を使えば Rails App のデバックが楽になる \- Qiita](https://qiita.com/pekepek/items/74c8b1f4c886fc9b15cd)
[Railsのweb\-consoleについて \| 日々雑記](http://y-yagi.tumblr.com/post/96428108880/rails%E3%81%AEweb-console%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)