OmniAICreator/Qiita-1.07M huggingface dataset:
macで情報収集したい? 要約サービスが超便利

# はじめに
macでは「要約サービス」がデフォルトで入っている。入っているが、デフォルトでは気付けない位置にある。
これを最近知り、情報収集がかなり楽になったので、知らない人に紹介したいという衝動に襲われた。

なお自分は、要約サービスを快適に使いたいがために、[これまでいろいろ設定してきたVivaldi](https://qiita.com/tomoyamachi/items/021ab4576b61785a3bc8)から、Chromeに乗り換えた。そのくらいの価値があるキラーアプリである。


# 使い方
システム環境設定 > キーボード > ショートカット > サービス から
「要約する」にチェックを入れる。 ショートカットキーで呼び出したければ設定。
<img width="664" alt="preference" src="https://qiita-image-store.s3.amazonaws.com/0/14275/6f2bd5b8-fdb5-4c0a-5cb4-2a6d807f5329.png">

Chromeであれば、Chrome > サービス > 要約する で要約サービスが立ち上がる。
当然ショートカットキーも使える。
![howtouse](https://qiita-image-store.s3.amazonaws.com/0/14275/d26de88f-0dac-724c-3fd2-3fd19266bb00.png)


要約サイズや形式は、簡単に調整可能。
自分は「文」の要約にし、大体10%くらいのサイズにして、徐々に100%に近づける手法をとっている。

日本語だろうと英語だろうと中国語だろうと、1つのツールでよしなに要約してくれるので、めっちゃ便利。

# 実際の使用例

最近書いた [gVisorを使ってdockerコンテナをより安全に利用する](https://qiita.com/tomoyamachi/items/ac52f906816804e7cf1b) を要約した。

要約後

```
> gVisorとは、KubeCon2018でローンチが発表されたOpen Container Initiative (OCI)に準拠したコンテナのランタイム runsc を含むプロジェクトのこと。
> ...上記の記事にある図の runc というものが、今デフォルトで利用されているランタイムで、 runc の部分をよりセキュアに(ホストカーネルと隔離して)実行させようとしているのが runsc。
>...要するにDockerアプリケーションからのシステムコールをgVisorが一度受け取り、それをホストカーネルに渡す仕組みになっている。
>...注意点としては、まだ動かないかもしれないけど、動かなかったら教えてね、くらいのふわっとした状況だということ。
>...Ubuntu 18.04 LTSだと、Docker, Bazelが正式にサポートされてない。  また Container-Optimized OSはDockerバージョンが17.03と、gVisorの推奨するDockerバージョンを満たしていない。 
> ...Sl   16:51   0:00 docker-containerd-shim -namespace moby -workdir
> ...他にセキュリティを強固にするためのランタイムに Kata Containersというものがある。(
> ...まだ利用していないし、コードも見れていないけど、VMと同程度のセキュリティが担保されそう。
> ...2018年のDocker・Mobyという須田さんのプレゼンにもセキュリティについて触れている。 
> ...今回調べた結果、すでに色々なアプローチをとられていることがわかったので、どこかのタイミングでまとめたい。
> ...ローカルには基本的に言語の実行環境をインストールせず、コンテナで実行環境のバージョンなどを指定して実行するようになった。
> もちろんanyenvなどを使ってバージョン管理する方法もあるけど、ローカルの依存関係が複雑になっていくのが嫌だ。
> ...その反面、使うコンテナに含まれるセキュリティホールについては意識していなかったので、gVisorの需要は高い。
```

だいたいわかる!!すごい!!
Qiita記事の鮮度を測りやすくするためのChrome拡張を作った

Qiitaの記事に投稿日時を表示させるChrome拡張を作りました。

[qiita-alert - Chrome ウェブストア](https://chrome.google.com/webstore/detail/qiita-alert/oeobdgfekjhhibgbcnmmpabgkmglcpki?hl=ja:embed:cite)

## なぜ作った？
Qiitaでは情報の鮮度を警告する仕組みとして `1年以上経過しています` と表示されますが、これは `最終更新日時` を基準にしています。そのため、ちょっとしたtypoを修正するだけでこのアラートは消えてしまいます。

それであれば、投稿日時を確認したいところですが、記事を一度更新すると `最終更新日時` のみが表示される仕様となっており、ひと目でいつ投稿されたのか確認することができません（最終更新日時にマウスオーバーするとバルーンに表示されますが面倒）。

そこで、投稿日時をすぐに目視確認できるChrome拡張を作ることにしました。

## 表示例
投稿から1年以内
<img src="https://qiita-image-store.s3.amazonaws.com/0/6158/3cf8e6fa-61d8-57c9-46b2-35ef60639f76.png" width=500>

投稿から1年より前かつ2年以内
<img src="https://qiita-image-store.s3.amazonaws.com/0/6158/eef8b349-1b14-364f-2268-3320767cc8f0.png" width=500>

投稿から2年より前
<img src="https://qiita-image-store.s3.amazonaws.com/0/6158/39e56515-0ec5-e4ff-2c5c-44e6b934453a.png" width=500>

## おわりに
よかったら使ってみてください
[qiita-alert - Chrome ウェブストア](https://chrome.google.com/webstore/detail/qiita-alert/oeobdgfekjhhibgbcnmmpabgkmglcpki?hl=ja:embed:cite)

Issue, PullRequestもお待ちしております
https://github.com/hogesuke/qiita-alert
React-routerでリロードすると404エラーや cannot GET になる時のWebpack設定メモ

React-routerでリロードすると404エラーやcannnot GETが出てハマりました。

## 解決方法

webpack.config.jsに以下の記述をすると直りました。

```js
  devServer: {
      contentBase: './dist', 
      inline: true,
      host: 'localhost',
      port: 8081,
      stats: 'errors-only',
      historyApiFallback: true //←ここ追加
    },
```

`yarn start`して再起動するとおそらく解決するかと思います。
どうしてもaptで入るROSパッケージに一時パッチを当てたい時

### 注意

あまり詳しくない人はやらないほうがいいと思います．

### まえがき

ROSのパッケージを使うと`apt-get`で必要なパッケージ・機能がビルド済みの状態でインストールすることができる反面，新しい機能やバグフィクスなどを利用したいときは次のリリースを待つか，最新のソースを自分でビルドする必要があります．

自分でビルドするためにはワークスペースをオーバーレイする必要があり，この作業自体は簡単にできますが，`roslaunch`や`rosrun`に相当する作業をupstartやsystemdに登録してコンピュータの起動時にROSのノードを起動するときなどに変更しなければならないファイルが増えてしまい，複数人で共有するコンピュータ（ロボット実機含む）の場合面倒になってしまいます．

そこで一時的にオレオレバージョンを作ってローカルにインストールすることで次のリリースまで凌ぐことを目的にします．

### debパッケージを作るインストーラを作る

- まず必要なパッケージをインストールします．

    ```bash
    sudo apt install python-bloom fakeroot dpkg-dev debhelper
    ```

- 一時的にパッチを当てたいパッケージに移動

    ```bash
    roscd awesome_pkg
    ```

- ソースを変更する（パッチを当てる）

- debパッケージを作るためのインストーラを作成

    ```bash
    bloom-generate rosdebian --os-name ubuntu --os-version xenial --ros-distro kinetic
    ```

    `xenial`や`kinetic`などのdistroは各自の環境によって変更してください

    コマンド実行後に`debian`というフォルダができます．

    ```bash
    $ ls debian
    changelog  compat  control  rules  source
    ```

- バージョンをオレオレ仕様に変更

    このままだと普通に`apt`で入るバージョンと競合するので，`changelog`ファイルを編集してオレオレバージョンに変更します．
    ここで，コツとして，現在のリリースバージョンより大きく，次にリリースされる予定のバージョンより小さいバージョンにしておくと，次にリリースされたタイミングで`apt-get upgrade`をしたときに，このパッチから自動でアップグレードされるようにすることができます．
    (もちろん次のリリースではこのパッチが不要になっているはずという前提)

    ```diff
    $ diff debian/changelog
    # 最初の行
    - ros-kinetic-awesome-pkg (2.2.26-0xenial) xenial; urgency=high
    + ros-kinetic-awesome-pkg (2.2.99-0xenial) xenial; urgency=high
    ```

    ここでは次のリリースで`2.3`以降がリリースされることとします．

- `deb`ファイルの作成

    `deb`ファイルをビルドします．

    ```bash
    $ fakeroot debian/rules binary
    # <中略>
    dpkg-deb: building package 'ros-kinetic-awesome-pkg' in '../ros-kinetic-awesome-pkg_2.2.99-0xenial_amd64.deb'.
    ```

    現在のディレクトリから１つ上のディレクトリに`deb`ファイルができているはずです．
    あとはこれをパッチを当てたい環境に持って行き，`dpkg -i`でインストールすれば終わりです．
ASP.NET Razor ページで Web Form の User Control (ascx) を描画する方法とその逆の方法

ASP.NET の Web Form と MVC (Razor) が共存している環境で、あるパーツはどちらかで書いて共通して使いたい場合のやり方。
ググれば出てくるんですが検索ワードを忘れがちなのでまとめ。

# 引用元
(Web Form in Razor Page) https://stackoverflow.com/questions/7934319/use-a-legacy-asp-net-ascx-user-control-in-mvc-razor-view
(Razor Page in Web Form) https://stackoverflow.com/questions/702746/how-to-include-a-partial-view-inside-a-webform

# Web Form in Razor Page
User Control の継承元を System.Web.UI.UserControl から System.Web.Mvc.ViewUserControl に変更する。

```cs
public partial class WebUserControl1 : UserControl
{
    // ...
}
// 上を下に
public partial class WebUserControl1 : ViewUserControl
{
    // ...
}
```

描画方法は下記の通り。

```cs
@Html.Partial("~/UserControls/WebUserControl1.ascx")
```

## モデルを渡す場合

```cs
public partial class WebUserControl1 : ViewUserControl<dynamic>
{
    public string Hoge { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        Hoge = base.Model;
    }
}
```

```cs
@Html.Partial("~/UserControls/WebUserControl1.ascx", "テスト")
```
dynamicは適宜好きなクラスに置き換えてください。

# Razor Page in Web Form
ダミーコントローラーと描画用のユーティリティメソッドを使って描画。

```cs
public class WebFormController : Controller { }

public static class WebFormMVCUtil
{

    public static void RenderPartial( string partialName, object model )
    {
        //get a wrapper for the legacy WebForm context
        var httpCtx = new HttpContextWrapper( System.Web.HttpContext.Current );

        //create a mock route that points to the empty controller
        var rt = new RouteData();
        rt.Values.Add( "controller", "WebFormController" );

        //create a controller context for the route and http context
        var ctx = new ControllerContext( 
            new RequestContext( httpCtx, rt ), new WebFormController() );

        //find the partial view using the viewengine
        var view = ViewEngines.Engines.FindPartialView( ctx, partialName ).View;

        //create a view context and assign the model
        var vctx = new ViewContext( ctx, view, 
            new ViewDataDictionary { Model = model }, 
            new TempDataDictionary() );

        //render the partial view
        view.Render( vctx, System.Web.HttpContext.Current.Response.Output );
    }
}
```

```cs
<% WebFormMVCUtil.RenderPartial( "ViewName", this.GetModel() ); %>
```
ソートアルゴリズム入門 - バブルソート編 -

# はじめに
pythonの習得を兼ねて、ソートアルゴリズムを実装していきます。
他に効率的な書き方があれば、教えて下さい。

## 実行時間測定

|定数|説明|値|
|:--:|:--:|:--:|
|N|要素数|10000個|
|LOOP|実行回数|10回|

```py:main.py
import numpy as np
import time

# sort algorithm
from bubble import sort

N = 10000
LOOP = 10
exe_times = []
arr = range(N)

for i in range(LOOP):
    np.random.shuffle(arr)
    start = time.time()

    # ソートアルゴリズム
    sort(arr)

    exe_time = time.time() - start
    exe_times.append(exe_time)

for i in range(LOOP):
    bad_array = sorted(arr, reverse=True)
    start = time.time()

    # ソートアルゴリズム
    sort(bad_array)

    exe_time = time.time() - start
    exe_times.append(exe_time)

for i in range(LOOP):
    good_array = sorted(arr)
    start = time.time()

    # ソートアルゴリズム
    sort(good_array)

    exe_time = time.time() - start
    exe_times.append(exe_time)

print("Average: {0}{1}".format(np.average(exe_times), "[sec]"))
print("Max: {0}{1}".format(np.max(exe_times), "[sec]"))
print("Min: {0}{1}".format(np.min(exe_times), "[sec]"))
```

## バブルソート
```py:bubble.py
def sort(array):
    length = len(array)
    while True:
        swapped = False
        for i in xrange(length-1):
            if array[i] > array[i+1]:
                array[i], array[i+1] = array[i+1], array[i]
                swapped = True
        length -= 1
        if not swapped:
            break
    return array
```

```txt:実行結果
Average: 5.69646668434[sec]
Max: 10.6949999332[sec]
Min: 0.0[sec]
```
Datastoreに map[string]interface{} を保存/取得する

# このページは？
`map[string]interface{}`のデータをDatastoreに保存/取得したくなったので、その方法をメモとして残しておきます。

## Datastoreに`map`型を保存する

Golangで、Datastoreに保存できるプロパティの型は以下にまとまっています。
https://cloud.google.com/appengine/docs/standard/go/datastore/entities

**`map`型を直接、Cloud Datastore保存させることはできません！**
`[]byte`型に変換することで、保存することができます。

⚠️注意点⚠️

`[]byte`型は**1MBまで**しか保存することができません。
またインデックスさせることもできません。

> | Value type | Go type(s) | Sort order | Notes |
> |:--|:--|:--|:--|
> | Byte slice (long) | []byte | None | Up to 1 megabyte <br> Not indexed |

## 例

```
type User struct {
	ID           string
	Claims       map[string]interface{} `datastore:"-"`
	ClaimsBinary []byte
	Name         string `datastore:"-"`
}
```

## PropertyLoadSaver

`PropertyLoadSaver`を活用することで、読み込み時に`map`の値を取得したり、保存時に`map`→`[]byte`に変換することができます。

```
func (u *User) Load(ps []datastore.Property) error {
	if err := load(u, ps); err != nil {
		return err
	}

	if err := json.Unmarshal(u.ClaimsBinary, &u.Claims); err != nil {
		return err
	}

	u.Name = u.Claims["name"].(string)

	return nil
}

func (u *User) Save() ([]datastore.Property, error) {
	binary, err := json.Marshal(u.Claims)
	if err != nil {
		return nil, err
	}

	u.ClaimsBinary = binary

	return save(u)
}
```

参考
- https://github.com/GoogleCloudPlatform/google-cloud-go/issues/223
SlackですぐにチャンネルIDを取得する方法

# SlackですぐにチャンネルIDを取得する方法

## アプリケーションの場合

IDを知りたいチャンネルの上で`右クリック`->`リンクをコピー`
コピーしたURLを確認する。

`https://xxx.slack.com/messages/ABCDEFGHI`

末尾の`ABCDEFGHI`に該当する部分がIDです。

## ブラウザ版の場合

IDを知りたいチャンネルを開き、URLをチェックする。

`https://xxx.slack.com/messages/ABCDEFGHI`

末尾の`ABCDEFGHI`に該当する部分がIDです。

## ひとこと

わざわざAPIを叩いていた自分がバカらしいです。
MacOS SierraでSassがインストール出来ない時

#Sassのインストールでエラー発生
```
$ sudo gem install sass

Fetching: sass-3.5.6.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/bin directory.
```

/usr/binディレクトリにインストールすることのパーミッションエラーです。

#インストール先を変更
/usr/bin
↓↓↓
/usr/local/bin/

```
$ sudo gem install sass -n /usr/local/bin/
```
#参考にさせていただきました
[Gem install で Operation not permitted された時の対応（追記あり）](https://qiita.com/mukoya/items/c0c545e28ab162af2b91)
Ubuntu 16.04 LTSで読売新聞のサイトへ接続できない場合の対処方法

[読売新聞](http://www.yomiuri.co.jp/)のサイトへ接続できない場合の対処方法についてまとめます。

# 前提
* Ubuntu 16.04 LTS
* IPv6環境

# 原因
`dig`コマンドで[読売新聞](http://www.yomiuri.co.jp/)のドメイン (`www.yomiuri.co.jp`) に対応する`AAAA`レコードを取得してみるとわかるように、[読売新聞](http://www.yomiuri.co.jp/)のドメインには多くのIPv6のIPアドレスが割り当てられています。

```bash
$ dig www.yomiuri.co.jp AAAA +short
2001:240:bb82:102a::1:e6
2001:240:bb82:1014::1:33
2001:240:bb82:1027::1:ae
2001:240:bb82:102a::1:df
2001:240:bb82:1014::1:13
2001:240:bb82:1014::1:12
2001:240:bb82:1027::1:25
2001:240:bb82:1014::1:14
2001:240:bb82:1011::1:87
2001:240:bb82:1011::1:21
2001:240:bb82:1027::1:7d
2001:240:bb82:1015::1:91
2001:240:bb82:1014::1:38
2001:240:bb82:1027::1:78
2001:240:bb82:1026::1:c1
2001:240:bb82:102a::1:e8
2001:240:bb82:1014::1:15
2001:240:bb82:1026::1:93
2001:240:bb82:102a::1:e7
2001:240:bb82:1015::1:90
```

DNSサーバーがこのような大きなデータを返す場合、基本的には[TCPフォールバック](http://www.atmarkit.co.jp/ait/articles/1510/28/news014.html)と呼ばれる仕組みを用います。
しかし、DNSサーバーの[TCPフォールバック](http://www.atmarkit.co.jp/ait/articles/1510/28/news014.html)の実装が不十分な場合、名前解決に失敗してしまうようです。

# 解決策
[EDNS0](https://www.nic.ad.jp/ja/basics/terms/edns0.html)と呼ばれるDNSの拡張プロトコルを有効化します。

1. `echo "options edns0" | sudo tee -a /etc/resolvconf/resolv.conf.d/base`コマンドを実行し、[EDNS0](https://www.nic.ad.jp/ja/basics/terms/edns0.html)を有効化する設定を追記します。
1. `sudo resolvconf -u`コマンドを実行し、設定を反映させます。

# 参考文献
* [Re: [opensuse-ja] 読売新聞のサイトに接続出来ない](https://lists.opensuse.org/opensuse-ja/2016-06/msg00001.html)
* [/etc/resolv.confが空の場合、/etc/resolvconf/resolv.conf.d/baseに書くとよい - Qiita](https://qiita.com/tukiyo3/items/5624f8fb808399b897c9)
* [digコマンドの基本的な使い方 - Qiita](https://qiita.com/tjinjin/items/a3bb6a1e828df8594c2f)
* [teeコマンドの使い方 - Qiita](https://qiita.com/wnoguchi/items/2fc3ec11043d139dc6bb)
* [IPv6 での定番ネットワークコマンド - それマグで！](http://takuya-1st.hatenablog.jp/entry/2016/09/26/154359)
* [Aレコード/AAAAレコード｜レンタルサーバー用語集｜Zenlogic - ファーストサーバ株式会社のレンタルサーバー](https://zenlogic.jp/words/record-a.html)
Digdagでセッションが長引いたとき二重処理させない

Digdagで一定期間ごとに処理をしているとき、そのセッションが長引いて次のセッションが開始する可能性がある。
二重処理をさせたくないときどうするか。

cronとシェルスクリプトなら適当な方法で二重起動を防ぐコードをいれるが、digdagでは
> skip_on_overtime: true

をいれれば良さそう。

参考:

- [http://docs.digdag.io/scheduling_workflow.html?highlight=skip_on_overtime](http://docs.digdag.io/scheduling_workflow.html?highlight=skip_on_overtime)
  - [Release 0.9.0](https://docs.digdag.io/releases/release-0.9.0.html)から導入されたらしい。
VirtualBoxの仮想マシンの中の時間を特定の日付にしたい

# 概要

仮想マシンの時間を特定の日付にしたかった。

時間同期用のサービスを停止させてみたり、
```date --date``` などをつかってみたが、
すぐに、正しい時刻に補正されてしまった。

# 結論

- [VirtualBoxでゲストOSのシステム時間を狙った日付に変更する方法 » WisdomTrees](http://wisdomtrees.net/?p=573)
Linux container on dockerにxdebugをインストールする手順

自分用メモです。

##（コンテナ構築）

使用したdockerイメージはこちら
https://github.com/skywidesoft/apache-php7

```
docker pull skywidesoft/apache-php7
```

```
docker run -p 80:80 -d --name centos-apache-php7-laravel -v /Users/akimats/workspace/docker/centos-apache-php7-laravel:/var/www/html skywidesoft/centos-apache-php7
```

##xdebugインストール

```
docker exec -it centos-apache-php7-laravel bash
```

```
yum -y install cc gcc make php71w-devel php71w-pear
```

```
pecl install xdebug
```

```bash:/etc/php.d/xdebug.ini
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.remote_enable = On
xdebug.remote_autostart = On
xdebug.remote_connect_back = Off
xdebug.remote_host = docker.for.mac.localhost
```

```
docker restart centos-apache-php7-laravel
```
[Django] プロジェクト構成のベストプラクティスを探る - １．設定ディレクトリの名前を変更する

## この記事について

Djangoで本番運用やチーム開発を行うに当たって、プロジェクトの初期構成にどのように手を入れたらよいかを、The Twelve Factorsなどを参考にまとめたメモです。

## 「設定ディレクトリ」について

設定ディレクトリは、`settings.py`や`wsgi.py`のあるディレクトリです。

Djangoのチュートリアル通りに「django-admin startproject myproject 」でプロジェクトを作成すると、myprojectディレクトリが作成された中にさらに設定ディレクトリのmyprojectが作られます。

違和感を覚えた方も多いと思います。実際設定ディレクトリがプロジェクトと同名である必要は全くなく、わかりやすく「config」という名前に変更してしまうのがベストプラクティスとのことです。これは[cookiecutter-django](https://github.com/pydanny/cookiecutter-django)で採用している方法でもあります。

## 変更方法

プロジェクトの作成時なら、startproject実行時に指定可能です。

```shell
mkdir `project名`
cd `project名`
django-admin startproject config .
```

プロジェクトの作成後なら、ディレクトリ名を手動で`config`に修正し設定ファイルの内容を変更します。

```python:manage.py
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
```

```python:wsgi.py
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
```

```python:settings.py
ROOT_URLCONF = 'config.urls'
WSGI_APPLICATION = 'config.wsgi.application'
```

##参考
・[現場で使える 基礎 Django](https://booth.pm/ja/items/823251)
CircleCIでGitHubのOrganizationのリポジトリを扱う

ちょいと迷ったのでメモ起こし。

CircleCIにGitHubのアカウントでログインすると、自分のGitHubアカウントはGetting Startedに表示されているので、すぐにProjectを作ることができます。
一方でOrganizationのリポジトリを扱うには（ほんの）一手間が必要です。

CircleCI、右上の自分のアイコンからUser Settingsを選択します。
<img width="315" alt="スクリーンショット 2018-06-19 11.18.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/221538/4f8529df-17a2-9b2c-7ee2-2660d9e3f672.png">

Account Integrationsの中にあるGitHubから、Check permissionsを選択します。
<img width="986" alt="スクリーンショット 2018-06-19 11.19.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/221538/9480d12e-d590-1921-1cfd-1eb3fdd4f410.png">

GitHubが開きます。アクセスしたいOrganizationを（に？）Grantします。
<img width="781" alt="スクリーンショット 2018-06-19 11.24.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/221538/425f2c54-8c24-1971-7d74-4e58f0aff2b9.png">

これでCircleCIのGetting StartedにOrganizationが追加されます。
解除する場合はGitHubでRevokeしましょう。
vcenter server applianceのアップデート


### vcenter server allliance 6.5のパッチアップデート（最新に）したときのメモ。。。

1. vcenter server appliance VMのスナップショットを取る。
2. Appliance Managerにログイン
  - https://IPまたはvcenterサーバーのFQDN:5480
3. `Update`のページから`Check Update`そして `Check Repository`
4. Updateの詳細を確認して`Install Updates`
5. 終わったら`Summary`ページから`Reboot`をクリック
6. 再起動後に再度`Update`のページから`Check Update`で確認
7. 問題なければVMのスナップショットを削除
GPSの研究　その16

#概要
GPSを理解したかった。
ntrip　casterのRTK2go.comのsourcetableをパースして見た。 

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/adf163c2-9209-8a30-3f0a-b32673a1c7aa.png)

#サンプルコード


```
function run() {
    var objs = [];
    var src = document.getElementById('src');
    var lines = src.value.split('\n');
    for (var i = 0; i < lines.length - 1; i++)
    {   
        var line = lines[i].split(';');
        switch (line[0])
		{
		case 'STR':
            objs.push({
                mountpoint: line[1], 
                identifier: line[2],
                format: line[3],
                format_details: line[4],
                carrier: line[5],
                nav_system: line[6],
                network: line[7],
                country: line[8],
                latitude: line[9],
                longitude: line[10],
                nmea: line[11],
                solution: line[12],
                generator: line[13],
                compression: line[14],
                authentication: line[15],
                bitrate: line[16],
                misc: line[17]
            });

        case 'CAS':
                
        case 'NET':
                
		default:
			
		}
    }
    var table = d3.select("body").insert("table", ":first-child");
    var thead = table.append("thead");
    var tbody = table.append("tbody");
    thead.append("tr").selectAll("th").data(d3.entries(objs[0])).enter().append("th").on("click", function(d, i) {
        createTableBody(d.key);
    }).text(function(d) {
        return d.key;
    });
    createTableBody("id");
    function createTableBody(sortKey) {
        objs.sort(function(x, y) {
            return d3.descending(x[sortKey], y[sortKey]);
        });
        tbody.selectAll("tr").data(objs).enter().append("tr").selectAll("td").data(function(d) {
            return d3.entries(d);
        }).enter().append("td").text(function(d) {
            return d.value;
        });
        tbody.selectAll("tr").data(objs).selectAll("td").data(function(d) {
            return d3.entries(d);
        }).text(function(d) {
            return d.value;
        });
    }   
}

```

#成果物

http://jsdo.it/ohisama1/wXRd

以上。
bundle installができない

**参考になったと思ったらいいねお願いします！**

## 背景
pcを新調した際に急いで環境構築をしてたらなにか抜けてたのかな〜
rails newを実行した際にbundle install されるんですが、そこでエラーが起きてしまっていました。

なんでやねーん。。。

## bundle installをするとエラーが出る

出ていたエラーは以下

```
Fetching source index from https://rubygems.org/

Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/

Retrying fetcher due to error (3/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/^C

```


## 解決方法
以下のコマンドを実行すればbundle installが通るようになりました。

```
$ gem update --system
```

## 最後に
**参考になったと思ったらいいねお願いします！**
修正した方がわかりやすい点があれば修正リクエストもお待ちしてます！

## 参考記事
https://teratail.com/questions/109252
tmux上でjupyter notebookを起動したら"in use"なポートが増えまくった

#困ったこと
サーバー上のjupyter notebookにローカルからアクセスするときに，

```
[I 19:07:16.085 NotebookApp] The port 6060 is already in use, trying another port.
[I 19:07:16.086 NotebookApp] The port 6061 is already in use, trying another port.
[I 19:07:16.086 NotebookApp] The port 6062 is already in use, trying another port.
[I 19:07:16.086 NotebookApp] The port 6063 is already in use, trying another port.
[I 19:07:16.093 NotebookApp] http://[all ip addresses on your system]:6064/
```
こんなのが表示されるようになった．
ポートの6060~6063が埋まってるので6064を割り当てたよということらしい．
ちなみにデフォルトポートは6060に設定してある．
このままだと無限に"in use"なポートが増えそうで怖かったので，状況を調べた．

#原因
tmux上のjupyter notebookへのアクセス中にsshが切れると，ポートを占有しているプロセスが生き残るらしい．おそらくこれが原因．

#解決法
`netstat -tanp`でポートを使用しているプロセスIDを調べて，killすればOK.

```
$ netstat -tanp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 :::6060                 :::*                    LISTEN      36328/python    
tcp6       0      0 :::6061                 :::*                    LISTEN      36503/python    
tcp6       0      0 :::6062                 :::*                    LISTEN      38354/python    
tcp6       0      0 :::6063                 :::*                    LISTEN      40751/python
```
pythonのプロセスがポートを使用していた．
tmuxでペインを分割した時にいちいちホームディレクトリに戻る問題を解決

tmuxってペインを分割した時にいちいちホームディレクトリに戻っちゃうんですよね。
いや、どうせ同じディレクトリで作業するから！！！！

直したい・・・。
そんな時は、

tmux.confに以下を追記します。

```
 bind c new-window -c "#{pane_current_path}"
 bind % split-window -hc "#{pane_current_path}"
 bind '"' split-window -vc "#{pane_current_path}"
```

tmuxを再起動してやってみると・・・

あれ、ならへんやーん・・・。



ってなった自分は、パソコンごと再起動してみました。

そしたらできた。

めでたしめでたし
getRouteKeyNameメソッドでモデルのルートキー名のカスタマイズ


Laravelはタイプヒントされた変数名とルートセグメント名が一致する場合、Laravelはルートかコントローラアクション中にEloquentモデルが定義されていると、自動的に依存解決します。

例：

```php:routes\web.php

use App\User;

Route::get('users/{user}', function (User $user) {
    dd($user->toArray());
});
```

{user}パラメーターをApp\Userモデルへ結合しているため、Userインスタンスはルートへ注入されます。

たとえば、xxxxx.app/users/1のリクエストでは、idが1のUserインスタンスが注入されます。

しかし、IDがオーバーライドするのは嫌がるので、id以外のデータベースカラムをモデル結合で使用したいです。

たとえば、モデルのルートキーは`name`にしたい場合


```php:App\User.php;

namespace App;

class User extends Authenticatable
{
    ...

    public function getRouteKeyName()
    {
        return 'name';
    }

    ...
}
```

xxxxx.app/users/laraにアクセスすると、nameがlaraのUserインスタンスが注入されます。

```php
array:5 [
    "id" => 1
    "name" => "lara"
    "email" => "laravel@xxxxx.app"
    "created_at" => "2018-06-19 09:06:34"
    "updated_at" => "2018-06-19 09:06:34"
]
```

注意点:
１．モデルのルートキー名を変更しても、変数名とルートセグメント名は、`{name}`ではなく、`{user}`でなければならないこと。
２．laraという名前が複数ある場合、最初に一致したUserインスタンスしか注入できないという弱点があること。


以上、自分理解したものなので、間違いなどがございましたら、ご指摘いただけると幸いです。
PHP: TCPDF と FPDI で PDF に加筆

次のプログラムを改造して、テンプレートの PDF に加筆をしてみました。
[TCPDF と FPDI で PDF を重ね合わせる](https://qiita.com/ekzemplaro/items/dc27805c62f56618ccce)

```php:pdf_template.php
<?php
// --------------------------------------------------------------------
/*

	pdf_template.php

					Jun/09/2021


*/
// --------------------------------------------------------------------
use setasign\Fpdi\TcpdfFpdi;

require_once '/usr/share/php/tcpdf/tcpdf.php';
require_once 'FPDI-2.3.6/src/autoload.php';

$pdf_in_a = $argv[1];

fputs (STDERR,"*** 開始 ***\n");

$pdf = new TcpdfFpdi('P', 'mm', 'A4', true, "UTF-8" );

if ($pdf instanceof \TCPDF) {
	$pdf->setPrintHeader(false);
	$pdf->setPrintFooter(false);
}

$pdf->setSourceFile($pdf_in_a);

$pdf->AddPage('P', 'A4');
$pdf->useTemplate($pdf->importPage(1));

$font_path = '/usr/share/fonts/opentype/ipafont-mincho/ipamp.ttf';

if (file_exists($font_path))
	{
	$font = new TCPDF_FONTS();
                
	$fontX = $font->addTTFfont($font_path);
	$pdf->SetFont($fontX , '', 16,'',true);
	}

$pdf->Text(50, 60, "alphabetica ABCDEFG", 0.1 );

$pdf->Text(100, 80, "日本語を表示します。",0.1 );
$pdf->Text(100, 120, "テストです。",0.1 );

$pdf->Output();

fputs (STDERR,"*** 終了 ***\n");
// --------------------------------------------------------------------
?>
```

実行コマンド

```bash
php pdf_template.php template.pdf > out01.pdf
```
VISAライブラリを用いて計測機器と通信を行う。

#初めに
VISAはVirtual Instrument Software Architectureの略で測定機器と通信を簡単にできるぱないやつ:laughing:
VISAライブラリはいろんな会社が実装していてるがここではナショナルインスツルメンツ社が提供しているNI-VISAを使用していくよ。
ダウンロードとインストール、参照設定については割愛するよ。
計測機器はRIGOL社のDS1054Zを使用するよ。
リモートコマンドについてはMSO1000Z Programming Guideを見れば載っているよ:sunglasses:

#C\# のやつ

```C#
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Ivi.Visa.Interop;
using System.IO;

namespace Sample
{
	public partial class Form1 : Form
	{
        ResourceManager rm;
        FormattedIO488 inst;
        
        public Form1()
        {
            InitializeComponent();
        }
        
        private void buttonConnect_Click(object sender, EventArgs e)
        {
            rm = new ResourceManager();  // リソース
            inst = new FormattedIO488(); // 機器と通信をしてくれるオブジェクト
            
            // チェックボックスでLAN接続か、USB接続か選び、リソース文を作成する
            string deviceResource = "";
            if(radioButtonLAN.Checked)
            {
                deviceResource = "TCPIP::XXX.XXX.XXX.XXX::INSTR";
            }
            else if(radioButtonUSB.Checked)
            {
                deviceResource = "USB0::0xXXXX::0xXXXX::XXXXXXXXXXXXXX::0::INSTR";
            }
            
            try
            {
                inst.IO = (IMessage)rm.Open(deviceResource, AccessMode.NO_LOCK, 0, ""); // 機器と接続
                inst.IO.Timeout = 10000;
                
                // 測定器のIDを取得する
                inst.WriteString("*IDN?");
                string returnStr = inst.ReadString(); // 応答を文字列で取得する
                
                textBoxReceiveStr.Text = "[IDN]:\r\n" + returnStr;
                textBoxReceiveStr.Refresh();
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                MessageBox.Show(ex.Message, "errorcode: 0x" + Convert.ToString(ex.ErrorCode, 16));
            }
        }
	}
}
```

# ExcelVBAのやつ

```VBA
Sub QueryIdn()
    Dim viDefRm As Long // 起動情報
    Dim viDevice As Long // 接続情報
    Dim viErr As Long // 完了コードまたはエラーコード
    Dim cmdStr As String
    Dim idnStr As String * 128
    Dim ret As Long

    viErr = visa.viOpenDefaultRM(viDefRm) // 初期化と起動
    viErr = visa.viOpen(viDefRm, "USB0::0xXXXX::0xXXXX::XXXXXXXXXXXXXX::0::INSTR", 0, 5000, viDevice) // 機器と接続する
    
    // 測定器のIDを取得する
    cmdStr = "*IDN?"
    viErr = visa.viWrite(viDevice, cmdStr, Len(cmdStr), ret) // コマンド書き込み
    viErr = visa.viRead(viDevice, idnStr, 128, ret) // 応答読み込み
    Sheet1.Cells(2, 2) = idnStr
    
    // 解放
    visa.viClose (viDevice)
    visa.viClose (viDefRm)
End Sub
```
関数は自動販売機と言いはるなら

タイトルは京都弁です。「低温やけど注意」と同じです。

「関数は自動販売機です」という説明を読んだことがあります。「お金を入れると商品が出てくるように、関数に値を入れると計算結果を返してくれます」と。はたしてそうでしょうか。

試しに実装してみましょう。

```php
<?php

function vending_machine($bill)
{
    $PRICE = 120;
    $ret = '';
    $change = $bill;
    if ($bill >= $PRICE) {
        $ret = 'Juice';
        $change = $bill - $PRICE;
    }
    return array($ret, $change);
}

$myMoney = 200;
list($getIt, $myMoney) = vending_machine($myMoney);

if ($myMoney != 200 && $myMoney == 80) {
    echo 'ジュース飲んでんじゃねーよハゲ！！';
}
```

## 参考

http://blog.livedoor.jp/copipekan/archives/1065848882.html
CP2114のライブラリの使い方

CP2114はSilicon Labs社のUSB I2Sブリッジチップです。このチップのMac用SDKのCP211x_InterfaceLibraryというフォルダーにライブラリ(dylib)とヘッダーが入っています。このディレクトリで以下のコードで動作確認できました。

Mac OS Xの雪豹で試しましたが、10.5以降のHIDインターフェース使っているようなので、10.5でも使えるようです。dylibにはppc7400(G4)なバイナリも入っています。

```c:main.c
#include "Types.h"
#include "SLABHIDtoUART.h"
#include "CP2114_Common.h"
#include "SLABCP2114.h"

main()
{
HID_UART_DEVICE dev;
BYTE api, fw;
BYTE ramconf[32];       // for B1 revsion
HID_UART_STATUS stat;
        stat = HidUart_Open(&dev,0,0x10c4,0xeab0);
        if (stat == HID_UART_SUCCESS) {
                CP2114_GetVersions(dev, &api, &fw);
                printf("MORI MORI %d %d¥n", api, fw);
                CP2114_GetRamConfig(dev, (PCP2114_RAM_CONFIG_STRUCT)&ramconf);
                printf("MORI MORI %02x %02x %02x %02x¥n",
                    ramconf[0], ramconf[1], ramconf[2], ramconf[3]);
                ramconf[3] = 0;
                CP2114_SetRamConfig(dev, (PCP2114_RAM_CONFIG_STRUCT)&ramconf);
                CP2114_GetRamConfig(dev, (PCP2114_RAM_CONFIG_STRUCT)&ramconf);
                printf("MORI MORI %02x %02x %02x %02x¥n",
                    ramconf[0], ramconf[1], ramconf[2], ramconf[3]);
                HidUart_Close(dev);
        }
}
```


```
bash-3.2$ cc -o main main.c -lSLABHIDtoUART -L.
bash-3.2$ ./main
MORI MORI 5 7
MORI MORI 20 00 01 ff
MORI MORI 20 00 01 00
```

関数の説明は[AN433](https://www.silabs.com/documents/public/application-notes/AN433-CP2110-4-HID-to-UART-API-Spec.pdf)にあります。

RAM Configurationでコンフィグレーション試してOTPに焼くって感じみたいですが、USBCLK,SYSCLK,SYSCLKはRAM Configurationで設定しても無効なのでOTPに焼いて、そのコンフィグレーションでbootする必要があるようです。

CP2114(B1)は若松通商のページに在庫ありになっていたのですが、探してもらってどうにか入手できました。パッケージがQFNですが、がんばって秋月で購入した変換基板に手半田しました。

当初ライブラリを使わず自力でHIDを叩いていたのですが、うまく動かないところがあって、ライブラリを試してみました。

CP2114はCQ出版の「音遊び！Blackfin DSP基板でディジタル信号処理初体験」という雑誌に同梱された基板でも使われているようです。

いろいろいじってみようと思っていたのですが、[PIC32MXなDAI](https://qiita.com/yamori813/items/2c69e5f8114b9fe834b6)ができたので、あまりいじってません。

後から気がついたのですが、サンハヤトさんがCP2112を使った[USB I2C変換モジュール](http://www.sunhayato.co.jp/material2/index.php/item?id=1083)を作られているようです。このモジュールでもこのライブラリは使えるような気がしますが、試してません。
NetworkMangager備忘録

素のCentOS7だと以下のような変更しないとアレだったのでデバイス名変える方法について備忘録を。

- 固定にする場合

```
vi /etc/default/grub
GRUB_CMDLINE_LINの行に net.ifnames=0 biosdevname=0 を追加
ls /etc/udev/rules.d/
##以下があったら削除（なかった）
    - 60-net.rules
    - 71-biosdevname.rules
    - 75-net-description.rules
    - 80-net-name-slot.rules

# nmcli --fields NAME con show
名前   
ens160 
nmcli connection modify "ens160" connection.id "eth0" 
nmcli connection modify "eth0" connection.interface-name "eth0" 
nmcli connection modify "eth0" ipv4.address "10.5.0.136/21" ipv4.gateway "10.5.0.1" 
nmcli connection modify "eth0" ipv4.method manual
nmcli connection show "eth0" 
nmcli connection modify "eth0" ipv6.method ignore
sed -i 's/ens160/eth0/g' /etc/sysconfig/network-scripts/ifcfg-ens160 
mv /etc/sysconfig/network-scripts/ifcfg-{ens160,eth0}
vi /etc/sysconfig/network-scripts/ifcfg-eth0
PEERDNS=no ## ついか
IPV6INIT=no ## これ以外のV6の行をけす
HWADDR=02:01:16:9C:00:53をip addr showでみてついか
reboot
```


- dhcpでipv4.methodはautoのままでdns設定を書き換える挙動を抑制したい場合 

```
nmcli con mod eth0 ipv4.ignore-auto-dns yes
nmcli con mod eth0 ipv6.ignore-auto-dns yes
nmcli con mod eth0 
nmcli con mod eth0 ipv4.dns 8.8.8.8
systemctl restart NetworkManager
```
PHP: TCPDF と FPDI で PDF を重ね合わせる

次のバージョンを使います。
>tcpdf 6.3.2
>FPDI 2.3.6
ライブラリーはフォルダー直下にあるとします。シンボリックリンクで構いません。

Ubuntu でのインストール

```bash
sudo apt install php-tcpdf
```

```text
$ grep Version tcpdf/tcpdf.php 
// Version     : 6.3.2
```

FPDI のダウンロード

```bash
wget https://www.setasign.com/downloads/2921760/FPDI-2.3.6.tgz
```

入力は、A4 縦のPDF　です。
>template.pdf
>in01.pdf

```php:pdf_overlap.php
<?php
// ---------------------------------------------------------------------
//	pdf_overlap.php
//
//						Jun/19/2018
//
// ---------------------------------------------------------------------
use setasign\Fpdi\TcpdfFpdi;

require_once('/usr/share/php/tcpdf/tcpdf.php');
require_once('FPDI-2.3.6/src/autoload.php');

$pdf = new TcpdfFpdi('L', 'mm', 'A4');

$pdf->setPrintHeader( false );    
$pdf->setPrintFooter( false );

$pdf->setSourceFile('template.pdf');
$pdf->AddPage('P', 'A4');
$pdf->useTemplate($pdf->importPage(1));

$pdf->setSourceFile('in01.pdf');
$pdf->useTemplate($pdf->importPage(1));
$pdf->Output();
// ---------------------------------------------------------------------
?>
```

実行コマンド

```bash
php pdf_overlap.php > out01.pdf
```
WACATE 2018 夏 グループワークの感想


[WACATE 2018 夏](http://wacate.jp/2018/summer/gaiyo.html) に参加してきました。
ちょと出遅れた感ありますが、主にグループワークについて感想をまとめておきます。
あらためて、ご一緒した班のみなさま、おしゃべりしてくれたみなさま、実行委員のみなさまに厚くお礼を申し上げます。
感想ポエムです。
モデリングという内容にはまったく言及してないので、そのあたり期待する方は回れ右お願いいたします。

## 班のメンバー

わたしがメインワークで所属したのは 第3班です。
初参加 3名、2回目 2名（わたしはココ）、ベテラン1名の構成でした。
今回は初参加者がすごく多くて、どこの班も人数比はこのくらいだったみたいです。
ベテラン枠 1名はブロッコリーさんで、要所要所でファシリテーターしてもらいました。
ブロッコリーさんは「（オープンにすることを）断ることないんで！」っておっしゃってたので、実名(?)を出しちゃう。

## 班のガイドライン

わたしは夏は初参加なので例年を知らないのですが、今回初の試みとして、初日の最初に「班のガイドライン」を作りました。
「目指したい雰囲気」と「実現するための行動」を付箋に書き出して、班で合意します。
付箋を貼った紙を見えるところに掲示しておくのですが、これすごく効果的だったと思います。
うちの班では「守り紙」と名前をつけました（このコピー、秀逸）。
複数人で協力して成果を出そうとするときは、ポリシーを言葉にして常に確認するのってすごく大事だと改めて感じました。

最初に雰囲気として 6人それぞれが出したのが以下です（行動の方は割愛）。

* 壮大な
* ワクワク!
* 仲良い
* 楽しく
* 活発なやりあい
* 納得感がある

「楽しく」と「仲良い」（わたしが出したのコレ）は「ワクワク!」にまとめることにしました。
どちらもキーワードを出した人が「ワクワクのが、語感が良くて素敵！」という感じで合意しました。

1日めの終わりに「壮大」を外しました。
錦司さんに「やりきってもらいます！」と 
脅され
 励まされたこともあり、まずは堅実にやりきろうという方針にしました。

「ワクワク!」「活発なやりあい」「納得感がある」はいずれも達成できました（きぱ）。
最終日の振り返りでも達成できたねという合意ができましたし、わたし個人としても胸はって達成!と言えると思ってます。

「壮大」を外したのは、2日目に到達するには無理という意味では正解だったと思います。
逆にチームが継続していくなら手が届くって気もします。
それくらい、ワクワクするチームでした。


## メイングループワーク

成果物のボリューム（紙の量）としては、7つの班のうちで一番少なかったと思います。
原因は明らかで、あまり分業をしてないんですね。
各自で同じモデルに取り組んで、出来たものを出してすり合わせるというやり方を、かなり最後までしていました。
わたしとしては「納得感がある」という方針に見合っていて、良いワークができたと思っています。

たかだか 1ページで要件が書けるシステムなので、システム全体のユースケース図や、メインリソースの状態遷移図なんか描かなくてもわかりそうな気がしますが。
どうしてどうして、6人で出すと全員ばらばらだったりします。
どうしてこの要素を入れたのか、この要素を落としたのかという議論をするなかで、気づけたことが多くありました。

お互いの理解や解釈をきちんと共有してるという点は、ダントツだったと思います。
チームの発表は 1名が代表して行うのですが、発表して頂いたときに「そこ違うよ！」っていう点はなかったです。
ワークショップって競い合う場ではないので「うちの班が一番」とかは言っても意味ないことですが、まぁ、最高でしたね（きぱ）。

## 個人的な Problem と Try

なんとゆーか、参加者平均よりも実年齢も経験年数もだいぶ上ということもあり、けっこう自信満々だったのですが自分の至らなさは思い知らされました。

個人のスキルとしては今まで状態遷移図を、わかってるつもりでわかってなかったことがわかりました。
今回の復習をするとともに、実務でいろいろもぐもぐ試して血肉にしていきたいと思ってます。

あとグループワークで、突然走りすぎです。
社内研修では研修生相手に「周りを見ろ」って言ってるのに、参加する立場になるとこうかよ orz という。
ブロッコリーさんは出過ぎるでもなく抑えるべきところは抑えてて、こういう風になりたいなーと憧れを感じました。
まぁ、この反省は今までの人生で何度しても直らないんですが。。。

ともあれ、とても楽しく有意義な時間を過ごせました。
本当にみなさまありがとうございました！
【Swift4】WebViewを固定する〜シュッてやっても動かないようにする〜

恥ずかしながら、スワイプって言葉が頭に出てこなくて、
地味に探したので自分メモ。。。orz

参考：http://www.sirochro.com/note/swift-webview-bounce-false/


```Swift:縦方向のスワイプに反応しないようにする
   webView.scrollView.bounces = false
```




以下、x-codeより

```
var scrollView: UIScrollView { get }
The scroll view associated with the web view.
Declared in WebKit
```
associated：関連付いた
Declared：宣言された


```
var bounces: Bool { get set }
A Boolean value that controls whether the scroll view bounces past the edge of content and back again.
If the value of this property is true, the scroll view bounces when it encounters a boundary of the content. Bouncing visually indicates that scrolling has reached an edge of the content. If the value is false, scrolling stops immediately at the content boundary without bouncing. The default value is true.
```

> The default value is true 
デフォルトはtrue(スクロールがシュッシュできる)

以上です。
BingMapsにクリック時に吹き出しが出るプッシュピンを描画する

# コード

```javascript:javascript
//以下のサンプルをベースに作成
//https://www.bing.com/api/maps/sdkrelease/mapcontrol/isdk/reuseinfobox

//pushpinの情報
var pushpinsInfo = [
    {latitude:35.680900, longitude:139.766943, title:"pin1", description:"<a href='#'>説明1リンク</a>"},
    {latitude:35.685012, longitude:139.765897, title:"pin2", description:"説明2"}
];

//mapインスタンスを生成
var map = new Microsoft.Maps.Map(document.getElementById('myMap'), {
    /* No need to set credentials if already passed in URL */
    center: new Microsoft.Maps.Location(pushpinsInfo[0].latitude, pushpinsInfo[0].longitude) });

//infoboxは一つ作成して再利用する
var infobox = new Microsoft.Maps.Infobox(new Microsoft.Maps.Location(0, 0), { visible: false, autoAlignment: true });
infobox.setMap(map);

//pushpinを作成
var pushpins = [];

pushpinsInfo.forEach(function(info){
    var pushpin = new Microsoft.Maps.Pushpin(new Microsoft.Maps.Location(info.latitude, info.longitude),null);
    pushpin.metadata = info;

    Microsoft.Maps.Events.addHandler(pushpin, 'click', function (args) {
        infobox.setOptions({
            location: args.target.getLocation(),
            title: args.target.metadata.title,
            description: args.target.metadata.description,
            visible: true
        });
    });

    pushpins.push(pushpin);
});

map.entities.push(pushpins);
```

# 実行方法
* [Bing Maps V8 Interactive SDK](https://www.bing.com/api/maps/sdkrelease/mapcontrol/isdk/)ページのメニューから任意のサンプルコードのページを表示し、Javascriptタブにコードを貼り付けて、実行ボタンをクリックする
* 自分のアプリケーションに組み込む場合は、Bing mapキーを取得してコードを埋め込む
[Getting a Bing Maps Key](https://msdn.microsoft.com/ja-jp/library/ff428642.aspx)

# 参考：緯度・経度の調べ方
* [BingMap](https://www.bing.com/maps)で調べたいポイントを右クリックすると、ポップアップメニューに緯度・経度が表示される。
mackerel-plugin-accesslog で 複数のアクセスログを扱う


ポイントは3つ

- `[Key]`はユニークに
- Key1つに`command`は1つだけ
- `-metric-key-prex` はグラフのプレフィックスになるので分かりやすい名前でOK :+1:

```conf
[plugin.metrics.accesslog_default]
command = "mackerel-plugin-accesslog -metric-key-prefix default /var/log/nginx/default.access.log"

[plugin.metrics.accesslog_localhost]
command = "mackerel-plugin-accesslog -metric-key-prefix localhost /var/log/nginx/localhost.access.log"

[plugin.metrics.accesslog_exmaple_com]
command = "mackerel-plugin-accesslog -metric-key-prefix example.com /var/log/nginx/example.com.access.log"

[plugin.metrics.accesslog_api_exmaple_com]
command = "mackerel-plugin-accesslog -metric-key-prefix api.example.com /var/log/nginx/api.example.com.access.log"

[plugin.metrics.accesslog_img_exmaple_com]
command = "mackerel-plugin-accesslog -metric-key-prefix api.example.com /var/log/nginx/img.example.com.access.log"
```

お手軽ですね

- [mackerel\-agent\-plugins/mackerel\-plugin\-accesslog at master · mackerelio/mackerel\-agent\-plugins](https://github.com/mackerelio/mackerel-agent-plugins/tree/master/mackerel-plugin-accesslog)
- [mackerel\-plugin\-accesslog徹底解説 \- Mackerel ブログ \#mackerelio](https://mackerel.io/ja/blog/entry/advent-calendar2017/day9-mackerel-plugin-accesslog)
mo
GCEにスマホで接続

Google Cloud PlatformのCompute Engineに、スマホで接続する時に使ったAndroidアプリを紹介します。
下記のSSHのアプリで接続出来ました。
このアプリで公開鍵と書かれているのは、秘密鍵の方です。
ユーザー名@外部IPアドレス　の指定でアクセス出来ました。
私は、Macで接続する時に使っている秘密鍵をスマホにコピーしてアプリにセットしました。

https://play.google.com/store/apps/details?id=org.connectbot
![20180618_233710.png](https://qiita-image-store.s3.amazonaws.com/0/20977/372f67e3-ddb7-932e-27ca-87d7974e1b78.png)
bitcoinの起動・停止

※ Bitcoin Core Daemon version v0.16, Mac OSX 10.12

## 起動
```
$ cd bitcoin/src
$ ./bitcoind -daemon
```

## 起動状態の確認
```
$ ./bitcoin-cli getnetworkinfo
$ ./bitcoin-cli getblockchaininfo
```

## 停止
```
$ ./bitcoin-cli stop
```

## 参考
[起動・停止](http://bitcoin.clock-up.jp/contents/admin/run)
bitcoinのデータの保存場所を変更する

下記3つのやり方のいずれかで変更できる。
※ Bitcoin Core Daemon version v0.16, Mac OSX 10.12

## 1. bitcoindの起動時に -datadir オプションを付ける
```
$ cd bitcoin
$ ./src/bitcoind -datadir <ディレクトリ名>
```

## 2. 設定ファイルに設定する
[Bitcoin Core Config Generator](https://jlopp.github.io/bitcoin-core-config-generator/)で設定ファイルを自動作成できる。

```$HOME/Library/ApplicationSupport/Bitcoin/bitcoin.conf
rpcuser=hoge
rpcpassword=hoge

# 下記を追記
datadir=<ディレクトリ名>
```

## 3. ソースコード上でデフォルトの保存場所を変更する
```src/util.cpp
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -707,14 +707,14 @@ fs::path GetDefaultDataDir()
fs::path GetDefaultDataDir()
 {
     // Windows < Vista: C:\Documents and Settings\Username\Application Data\Bitcoin
     // Windows >= Vista: C:\Users\Username\AppData\Roaming\Bitcoin
     // Mac: ~/Library/Application Support/Bitcoin
     // Unix: ~/.bitcoin
 #ifdef WIN32
     // Windows
     return GetSpecialFolderPath(CSIDL_APPDATA) / "Bitcoin";
 #else
     fs::path pathRet;
-    char* pszHome = getenv("HOME");
+    char* pszHome = "/";
     if (pszHome == nullptr || strlen(pszHome) == 0)
         pathRet = fs::path("/");
     else
         pathRet = fs::path(pszHome);
 #ifdef MAC_OSX
     // Mac
-    return pathRet / "Library/Application Support/Bitcoin";
+    return pathRet / "<ディレクトリ名>";
```

変更後、ソースコードをコンパイルしてbitcoindを立ち上げる。

## 参考
[Running Bitcoin](https://en.bitcoin.it/wiki/Running_Bitcoin)
wordpress address とsite addressの違いについて

##この２つの違いについてしらべていきます。

>what is the diffrence btw these

ここらへんでうまくひっとするとおもいます。

https://www.wordher.com/whats-difference-wordpress-address-site-address/

とりあえずここからわかったことは、wp addressはadminのおいている場所で、site addressは　お客様に来てもらう場所とのことらしい。　これは変える必要があったのか？
Xcode 10 beta のリリースノートを翻訳してみる（2018/6/19~追記中）

職場でチームの方と話していて
ノリでXcode10 betaのリリースノートを翻訳してみることに。
全部で39ページあるので（やば。多い。。）徐々に追記していきます。

本文はApple Developerにログインした状態で以下に掲載
https://download.developer.apple.com/Developer_Tools/Xcode_10_beta_3/Release_Notes_for_Xcode_10_beta_3.pdf

#Xcode10 beta リリースノートCopyright
Copyright © 2018 Apple Inc.
##SDKバージョン
Xcode10 beta は SDKs for iOS 12, watchOS 5, macOS 10.14, and tvOS 12を含んでいます。

##インストール
Xcode10 beta は前バージョンのXcodeと共存させることができます。

プレリリースバージョンのXcodeはdeveloper.apple.comから作成可能になり、
XIPファイルとしてまとめられます。ベータ版のXcodeをインストールするには、
そのXIPファイルをダウンロードして、ダブルクリックで展開してから、
Xcode-beta.appをApplicationsフォルダへドラッグアンドドロップで置いてください。
コマンドラインツールをベータ版のXcodeから使用するには、以下を入力してください。

```
run xcode-select -s <path to Xcode>
```

最終的なXcode10はApp Storeから可能となります。
以前のバージョンのダウンロードはdeveloper.apple.com/downloads/moreから可能です。

##追加の開発ツールにアクセス

InstrumentsやFileMergeのような追加の開発ツールを起動するには、 
ベータ版のXcodeを起動してXcode > Open Developer Toolを選択しましょう。
これらの開発ツールはXcodeを起動していなくても、Dockから直接アクセス可能のままにできます。

##テクニカルサポートと機能の学習
Appleは以下にXcodeでの開発サポートを提供します。

- Apple Developer Forums
Appleプラットフォームと開発者ツールを使用した開発についての討論に参加しましょう.
　　

- Bug Reporter.
問題を報告し、 リクエストを強化して, Appleにフィードバックをお寄せください。
　

- Apple Developer サイト.
最新のより最新の開発情報をXcode向けの技術文書として手に入れましょう。
　

- Xcodeのホームページ.
最新のXcodeリリースについて、さらに高度な情報を手に入れてください。
最新をインストールしてXcodeのbetaを試しましょう。
Xcodeを使用するためのヘルプは Help > Xcode Helpで見ることができます。

##非推奨のお知らせ
- MacOS10.14では32ビットアプリケーションのコンパイルサポートを含みません。
i386へのコンパイルが必要な場合はXcode９.4以下が必要になります。
　

- SVNのサポートは削除されました。
　
- dtrace基盤のカスタム計測は、macOSとシミュレーターのみでInstruments内で使用できなくなりました。新しいカスタム計測パッケージは、より柔軟で、データ表示をコントロールでき、全てのプラットフォームをサポートするos_signpostに基づいています。
　

- libstdc++でのビルドはXcode８で非推奨となり、Xcode10でiOS向けにサポートされなくなります。
C++言語プロジェクトはlibc++へのマイグレーションと、iOS７以降の実行ターゲットを設定することが推奨され、開発者はlibstdc++ (-lstdc++, -lstdc++.6.0.9, libstdc++.6.0.9.tbd, and libstdc++.6.0.9.dylibを含む)への依存性を削除するため、
ハードコードされたリンカのフラグと、ターゲットの依存性を監視しなければなりません。
libstdc ++に対して構築された静的アーカイブなどのプロジェクトの依存関係も、libc++に対して再構築する必要があります。(40885260)

##コマンドラインツール
コマンドラインツールパッケージは、macOS SDK内にmacOSシステムヘッダーをインストールします。
インストールされたツールでコンパイルされたソフトウェアは、標準で以下のパスでmacOSヘッダーを検索します

```
/Applications/Xcodebeta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.1
4.sdk/usr/include
```

/usr/includeにあるベースシステムのmacOSヘッダを探す旧型ソフトを使用する場合、
以下にあるパッケージをインストールしてください。

```
/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
```
意図したバージョンのコマンドラインツールを使用していることを確認するには、
インストール後に以下のxcode-selectコマンドを実行してください。

```
xcode-select　-s <path to Xcode>
```
Linux NISクライアントがハングアップする

Ubuntu 18や最近のDebian testingやArch LinuxでNISを用いた認証を行うようにすると25秒間固まる。これはsystemdバージョン235からsystemd-logindが一切のネットワーク通信を出来ないように設定されているからである。これを解決するための方法はいくつかあり以下のどれかを実行すればよい。

* `/lib/systemd/system/systemd-logind.service` の `IPAddressDeny=any` の行をコメントアウトする
* [unscd](https://packages.ubuntu.com/ja/bionic/unscd) をインストールする(nscdは問題が多いのでやめたほうがよい)

この問題は[systemdの開発者に認識されているがsystemdのほうで修正される予定はない](https://github.com/systemd/systemd/pull/7343/commits/695fe4078f0df6564a1be1c4a6a9e8a640d23b67)

またLXCやsystemdのコンテナ内でNISを使うと `systemd-sysusers.service`の起動時にハングアップすることがあるが、それは `systemd-sysusers` が `rpcbind.socket`と通信しようとするときに `rpcbind.service` が可動していないからである（[バグレポートはここ](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=950822)。対応策は

```config:/etc/systemd/system/rpcbind.socket.d/after.conf
[Unit]
After=systemd-sysusers.service
```

というファイルを作ることである。
wordpressにhttpからhttpsに自動的に変換させる方法

##自動的にhttpsに変換する
もうすでにcloudflareによって、無料で暗号通信をしてもらっているのだが、これをwordpressのサイトアドレスにすると、うまく表示されないので、いったん、httpで登録したらうまく出来た
そしてhttpsを利用したので、自動的に変換してくれるような仕組みを構築中

たぶんなにかプラグインがあるはず。

>how to redirect http to https

以下のファイルを.htaccessに入れれば良いらしい

```.htaccess
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L]
```
このコードを<IfModule mod_rewrite.c> タグの中に入れていきましょう。

cloudflareがいるから干渉をしているかもしれない。
というわけでやっても意味がないことがわかった。

##今後の課題
httpsをサイトのURLにすると、ワードプレスのデザインが崩れてしまう問題を解決する。
wordpressにログインができない問題を解消

##ログイン問題
あたらしくドメインを設定したので、ワードプレスからサイトのアドレスを変更したらadminへ移動できなくなったので修正します。

http://www.richaranclub.com/blog20130301/

たとえば、
独自ドメインを設定したあとのアドレスとして、
https://example.com
だとして、
もとのアドレスが、
http://example.original.com
だとしましょう。
config fileに次のコードを挿入します。

```wp-config.php
define('WP_SITEURL', 'http://example.original.com');
define('WP_HOME', 'https://example.com');
```

ウェブは動作が起きてからつまり、結果が発生してから、こういうものだと思ったほうが学びが早い。

##ワードプレスアドレスはそのままに
ワードプレスアドレスはもとのアドレスですね。
サイトアドレスは、独自ドメインの場所を設定する。

これだとうまく行かなかったですね。
りょうほうとも変える必要があるかもしれないです。
こちらが公式サイトです。

```
define('WP_HOME','http://yourdomain.com');
define('WP_SITEURL','http://yourdomain.com');
```

こちらが参考になります。
https://www.000webhost.com/forum/t/how-to-change-wordpress-domain/41316


これをみるとどうやら一番下にコードを挿入するとのことです。
なんだかウェブで大事なことってすべてのパターンを体験してみるっとことかもしれないですね。
Chef executeリソースおける指定実行ユーザーのHOMEなどの環境変数設定はsu - (su --login)の使用が容易


#問題
Chef executeリソースおける実行ユーザーを指定する場合、そのユーザーへのログイン時に設定される内容は取り込まれないので、注意が必要

#execute リソースのenvironment property対応

```ruby
execute 'foo' do
  command 'bar'
  user 'baz'

  # こんな感じ
  environment ({'HOME' => '/home/haz'})
end
```
- 面倒
- 取りこぼしリスク 

必要な環境変数が多いと、面倒かつ取りこぼしてしまうリスクがある


#sudo --loginによる対応

ログインシェルとして、環境変数も設定して実行
こんな感じ

```ruby

node.default['foo']['execute']['bar']['user'] = 'usr1'
node.default['foo']['execute']['bar']['command'] = 'cmd1'

node['foo']['execute'].each do |e_name, e_attr|

  execute e_name do

    # su - (su --login) にてユーザー用環境変数を設定させてコマンド実行
    command %(su - #{e_attr['user']} -c "#{e_attr['command'].gsub('"', '\"')}")
    user 'root'
  end

end

```

- 簡単
- 取りこぼし難い
- su -c に渡す文字列を"や'で囲うと、文字列中でそれを使う際にエスケープが必要 


#少し書き直し：
"や'のエスケープがイマイチなので少し書き直し

```ruby

node.default['foo']['execute']['bar']['user'] = 'usr1'
node.default['foo']['execute']['bar']['command'] = 'cmd1'

node['foo']['execute'].each do |e_name, e_attr|

  execute e_name do

    # su - (su --login) にてユーザー用環境変数を設定させてコマンド実行
    command %(su - #{e_attr['user']} -c "$(cat <<'_EOC_'
#{e_attr['command']}
_EOC_
      )"
    )
    user 'root'
  end

end

```

シングルクォートで終了文字を括ったシェルのヒアドキュメントは、シェルとしては何も展開しない事を利用。

#参考

```
$ man su
...
       -, -l, --login
              Starts the shell as login shell  with  an  environment
              similar to a real login:

                 o      clears  all environment variables except for
                        TERM

                 o      initializes the environment variables  HOME,
                        SHELL, USER, LOGNAME, PATH

                 o      changes to the target user's home directory

                 o      sets argv[0] of the shell to '-' in order to
                        make the shell a login shell
...
```
pythonで配列のn番目の要素が存在するかチェックする

Perlスクリプトからpythonへ移植しているところでちょっとつまずいたのでメモメモ。

```pl:array.pl
use strict;
use warnings;

my @ary;
@ary = (11,0,33); # 二番目の要素は存在するよ 0
#@ary = (11);     # 二番目の要素は存在しないよ

if(defined $ary[1]) {
  print("二番目の要素は存在するよ $ary[1]\n");
}
else {
  print("二番目の要素は存在しないよ\n");
}
```

やりたいことはn番目の要素があるかどうかだけチェックしたい。

```pl:array.py
ary = [11, 0, 33] # 2番目の要素は存在するよ 0
#ary = [11]       # 2番目の要素は存在しないよ
if len(ary) > 1:
    print("2番目の要素は存在するよ {}".format(ary[1]))
else:
    print("2番目の要素は存在しないよ")
```

これで間違いではないのだけれど、長さを取るというよりは”n番目があるか知りたい”のでダイレクトアクセスしてみる

```py
ary = [11, 0, 33] # 2番目の要素は存在しないよ
#ary = [11]       # IndexError: list index out of range

if ary[1]:
    print("2番目の要素は存在するよ {}".format(ary[1]))
else:
    print("2番目の要素は存在しないよ")
```

if文で0がFalseと判定された上、要素がない場合は例外となってしまった。

[jijixi's diary \- ようやくすごしやすい気温に… , そのインデックスに要素が存在するかわからないときの書き方を考える , どこに重点を置くかで文\.\.](http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20070816)

配列のスライスを使えばいいそうな。

```py:array2.py
ary = [11, 0, 33] # 2番目の要素は存在するよ 0
#ary = [11]       # 2番目の要素は存在しないよ

if ary[1:2]:
    print("2番目の要素は存在するよ {}".format(ary[1]))
else:
    print("2番目の要素は存在しないよ")
```

exists()メソッドとか無いのかしら。


# 参考

[jijixi's diary \- ようやくすごしやすい気温に… , そのインデックスに要素が存在するかわからないときの書き方を考える , どこに重点を置くかで文\.\.](http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20070816)

[Matzにっき\(2007\-07\-19\)](http://www.rubyist.net/~matz/20070719.html#p01)
> 私がPythonで嫌いな5つのこと。
listにdictのget相当(範囲外でNoneを得る)がない

[\[Python\] listが空かどうか判定する方法2つ \- Qiita](https://qiita.com/yonedaco/items/d0f65ca3dad2e085a51d)
000webhostのロゴを非表示にする方法

##CSSの編集をする
以前この投稿をしたのだが、同じ方法でできなかったので、　最後検証も込めて、最投稿します。こちらが最新版

>how to remove a logo in 000webhost

まぁまずはここらへんの英語表現が必要になりますね。
ちょっと違う方法があったので、まとめてみますね。

まずは編集を000webhostのホームページから行う方法。
画像はaltから持ってくる。
indexファイルを編集して、
スタイルで挟む

具体的コードとしては以下のとおりです。
それで、indexをさがして、以下のコードを挿入すればいいだけ

```
<style>
img[alt="www.000webhost.com"]{display:none;}
</style>
```

これは一番簡単な方法かもしれないですね。
これを外観からヘッダーに挿入すればいいだけです。

なにかご質問があるかたはコメント欄へお気軽にどうぞ