OmniAICreator/Qiita-1.07M huggingface dataset:
ポインタ

##教科書などにあるポインタ

```golang
package main

import "fmt"

func main() {
	var n int = 100
	var p *int = &n

	fmt.Println(n)  // 100
	fmt.Println(&n) // 0xc000014078
	// fmt.Println(*n) // ポイント型ではないのでエラーになる
	fmt.Println(p)  // 0xc000014078
	fmt.Println(*p) // 100
	fmt.Println(&p) // 0xc00000c028
}
```

イメージは以下の通り
![スクリーンショット 2018-12-29 1.36.44.png](https://qiita-image-store.s3.amazonaws.com/0/125499/60b9d53e-16dd-7a90-33f5-a9e25d866aed.png)


##構造体のポインタ

そして、分からないのが構造体のポインタ


```golang
package main

import "fmt"

type Vertex struct {
	X int
	Y int
}

func main() {
	v := Vertex{1, 2}
	p := &v
	fmt.Println(v)  // {1 2}
	fmt.Println(&v) // &{1 2}

	fmt.Println(p)  // &{1 2}
	fmt.Println(*p) // {1 2}
	fmt.Println(&p) // 0xc00000c028
}
```


イメージは以下の通り
![スクリーンショット 2018-12-29 1.48.53.png](https://qiita-image-store.s3.amazonaws.com/0/125499/5c9ded1a-c03c-a8f2-d3b2-12717e30f26f.png)


アドレスが、```&{1 2}``` という形式になっている？？？
わかる方教えてください。

直接アドレスと指定した場合は以下の通り


```golang
package main

import "fmt"

type Vertex struct {
	X int
	Y int
}

func main() {
	v := &Vertex{1, 2}
	fmt.Println(v)  // &{1 2}
	fmt.Println(*v) // {1 2}
	fmt.Println(&v) // 0xc00000c028
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125499/e833a1ac-2b42-bc47-5aa8-a6b72bd85179.png)



関数経由で、構造体を宣言する場合（カプセル化に利用できる？）
イメージは上と同じ

```golang
package main

import "fmt"

type Vertex struct {
	x, y int
}

func New(x, y int) *Vertex {
	return &Vertex{x, y}
}

func main() {
	v := New(1, 2)  // v := &Vertex{1, 2} と同じ
	fmt.Println(v)  // &{1 2}
	fmt.Println(*v) // {1 2}
	fmt.Println(&v) // 0xc00000c028
}
```
ディレクトリ構成図をlatexで作成する方法

以下のようなディレクトリ構成図を作成したい。
<img width="243" alt="キャプチャ.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/329556/6a1e4997-d4d6-40c7-f2c5-452f14861ad7.jpeg">

1. ここからdirtreeをダウンロードします。https://ctan.org/tex-archive/macros/generic/dirtree
2. dirtree.styファイルが含まれてないので、コマンドプロンプトを開きdirtree.styを作成します。

    ```
    $ cd C:\w32tex\share\texmf-dist\tex\latex\dirtree
    $ latex diretree.ins
    ```

1. dire.pngとして以下のアイコンを作業環下に保存します。
![dire.png](https://qiita-image-store.s3.amazonaws.com/0/329556/b58fc9d9-a70b-f0e0-8361-eaa1baf9ea48.png)

1. latexで以下のように記述します。

```
\usepackage{dirtree}
\begin{document}
\renewcommand\DTstyle{\ttfamily}
\dirtree{%
 .1 \makebox[2ex][r]{\includegraphics[width=0.25cm]{dire.png} myapp}.
 .2 \includegraphics[width=0.25cm]{dire.png} app.
 .3 \includegraphics[width=0.25cm]{dire.png} assets.
 .3 \includegraphics[width=0.25cm]{dire.png} config.
 .3 \includegraphics[width=0.25cm]{dire.png} images.
 .3 \includegraphics[width=0.25cm]{dire.png} javascripts.
 .3 \includegraphics[width=0.25cm]{dire.png} stylesheets.
}
\end{document}
```
ログローテーション(/etc/logrotate.conf, /etc/logrotate.d)のディレクディブ一覧

# はじめに
ログローテーションの設定は`/etc/logrotate.conf`ファイルや、`/etc/logrotate.d`配下のファイルで行います。
この記事では、ログローテーションの設定に使用するディレクティブを整理しました。

```/etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
	minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.
```

# ログローテーションのディレクティブ
create・・・ログファイルを作成する
missingok・・・ログファイルが存在しなくても、エラーとして扱わない
nomissingok（デフォルト設定）・・・ログファイルが存在しない場合、エラーとして扱う
rotate・・・保存するログファイルの世代設定
daily, weekly, monthly, yearly・・・ローテーション周期の設定
compress・・・古いログファイルを圧縮する
delaycompress・・・次回のログローテーション時に古いログファイルを圧縮する
nocompress・・・古いログファイルを圧縮しない
compresscmd・・・ログファイルの圧縮コマンドを指定する（デフォルトでは、gzip）
sharedscripts・・・スクリプトを一度だけ実行する
postrotate/endscript・・・ログローテーション後に実行するスクリプト
notifempty・・・ログファイルが空の場合、ログローテーションしない
minsize, size・・・ログファイルが指定したファイルサイズより小さい場合、ログローテーションしない
nocreate・・・ログファイルを新規作成しない
mail・・・ログローテーション後にメール送信する
GAE Go にデプロイするときの .env について

GAE Go にデプロイするときの `.env` どうしようかと思ったのですが

`joho/godotenv` を使って

ここに書いてあるようにしようと思いました。
https://github.com/joho/godotenv#precendence--conventions

```go:Precendence&Conventions
env := os.Getenv("FOO_ENV")
if "" == env {
  env = "development"
}

godotenv.Load(".env." + env + ".local")
if "test" != env {
  godotenv.Load(".env.local")
}
godotenv.Load(".env." + env)
godotenv.Load() // The Original .env
```

# やることは簡単

`FOO` という名前のアプリだとして、 `FOO_ENV` を各環境に設定します。

開発環境は `docker-compose` なので、

```yaml:docker-compose.yml
services:
  golang:
    environment:
      FOO_ENV: development
```

としました。

そして、GAE環境は、以下の参考にしながら
https://cloud.google.com/appengine/docs/standard/go111/config/appref

```yaml:app.yaml
runtime: go111
env_variables:
  FOO_ENV: production
```

としました。

あとは、環境ごとに `.env` を用意します。

```
.env.development
.env.production
```

これで、`gcloud app deploy` として無事動きました。めでたしめでたし。

# だけど、途中でひとつこまったことがあります。

GAE の環境変数が正しく設定されているのかを確認したくて、GAE に ssh しようと思ったのですが、うまくいきませんでした。原因は僕が今使っているのが、フレキシブル環境ではなく、スタンダード環境だったからでした。たぶん。

フレキシブル環境だとドキュメント見つかるけどスタンダードだと見つからずでした。
https://cloud.google.com/appengine/docs/flexible/go/debugging-an-instance?hl=ja

以上です :lemon:
Windows10 Pro で Hyper-V が動かない場合の対処

# Docker For Windows を使いたい場合
Docker For Windowsを使う場合、Hyper-Vが必要になりますが、端末によってはHyper-Vが有効になっていません。

コントロールパネルからWindows既定のプログラム内にある Hyper-V を有効にして再起動すれば、Dockerを使う準備が完了します。
ですが端末によってはコントロールパネルやWindows Power ShellからHyper-Vを有効にしようとしても 「構成レジストリキーを読み取れません」のエラーとなり、実行できません。

この場合、以下の方法で対処可能でした。

https://social.technet.microsoft.com/Forums/ie/en-US/3bc84318-d973-45c2-8218-ff1a24c507d9/if-i-try-to-enable-hyperv-i-have-the-following-error-quotone-or-several-parent-features-are?forum=MVMC

* コマンドプロンプトを管理者で実行
* 以下のコマンドを1行ずつ実行する

```
SC config wuauserv start= auto
SC config bits start= auto
SC config cryptsvc start= auto
SC config trustedinstaller start= auto
```

* 再起動を実施

場合によっては再起動中にWindowsの再構成が始まります。

# 参考文献

https://qiita.com/anikundesu/items/90a7706b434daed5e266
よく使うPSQLコマンド

# PSQLコマンド一覧

| PSQLコマンド | 説明 |
|---|---|
| \l | データベース一覧 |
| \c データベース名 | データベース変更|
| \dn | スキーマ一覧 |
| set search_path = スキーマ名, ... | スキーマ設定 |
| show search_path | スキーマ確認 |
| \d | テーブル一覧 |

# References
- [[PostgreSQL] よく使うコマンドまとめ](https://dev.classmethod.jp/server-side/db/postgresql-organize-command/)
- [PostgreSQL 9.6.5文書](https://www.postgresql.jp/document/9.6/html/index.html)
AlexaとGoogleカレンダーを連携する

# はじめに
AlexaのiPhoneアプリを使ってて、何ができるか色々探してたのですが、
めちゃくちゃ簡単にGoogleカレンダーと連携できたので、そのやり方を書いてみます。

# AlexaとGoogleカレンダーの連携
#####1. Alexaアプリ起動
まずはAlexaアプリを起動します。左上の「≡」をタップします。
<img width="375" alt="IMG_4478.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105220/832add2b-51b8-4506-e9f6-c70c9bdaffe3.png">

#####2. 設定を開く
メニューが表示されるので、「設定」をタップします。
<img width="375" alt="IMG_4479.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105220/df94baad-14d3-d09c-ef45-a1a9ddc417c5.png">

#####3. カレンダー設定を開く
設定メニューが表示されるので、「カレンダー」をタップします。
<img width="375" alt="IMG_4480.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105220/893f1bb3-a36b-de41-2710-f13a62c0cc03.png">

#####4. Googleアカウントを開く
カレンダーメニューが表示されるので、「Google」をタップします。他にもMicrosoftアカウントやAppleアカウント、Microsoft Exchangeとも連携できるので、結構便利ですね。
<img width="375" alt="IMG_4481.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105220/2f40cdad-5985-7e3a-40c1-821893d48c26.png">

#####5. アカウントリンク
アカウントをリンクするかを問われるので、「Continue」をタップします。
<img width="375" alt="IMG_4482.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105220/abef224c-482c-9c5a-5edc-9e2eb1a6b3e6.png">

#####6. ログインユーザー入力
ログインユーザーを入力する画面が表示されるので、GoogleアカウントIDを入力して、「次へ」をタップします。
<img width="375" alt="IMG_4483.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105220/28585d8d-19f1-e298-f05d-0b4e1b5b9cea.png">

#####7. ログインパスワード入力
パスワードを入力する画面が表示されるので、Googleアカウントのパスワードを入力し、「次へ」をタップします。
<img width="375" alt="IMG_4484.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105220/f989986e-c5f3-9689-9c03-8ef5b6e8358e.png">

#####8. 【任意】２段階認証
次は、設定している人／していない人がいますが、僕は設定していますので、２段階認証のコードを入力し、「次へ」をタップします。（もし、２段階認証をしていない方がいたら、すぐにすることをオススメします。[ココ](https://www.google.com/landing/2step/?hl=ja)を読んで理解した上で設定してください。オススメアプリは[Authy](https://authy.com/)（個人の見解）です。
<img width="375" alt="IMG_4485.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105220/6bea7668-2877-1194-593a-a4a8946f18b4.png">

#####9. Googleアカウントへのアクセス許可
AlexaがGoogleアカウントへのアクセスを許可するかの確認になります。今回は利用するので、「許可」をタップします。
<img width="375" alt="IMG_4487.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105220/24188b7a-5311-5740-1dfc-939f88c72b94.png">

#####10. カレンダーの紐付け
どのカレンダー情報とリンクするかの確認になります。今回はモザイクしていますが、メインのメールアドレスに紐付いてるカレンダー情報のみを利用するため、チェックは一つのみで行います。
<img width="375" alt="IMG_4488.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/105220/3ff50d2d-83e4-c2f1-6ebb-93ad74e1c760.png">

これだけ。
めちゃめちゃ簡単ですね。

# デモ
実際に動かしてみました。ほんと簡単。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AlexaとGoogleアカウントをリンクさせて、カレンダー情報を共有してみました。めっちゃ簡単。<a href="https://twitter.com/hashtag/alexa?src=hash&amp;ref_src=twsrc%5Etfw">#alexa</a> <a href="https://twitter.com/hashtag/googlecalendar?src=hash&amp;ref_src=twsrc%5Etfw">#googlecalendar</a> <a href="https://t.co/WaomSeqMDJ">pic.twitter.com/WaomSeqMDJ</a></p>&mdash; daiki Are@Z mori @Japan (@areaz_) <a href="https://twitter.com/areaz_/status/1081045118956691456?ref_src=twsrc%5Etfw">2019年1月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【jQuery】チェックボックスとボタンの連動

# チェックボックスとボタンの連動に関してのまとめです。
(jQuery使用)

>checkbox に check が付いてる時： ボタン押せて、 Google に遷移する
>checkbox に check が付いていない時： ボタン押したら alert 出す

このようなお題をもとに実装してみました。

https://thimbleprojects.org/szaizen/614600/

まず最初に、チェックによってdisableの属性を付与するかしないかしようかなぁと考えたのですが、
disable時にボタンをクリックしてalert出すのが難しそうなので、
disableにするのではなく、disableであるように見せる方法で行こうと考えました。

html
チェックボックスとボタンを作成します。

```html:html
<h1>Javascriptの課題です</h1>
    <div>
      <label for="check">同意する</label>
      <input type="checkbox" id="check">
    </div>
    <div id="btn" class="btn disable">ボタンです</div>
```

css
チェック時のボタンのスタイル　→　btnクラス
非チェック時のボタンのスタイル　→　disableクラス

```css:css
.btn {
  display: inline-block;
  padding: 0.5em 1em;
  color: #FFF;
  background-color: darkorange;
  font-size: 15px;
  cursor: pointer;
}
.btn:hover {
  background-color: orange;
}
.disable {
  background-color: gray;
  cursor: not-allowed;
}
.disable:hover {
  background-color: gray;
}
```

javascript
チェックボックス操作時
- チェックされている場合　⇒　disableクラスを取り除く（removeClassメソッドを使用）
- チェックされていない場合　⇒　disableクラスを追加する（addClassメソッドを使用）

ボタン押下時
- チェックされている場合　⇒　ページを遷移する
- チェックされていない場合　⇒　アラートを表示する
 
```javascript:javascript
$(function() {
  
  //チェックボックス操作時
  $('#check').click(function(){
    if($(this).prop('checked')) {
      $('#btn').removeClass('disable');
    } else {
      $('#btn').addClass('disable');
    }
  });
  
  //ボタン押下時
  $('#btn').click(function(){
    if($('#check').prop('checked')) {
      window.location.href = 'https://www.google.co.jp/';
    }else{
      alert('同意するにチェックして下さい');
    };
  });
  
});
```
lubuntu 18.10 使ってみた

## 日本語入力

* 参考: [Lubuntu 18.10 その11 - 日本語を入力できるようにするには・日本語向けパッケージのインストール - kledgeb](https://kledgeb.blogspot.com/2018/10/lubuntu-1810-11.html)


```sh:こちらの方法は手間だった
## こちらの方法は手間だった
# apt install -y language-selector-gnome
# gnome-language-selector
# -> 日本 を追加してインストール。大変・・・。

# こっちのほうが早い
apt install -y \
 language-pack-ja \
 firefox-locale-ja \
 libreoffice-l10n-ja \
 libreoffice-help-ja \
 fonts-noto-cjk-extra \
 fonts-noto-color-emoji \
 fonts-noto \
 fcitx-mozc
```

## lubntu 18.10の ショートカットキー

|キー|動作|
|:--|:--|
|alt - ctrl - E | ファイラー |
|alt - ctrl - I | FireFox |
|alt - ctrl - D | デスクトップの表示 |
|alt - ctrl - T | Qtermianl |
|alt - ctrl - L | スクリーンセイバー |

`alt - ctrl - T`のキー割当は簡単には変更できないようで
xfce4-terminal を割り当てるときは`Meta - T` がよいと思う。 


## QTerminalが使いづらく感じた

`xfce4-terminal` に慣れているため、いろいろ使いづらい。
`apt install xfce4-terminal`して xfce4-terminal を使うことにしました。

* 日本語と英語の文字サイズが均一ではない。

* タブ切り替えのショートカットキーが使いづらい
    * (Alt + 数字キーに対応していない)

* 日本語をダブルクリックしたときの選択範囲がxfce4と違う。
    * QTerminal だと 1文字だけ選択される
    * xfce4-terminal だと 区切り文字まで選択される


----

## xubuntu 18.10の ショートカットキー

|キー|動作|
|:--|:--|
|alt - ctrl - D | デスクトップの表示 |
|alt - ctrl - T | Qtermianl |

* mate, linuxmint, kubuntu, ubuntuなど使いましたがやはりxubuntuが一番好み。
1から100までの足し算を視覚的に簡単にしてみる。

#1から100までの足し算を視覚的に簡単にしてみる。

かの偉大な数学者ガウスは1から100までの値をすべて足すという課題を

>1+100=101
2+99=101
…
50+51=101
101 *50 = 5050

と計算し、101 *50 = 5050と一瞬で計算したそうです。すごいですね。

つまり51以上の数を`reverse`することで列ごとの差分を打ち消し、計算を単純化させたということですね。
幼少期のガウスにグラフの概念があったのかどうか定かではありませんが、
グラフで見るとどういう感じで捉えることになるのか実験してみました。
##Pythonで1-50,51-100までの数値のリストを作成
```python:calc.py
import numpy as np
import matplotlib.pyplot as plt

# 1から100までの各要素を作成しreshapeで2行へ
nums = np.arange(1, 101, 1).reshape(2, -1)
# 50以下をlow,51以上をhighへ代入
low = nums[0:1].flatten()
#highはリバース
high = nums[1:2, ::-1].ravel()
fig, axe = plt.subplots(1, 2, constrained_layout=True, figsize=(12, 5), sharey=True)

axe[0].plot(low)
axe[0].set_title('low')
axe[1].plot(high)
axe[1].set_title('high')
```
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/302092/3c203d66-5db2-af85-ba25-8217974905f6.png)

ちょっとわかりにくいですが、斜辺の傾きが左右打ち消しあえそうなのがわかります。
ガウスがやったような計算方法で算出したグラフを足してみます。
##各列の合計値のグラフを足してみる

```python:calc.py

sum_len = []
for i, j in zip(low, high):
    sum_len.append(i + j)
plt.plot(sum_len, label="sum")
plt.legend()
```
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/302092/8d68ff5f-e85c-25b9-5881-759285f32a9e.png)

`high`と`low`を足した`sum`が各列ごとに101になっているのが確認できます。そして棒グラフにしてみます。
##棒グラフにしてみる
```python:calc.py
x_axis=np.arange(1,51,1)
plt.bar(x_axis, high, bottom=low, label='higher')
plt.bar(x_axis, low, label='lower')
plt.legend()

```
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/302092/7845cadd-90b3-6e91-6fc4-5acb7ca58cbc.png)

最初からこれを作成すればわかりやすかったですね笑。
グラフにすることで数字の両端同士を足すとどの列も101になるのが直感的にわかるようになりました。
"The working copy “5.CountUp” failed to commit files. Couldn’t communicate with a helper application."への対処

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261020/74f3152d-bc84-a685-0698-83445fccc72b.png)

このエラーへの対処法が、古い記事しかなかったので、記述しておく。
XcodeからPreferencesを開き、Source Control＞GITの項目を開きます。

Author Nameと、Author Emailの項目が空欄になっているかと思うので、埋めます。

その上で、もう一度Commitしてみると、無事うまくコミットできます。
XcodeとSwiftのバージョン対応表

## はじめに

SwiftはXcodeの一部として提供されています。
そのため、どちらか片方のみをバージョンアップすることは(私の知る限り)できません。

どのXcodeのバージョンがどのSwiftのバージョンに対応しているか忘れがちなので、一覧にしました。

## XcodeとSwiftのバージョン対応表

__太字__：メジャーバージョンアップ

|Xcode|Swift|リリース日|
|:--|:--|:--|
|13.3.1 (13E500a)|5.6|2022/04/11|
|13.3 (13E113)|5.6|2022/03/15|
|13.2.1 (13C100)|5.5.2|2022/12/18|
|13.2 (13C90)|5.5.2|2021/12/14|
|13.1 (13A1030d)|5.5.1|2021/10/26|
|__13.0 (13A233)__|5.5|__2021/09/21__|
|12.5.1 (12E507)|5.4.2|TBD|
|12.5 (12E262)|5.4|2021/04/26|
|12.4 (12D4e)|5.3.2|TBD|
|12.3 (12C33)|5.3.2|TBD|
|12.2 (12B45b)|5.3.1|2020/11/12|
|12.1 (12A7403)|5.3|TBD|
|__12.0 (12A7209)__|5.3|__2020/09/16__|
|11.7|TBD|TBD|
|11.6 (11E708)|5.2.4|TBD|
|11.5|5.2.4|2020/05/20|
|11.4.1|5.2.3|2020/04/29|
|11.4.1|5.2.2|2020/04/15|
|11.4|5.2.1|2020/03/30|
|11.4|5.2|2020/03/24|
|11.3.1 (11C504)|5.1.3|TBD|
|11.3 (11C29)|5.1.3|2019/12/13|
|11.2.1 (11B500)|5.1.2|TBD|
|11.2|5.1.2|2019/11/07|
|11.0|5.1.1|2019/10/11|
|__11.0 (11A420a)__|5.1|__2019/09/19__|
|10.3 (10G8)|5.0.1|2019/07/23|
|10.2.1 (10E1001)|5.0.1|2019/04/18|
|10.2 (10E125)|__5.0__|__2019/03/25__|
|10.1 (10B61)|4.2.1|2018/10/30|
|__10.0 (10A255)__|4.2|__2018/09/17__|
|9.4|4.1.3|2018/07/27|
|9.4|4.1.2|2018/05/31|
|9.3|4.1.1|2018/05/04|
|9.3|4.1|2018/03/29|
|9.2|4.0.3|2017/12/05|
|9.1 (9B55)|4.0.2|2017/11/01|
|__9.0__|__4.0__|__2017/09/19__|
|8.3.2|3.1.1|2017/04/21|
|8.3|3.1|2017/03/27|
|8.2|3.0.2|2016/12/13|
|8.1|3.0.1|2016/10/28|
|__8__|__3.0__|__2016/09/13__|
|7.3.1|2.2.1|2016/05/03|
|7.3|2.2|2016/03/21|

Swift 2.2より古いバージョンは記載していません。

## 参考リンク

- [Swift.org - Download Swift](https://swift.org/download/#releases)
- [More Software Downloads](https://developer.apple.com/download/more/)  
Apple Developerへのサインインが必要
- [Xcode Releases | xcodereleases.com](https://xcodereleases.com/)
PyCharmでpipenvを使うと挙動がおかしいときの対処法

# 発生した問題
- PyCharmでProject Interpreterをpipenvに設定したとき、PreferenceからパッケージをインストールするとJSON.Decode.Errorが発生する。(インストールやPipfileの書き換えは成功している)
- Preferenceにインストール済みのパッケージ一覧が表示されない。

そこから調査を開始して

- pipenv graphが表示されず`TypeError: 'module' object is not callable`が発生
- pipenvでパッケージのインストールやアンインストールをすると`TypeError: 'module' object is not callable`が発生(インストール・アンインストールやPipfileの書き換えは成功している)

#使用環境
- macOS Mojave
- PyCharm 2018.3.2
- Python 3.6.5(pyenv)
- pip 18.0
- pipenv 2018.7.1

# 解決方法
結論から言うと、pipenvによる仮想環境内部のpipのバージョンが18．1になっていたことが原因でした。
`pipenv run pip install pip==18.0`すればOK。

先に`pipenv run pip --version`してpipenv仮想環境内のpipのバージョンを確認しましょう。
同様のエラーは多くの人のところで発生していたようで、[こちら](https://github.com/pypa/pipenv/issues/2871)のissueでも取り上げられています。

PyCharmの表示もこれで解消されます。

# 参考
Running pipenv gives TypeError: 'module' object is not callable #2871
URL:https://github.com/pypa/pipenv/issues/2871

pip 18.1 causes "TypeError: 'module' object is not callable" #2924
URL:https://github.com/pypa/pipenv/issues/2924
@click="location.href=mmm" はvue.jsとvue.min.jsで動きが違う

雑に試していてハマりました

```
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <span @click="location.href=next">ok</span>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
<script>
    new Vue({
        el: "#app",
        data: {
            next: "test2.html",
        }
    });
</script>
</body>
</html>
```

これで、okをクリックするとエラーになります

```
Property or method "location" is not defined
```


vue.min.jsにするとtest2.htmlにジャンプします。

```
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <span @click="location.href=next">ok</span>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
    new Vue({
        el: "#app",
        data: {
            next: "test2.html",
        }
    });
</script>
</body>
</html>
```


ちょっと試すだけだったんですけどね。。。
基礎からのVMware Cloud on AWSーその６

VMware Cloud on AWSの基礎を
おさらいするための記事を書いてます。

過去５回は以下の内容をお届けしました。

第１回　物理構成の理解
https://qiita.com/hiroito1118/items/48d8d66fab24acd16c1d

第２回　管理方法と初期デプロイの概要
https://qiita.com/hiroito1118/items/8ed96c156b8577ca4749

第３回　ユースケース
https://qiita.com/hiroito1118/items/2669fc0ef64d8e07eb08

第４回　調達方法
https://qiita.com/hiroito1118/items/3ebbf3ce7a555d2f39f6

第５回　ハイブリッドクラウドを支えるネットワークサービス・製品
https://qiita.com/hiroito1118/items/7e57393e72d72e00d4a2


今回はAWSネイティブサービスとの接続のお話です。


# １．VMware Cloud on AWSとAWSネイティブサービスの関係性
VMware Cloud on AWSはEC2のベアメタルインスタンスを利用し、
構成されていることは過去にも掲載しました。
つまりAWS上にあることには変わりありませんので、
AWS上の各種サービスとつながりやすい状況にはあるのですが、
つながり方を含めて、いくつか理解しておくべきことがあります。

## １）VMware Cloud on AWSはVMwareのテナント上に構成される
VMware Cloud on AWSのSDDCをデプロイした場合、
自身（自社）のAWSアカウント内に作成されるのではなく、
VMwareが所有するアカウント内に作成されます。
これはVMware Cloud on AWSがVMwareレイヤのマネージメントも
付帯したサービスであるが故です。
各社毎にVPCが作成され、払い出されるイメージです。

ただし、VMwareのアカウント内に作成されるといっても、
自身（自社）でのAWSアカウントの作成は必須です。
デプロイのプロセス内で、紐づけ対象の
アカウントを聞かれるので入力する必要があります。

忘れずにAWSアカウントを先に作成しておきましょう。


## ２）自社環境との接続に用いられるCloud ENI
SDDCのデプロイ時にAWSアカウントを聞かれるのは、
自身（自社）のAWSアカウントと
VMware Cloud on AWSのSDDCを
Cloud ENI(Elastic Network Interface）で
接続する設定がされるためです。

このENIを経由することで、
SDDCと既存のAWS環境間がローカルLAN接続されたような
イメージで接続されます。
リンク速度は25Gbps（理論値上限）で接続されます。
この接続経由で通信する場合はインターナル通信と
同じになりますので、
特に通信料に課金されるようなことはありません。

SDDC環境とEC2等のサービス間で通信したい場合は、
このインターフェース経由で通信しましょう。

## ３）インターネット接続の利用
SDDC環境からインターネットへ接続する場合、
AWSネイティブのインターネットゲートウェイから
外部環境に接続可能です。
これを利用する場合の費用は
通常のAWSで利用する場合と大差ありません。

ただし、VPN利用に関しては、
オンプレミスとNSXなどVMの世界と接続するようにしてください。

## ４）Direct Connectとの接続
こちらも利用可能です。
該当する回線サービスを申し込みの上、
自身（自社）のAWSアカウント上で紐づけするようにしてください。


# ２．他の連携は？
本記事の執筆時点では、
実際のところ、SDDC環境とAWS環境が近いところで
接続されているということ以外は
それ以外に目立った連携性はないのが実際のところです。
作りこみを行えばCloudWatchなどは
利用できるのかもしれませんが、
通常のZabbixなど立てることと大差ないので、
連携らしい連携と呼べるものではないです。

ネットワーク的に近いことを生かした利用が
実際の考え方になると捉えるのがよいでしょう。

今回は以上です。
次回は、サポートに関する話題です。
電車通勤中はゲームしてないでスマホでjupyter-notebookしよう

##いきなり本文##
今までスマホではpythonistaなどのアプリを使って、ターミナルで色々インストールしたりしていましたが、先日"google colabratry"というものを発見しました。
PCではgoogle driveなどを開いて左上の「新規」をクリックし、その他のアプリからcolabratryを選択することで利用できます。
（最初は選択肢に出てこないので、アプリを追加する必要があります。）

スマホで利用する場合は、driveを開いてもこの選択が出来ませんのでURLを叩く必要があります。
https://colab.research.google.com

![colabratry.png](https://qiita-image-store.s3.amazonaws.com/0/193056/51188834-daae-15db-1439-81559ea0be6b.png)

と言いつつ、まだ自分でも電車内で試してないので操作性とかわかりません。
少なくとも自分はスマホほとんど使わない勢なので、タイピングはPCの方が絶対早いですが・・・
rm -rf / 押しちゃった！？やばい！ でも大事なのは、ミスの大きさじゃなくてリカバリータイムだよ



- 1年間ぐらい考えていたけど、ようやく記事にできた
- ソフトスキル、ハードスキル、プログラミング、サーバー操作などにかかわらず、大事なのはミスの大小よりもリカバリー時間
- たとえばSlackでの連絡のような報連相でも、いちど間違ったことを言っても、秒で訂正するのが素晴らしかったりする

え、編集で直さないの？ 編集コストの高さについては別の記事に書いた。どこだっけ。

---

e.g God i hit `rm -rf /` in Linux !! Miss is bad? High speed recovery is good / Engineer working tips

# Big miss is bad? small miss is good?

![image](https://user-images.githubusercontent.com/13635059/50672496-c6624080-101b-11e9-98b4-5e2817d8c8db.png)

# No! Bad is related with "Recovery time"

![image](https://user-images.githubusercontent.com/13635059/50672495-c5311380-101b-11e9-9538-20a761a6c3e0.png)

# if you missed big wrong case but even if Recovery time was short its Good!

smaller damage

# `rm -rf /` but if stop that process soon then lost data is few

# its not linux engineering topic only

We can hope soft kills hard skills both 
i was thinking about this topic while an year
and finally draw a sketch of Recovery Time and Miss Size Damage

ya :)


---

https://twitter.com/YumaInaura

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

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

# let miss and recovery!

many miss and recovery growth us many skills and wisdom


---

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 -->
Pythonでimport文を書く際の順番

pythonで外部モジュールを使用する際に使用するimport文ですが、importする順番があるらしいのでざっくりまとめてみました。

# 順番

```
1. 標準ライブラリ
2. サードパーティに関連するもの
3. ローカルな アプリケーション/ライブラリ に特有のもの

上のグループそれぞれの間には、1行空白を置くべきです。
```
## ライブラリの種類について補足
- 標準ライブラリ
pythonでデフォルトで用意されているライブラリ
例）sys,os,math

- サードパーティ製ライブラリ
pythonが提供しているもの以外で企業や個人がパッケージとして配布しているもの
「[PyPI](https://pypi.org)」という情報共有サイトにまとめられています

- ローカルなアプリケーション
上記以外で、独自にコンポーネント化した処理をまとめたファイルなど

# 参考
https://pep8-ja.readthedocs.io/ja/latest/#import
cocos2d-xのゲームをGitHubで公開する

普通どうするのかはよく知りませんが
作ったゲームというか作りかけのゲームをとりあえずGitHubに置くことにしました。
プロジェクトディレクトリには巨大なcocos2dディレクトリが作られますが
これはsubmoduleにすべきでしょう。

## GitHub側でリポジトリを作成
まずGitHub側で空のリポジトリ（ここではZombieHSと命名）を作成します。

## cocos2d-xのプロジェクトを作成
cocos2d-xのプロジェクトを作成します。
> cocos new ZombieHS -p io.github.tshibata.zombiehs -l cpp -d ~/Projects/
cd ~/Projects/ZombieHS/

## ローカルにリポジトリを作成
そしてcocos2dディレクトリを削除して
> rm -rf cocos2d/

リポジトリを作って
> git init

ここでsubmoduleを追加してしまってもよかったのですが
先にGitHubと繋げました。
> git add .
git commit -m "first commit"
git remote add origin https://github.com/tshibata/ZombieHS.git
git push -u origin master

それからsubmoduleを追加しました。
タグがついてる安定版を使うべきでしょう。（ここでは3.17を使用）
> git submodule add https://github.com/cocos2d/cocos2d-x.git cocos2d
pushd cocos2d/
git checkout cocos2d-x-3.17
popd
git add cocos2d/
git commit -m "submodule cocos2d-x 3.17"

## 実行
あとは孫モジュールをアップデートして依存関係をダウンロードします。
> pushd cocos2d/
git submodule update --init
python download-deps.py
popd

そうすると`cocos run -p linux`とかで実行できますから
あとはイイ感じのゲームを作って`git push`すれば皆が幸せになります。

そうやって作ったのが
https://github.com/tshibata/ZombieHS
これからいろいろ弄ってイイ感じのゲームになる予定です。
ハードディスクの引っ越し手順（Linux）

必要なもの：LiveCDもしくはLiveUSB、現在使用しているデータ量（ディスクサイズではない）より大きいDisk（パーティション）

スーパーユーザーで作業します。

０．事前準備
LiveCDもしくはLiveUSBを準備します。現在使用しているデータ量よりも大きいext4フォーマット済みのパーティションを用意します。

１．rsyncでコピー
LiveCDで起動して、移行前、移行後のパーティションをそれぞれマウントします。
マウントできたらrsyncでコピーします。予めパーティションにラベルを付けておくと、UUIDではなくラベルでアクセスできるので便利です。ここでは、移行前のパーティションをSANSSD、移行後のパーティションをDISK0としています。

```
rsync -aAXHxShv --append --partial --timeout=600 --bwlimit=0
--stats --progress --preallocate /media/user/SANSSD/ /media/user/DISK0
```
２．DISK0/etc/fstab 修正
fstab（一部抜粋）

```
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
#
LABEL=DISK0 /               ext4    errors=remount-ro 0       1
```
３．grub2のインストール

新しいDiskにgrub2をインストールします。/dev /sys /procを新しいパーティション配下へbindして、chrootしてからやります。予め、「ls /dev/disk/by-label」で、sd?であるかを確かめてからします。ここでは、DISK0が、sdbにあるとしました。

```
mount --bind /proc /media/user/DISK0/proc
mount --bind /sys /media/user/DISK0/sys
mount --bind /dev /media/user/DISK0/dev
chroot /media/user/DISK0/
grub-install /dev/sdb
update-grub
```
４．LiveCDを終了して、電源を切り、Diskを取り換えて再起動します。電源を切ってDiskを取り換えなくても、再起動して、BIOSでブートディスクを指定してもいいです。
ノートPCのタッチパッド無効化 linux

ノートPCのタッチパッドを無効化する方法：
（１）xinputをインストールする。

```
sudo apt-get install xinput
```
（２） タッチパッドの名前を探す。
```
xinput list
```
私の環境では、以下の画像のようになり、「AlpsPS/2 ALPS Glidepoint」がタッチパッドだった。
![20180929044519099.png](https://qiita-image-store.s3.amazonaws.com/0/315399/23c1689e-10ca-116c-ad3e-2bcbfa0bfa7b.png)

　デバイスの名前の探し方としては、「Virtual core pointer」の中にあり、ノートPCの場合、大体、内部のPS/2インターフェースで繋がっているので、PS/2と表示が出てくる。
（３）以下のコマンドを与える。xinputの２番めの引数が見つけたデバイスの名前である。

```
xinput --set-prop "AlpsPS/2 ALPS GlidePoint" "Device Enabled" 0
```

これで、ログアウトや再起動するまでタッチパッドが無効になるが、恒久的に無効にするには、自分のスタートアップスクリプトなどに書いておくと良い。
スタートアップスクリプトの作り方は、次の通りである。
https://qiita.com/fygar256/items/020f685956df7d4fdb54
NFSの簡単なセットアップ方法

スーパーユーザーで作業します。

```
aptitude -y install nfs-kernel-server
vi /etc/idmapd.conf
```

```idmapd.conf
# 6行目のコメントを外し、ドメイン設定をする。
Domain = localdomain
```

```
vi /etc/exports
```

```
# /etc/exportsの
# 最終行にマウント設定を書く
/home/nfs 192.168.1.0/24(rw,no_root_squash)
/mnt/sdb1 192.168.1.0/24(rw,no_root_squash)
```

```
systemctl restart nfs-kernel-server
```
プロキシ環境下でdocker image buildしたい

# やりたいこと
* プロキシ環境下で`docker image build`したい
    * `yum`や`apt`を利用してパッケージインストールする時に困る
* プロキシサーバーは、サーバー名で指定したい
* `Dockerfile`には、`ENV http_proxy`とか`ENV https_proxy`とか書きたくない

# `--build-arg`を使う
解決方法は`--build-arg`で`http_proxy`や`https_proxy`を、`docker build`時に指定してあげればOKです。

例えば、こんな感じ。

```shell
$ docker image build --build-arg http_proxy=http://your-proxy-host:your-proxy-port --build-arg https_proxy=http://your-proxy-host:your-proxy-port -t charon/your-container-image:latest .
```

さらに、プロキシサーバーを名前で指定したい場合で、かつDockerコンテナ内からプロキシサーバーの名前解決が面倒な場合。

[Container networking](https://docs.docker.com/config/containers/container-networking/)

`--dns`オプションを使用してもよいのですが、それも面倒。

`dig +short`でいいんではないでしょうか？

こんな感じで。

docker-proxy-build

```shell
#!/bin/bash

docker image build --build-arg http_proxy=http://$(dig +short your-proxy-host):your-proxy-port --build-arg https_proxy=http://$(dig +short your-proxy-host):your-proxy-port "$@"
```

このスクリプトに、実行を付けて`/usr/loca/bin`にでも置いておきましょう。

```shell
$ chmod a+x docker-proxy-build
$ sudo cp docker-proxy-build /usr/local/bin
```

使う時。

```
$ docker-proxy-build -t charon/your-container-image:latest .
```
【Rails】プロジェクトを作ったら追加したい設定やgemファイル

Rails初心者である自分用のメモとして置いておきます。随時更新します。
バージョン：Ruby2.5.3, Rails 5.2.2

## 基本的なこと
* gemはGemfileに記述する（特に指定がなければgroupの外側に記述）
* バージョンを指定する場合、[RubyGems.org](https://rubygems.org/)でチェックする
* gemを追加した後は、ターミナルで`$ bundle install`
* config内を変更した後は、rails serverを再起動

##日本語化

###タイムゾーンの設定

プロジェクト内で扱う日時を日本標準時に合わせる場合、この設定は必須です。

``` ruby:config/application.rb
class Application < Rails::Application
  config.time_zone = 'Tokyo'
  config.active_record.default_timezone = :local
  # この二行の記述を追加
end
```

###エラーメッセージの日本語化（i18n）

* gem 'rails-i18n'
* config/locales/ja.ymlを作成し、[ja.yml](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml)をコピペ

``` ruby:config/application.rb
class Application < Rails::Application
  config.i18n.default_locale = :ja # この記述を追加
end
```

###日時の日本語化

* config/initializers/time_formats.rbを作成し、フォーマットを追加

```ruby:initializers/time_formats.rb
Time::DATE_FORMATS[:datetime_jp] = '%Y年%m月%d日 %H時%M分'
# :datetime_jpは別の名前でも可
```
* viewでは以下のように記述

```erb:index.html.erb
<%= article.created_at.to_s(:datetime_jp) %>
```


##便利なgemファイル

###cssフレームワーク（bootstrap）

* gem 'bootstrap'
* stylesheets/application.cssを.scssに変更
* stylesheets/application.scssに`@import "bootstrap";`の記述を追加

###ページネイト（kaminari）

* gem 'kaminari'

``` terminal:terminal
$ rails g kaminari:config # 設定の変更
$ rails g kaminari:views default # 見た目の変更
```

### viewをシンプルに記述する（slim）
[slim](https://github.com/slim-template/slim/blob/master/README.jp.md)
> Slim は 不可解にならない程度に view の構文を本質的な部品まで減らすことを目指したテンプレート言語です。標準的な HTML テンプレートからどれだけのものを減らせるか、検証するところから始まりました。(<, >, 閉じタグなど) 多くの人が Slim に興味を持ったことで, 機能的で柔軟な構文に成長しました。

* gem 'slim-rails'

``` ruby:config/application.rb
class Application < Rails::Application
  config.generators.template_engine = :slim # この記述を追加
end
```
#### erbからslimへの変換
* gem 'html2slim'

``` terminal:terminal
$ gem install slim
$ bundle exec erb2slim app/views/ --delete # 既存のerbファイルのslimを作成し、erbを削除する
```


##development, test用のgem
`group :development, :test do`内に記述

### SQLを整然と表示する（flog）
* gem 'rails-flog', require: 'flog'

<img width="569" alt="before" src="https://qiita-image-store.s3.amazonaws.com/0/322882/1af3ce5b-a48d-8f23-5e84-2b9a326fb29f.png">
　↓
<img width="567" alt="after" src="https://qiita-image-store.s3.amazonaws.com/0/322882/50c65a02-7ff4-84a5-cf58-440e601bff86.png">

##development用のgem

`group :development do`内に記述

###スキーマ情報をmodel.rbに記述する（annotate）

* gem 'annotate'

``` terminal
$ bundle exec annotate # テーブルのカラム情報が記述される
$ bundle exec annotate --routes # ルート情報が記述される
  # annotate --routes でも可
$ rails g annotate:install
      create  lib/tasks/auto_annotate_models.rake
```

auto_annotate_models.rake内の記述を変更すると設定を変更できる。

```lib/tasks/auto_annotate_models.rake
      .
      .
      'skip_on_db_migrate'        => 'true',
      # db:migrateするたびに勝手に更新されない。
```

##参考資料
* [現場で使える Ruby on Rails 5速習実践ガイド](www.amazon.co.jp/dp/4839962227)
* [フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座](https://www.udemy.com/rails-kj/)
* [Rails開発における初期設定5項目](http://post.simplie.jp/posts/39)
* [Ruby on Railsでbundle installでエラーが出た時のシンプルな解決方法](https://code-schools.com/ror-bundleerror/)
shell_シェルスクリプト_テキストで定義されたファイルを削除する

**Find log files and delete, depends on settings as setted by /huishoubao/config/clean_up_log.config.**

```shell
#!/usr/bin/env bash
# Name          : /etc/sh/clean_up_log.sh
# Author        : RaymondYan
# Create Date   : 2018-06-23
# Usage         : bash ./clean_up_log.sh {config_file} [specified_line_number]
# Example       : /bin/bash /etc/sh/clean_up_log.sh /huishoubao/config/clean_up_log.config 1
# Dependencies  : /etc/sh/lib/logToFile.sh, /huishoubao/config/clean_up_log.config
# Description   : Find log files and delete, depends on settings as setted by /huishoubao/config/clean_up_log.config.
# Version       : 1.0
# Update Date   :

LOG_FILE='/data/log/clean_up_log.log'
mkdir -pv /data/log/
source /etc/sh/lib/logToFile.sh
if [[ $? -ne 0 ]]; then echo -e "\033[41;37m [/etc/sh/lib/logToFile.sh] is necessary!! \033[0m"; exit 1; fi

#source /huishoubao/config/clean_up_log.config
#if [[ $? -ne 0 ]]; then echo -e "\033[41;37m [/huishoubao/config/clean_up_log.config] is necessary!! \033[0m"; exit 1; fi

n_inputf=$1
n_no=$2

while read line
do
  # ignore comment lines and blank lines
  if echo ${line} | grep -e '^#' -e '^$' >/dev/null; then
    continue
  fi

  # if there are line numbers specified, ignore except specified lines
  if [ -n ${n_no} -a "`echo $line | awk '{print $1}'`" != ${n_no} ]; then
    continue
  fi

 # below is main program

 n_profile=`echo ${line} | awk '{print $2}'`
 n_log_dir=`echo ${line} | awk '{print $3}'`
 n_log_wildcards=`echo ${line} | awk '{print $4}'`
 n_days_keeping=`echo ${line} | awk '{print $5}'`

 #. ${n_profile}
 find ${n_log_dir} -iname ${n_log_wildcards} -mtime +${n_days_keeping} -type f | xargs rm -f
 fn_log "find ${n_log_dir} -iname ${n_log_wildcards} -mtime +${n_days_keeping} -type f | xargs rm -f"
done < ${n_inputf}

```

**dependency: logToFile.sh**

```shell
#!/usr/bin/env bash
#log path is /var/log/yanke_shell_log.log
# Version:      1.1
# Update date:  20180320

if [ -d /var/log ]
then
    echo '/var/log/ exists...'
else
    mkdir -pv /var/log/
fi

# Default log file is /var/log/yanke_shell_log.`date +%F`
if [ `echo "${LOG_FILE}"| grep -v ^$| wc -l` -eq 0 ]; then
  LOG_FILE=/var/log/yanke_shell_log.log
fi

echo "Default LOG_FILE is ${LOG_FILE}"

function log_info () {
DATE_N=`date "+%Y-%m-%d %H:%M:%S"`
USER_N=`whoami`
echo "${DATE_N} ${USER_N} execute $0 [INFO] $@" >> ${LOG_FILE} #执行成功日志打印路径
}

function log_error () {
DATE_N=`date "+%Y-%m-%d %H:%M:%S"`
USER_N=`whoami`
echo -e "\a"
echo -e "\033[41;37m ${DATE_N} ${USER_N} execute $0 [ERROR] $@ \033[0m"  >> ${LOG_FILE} #执行失败日志打印路径
}

function fn_log () {
if [  $? -eq 0  ]
then
    log_info "$@ successed."
    echo -e "\033[32m $@ sucessed. \033[0m"
else
    log_error "$@ failed."
    echo -e "\033[41;37m $@ failed. \033[0m"
    exit 1
fi
}

# trap 'fn_log "DO NOT SEND CTR + C WHEN EXECUTE SCRIPT !!!! "'  2

```
なんでGoogle検索のやり方こみで教えないの？新人エンジニア教育

検索キーワード込みで共有したら良いんじゃないの？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7b4e9a21-f119-00b3-ac25-c3ee8bf3ea03.png)


- Google検索のキーワードは重要な情報
- どうやって情報を探したら良いかの手法までシェアしたい、むしろそちらが大事
- 魚のとり方を教えたら最強っていうけど、それはGoogling能力ですよつまり
- Google検索結果をスクリーンショットを撮影して共有してみては？
- ググるキーワードと一緒に結果も撮影できるしコスパも最強じゃない？
- 謎にhitしたあとのページだけ渡されても経路が分からないし、道順を示さないのは悪しき習慣

---

https://twitter.com/YumaInaura

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

[新人プログラマをレビューで殺さない方法 - Qiita](https://qiita.com/hiraike32/items/32840b11536fa1b78621)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
gnome起動時の自動起動ファイルの作り方。

実行させたいシェルスクリプトを、'mystartup'という名前でホームディレクトリに作り、実行権限を付けます。

そして、$HOME/.config/autostartに以下のファイルを作ります。

```mystartup.desktop
[Desktop Entry]
Type=Application
Version=1.0
Name=MYSTARTUP
Path=/home/user
Exec=mystartup
Icon=
Terminal=false
```
これで、gnome起動時に、ホームディレクトリの'mystartup'が自動的に実行されます。
名前や、ファイル名が気に入らなかったら、適当に変えて下さい。
HTML リンクの nopener は blank で開くときに リファラを送らないらしい、フィッシング詐欺対策？

What is noopener? in HTML a href link. Maybe its for Anti Phishing spam send no referer

HTML リンクの nopener は blank で開くときに リファラを送らないらしい、フィッシング詐欺対策？

# I found today nopener rel in Medium HTML source

![image](https://user-images.githubusercontent.com/13635059/50670457-1555a900-100f-11e9-9355-43dd61242f9c.png)

# What is pener

![image](https://user-images.githubusercontent.com/13635059/50670439-ffe07f00-100e-11e9-8b1f-769b13c6e762.png)


# Study

[ワードプレスのリンクに付与される「rel="noopener"」の意味と必要性をご存知ですか？ | たびすた](https://tabi-z.com/about-noopener#noopener)

https://tabi-z.com/about-noopener#noopener

# Unti fishing spam no phishing spam

# Send no http referer

# I god it!

# But why only blank target in Wordpress?

teach me somebody


---

https://twitter.com/YumaInaura

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

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
linux DebianやUbuntuで、 起動時に音を鳴らす

モニタレスで、サーバの遠隔操作をしていると、wake on lanで起動したのはいいものの、いつ起動完了になるかわからない。それなので、Debianで起動音を鳴らすことにした。

最初はbeepで鳴るかと思ってたら、beepでは音は出なかった。
ogg123で、oggファイルを再生することにした。aplayはうまく動かなかった。

```
apt-get install vorbis-tools
```
で、ogg123をインストール。

.config/autostart/ で指定する自動起動のシェルスクリプトで、下記の行を指定して下さい。
（自動起動のシェルスクリプトの作り方は、これを参照のこと：
 https://qiita.com/fygar256/items/020f685956df7d4fdb54 ）

```
ogg123 /usr/share/sounds/gnome/default/alerts/drip.ogg &
```
音が気に入らなければ、/usr/share/sounds/辺りで、適当なサウンドファイルを探して下さい。KDEが入っていれば、

```
/usr/share/sounds/KDE-Sys-App-Positive.ogg
```
辺りが良いでしょう。

これで、起動時に音が鳴るようになります。
Select-Object コマンドレットを復習

[ブログからの転載](https://1bed.allright.life/?p=2812)

## 経緯

同僚から「Select-Object で使う Expression って知ってる？便利だったよ」と教えてもらいました。なんとなく使っていた Select-Object でしたので復習してみたメモです。

## Select-Object とは
オブジェクトのプロパティを取り出したオブジェクトを出力するコマンドレット。

<!--more-->
## 使い方

`Get-Process` コマンドレットの出力を操作することで、`Select-Object` 説明する。
ちなみに、`Get-Process` コマンドレットを引数無しで実行すると次の通りになる。
![](https://1bed.allright.life/wp-content/uploads/2019/01/1.png)

### プロパティの値を選択する

`Get-Process` の結果から `ProcessName` , `Description` , `StartTime` を取り出す

```powershell
Get-Process | Select-Object -Property ProcessName, Description, StartTime
```
![](https://1bed.allright.life/wp-content/uploads/2019/01/2.png)

### プロパティの値を展開する

プロセス名を `Chrome` に絞り、利用しているモジュールを重複を省いて表示する

```ps1
Get-Process Chrome | Select-Object -Property ProcessName, Modules -Unique
```
![](https://1bed.allright.life/wp-content/uploads/2019/01/3.png)

Modules はオブジェクトになっているので上図のようになるが、それを展開するために `-ExpandProperty` を利用する

```ps1
Get-Process Chrome | Select-Object -Property ProcessName -ExpandProperty Modules -Unique
```
![](https://1bed.allright.life/wp-content/uploads/2019/01/4.png)

### 出力件数を指定する

`Get-Process` の結果から先頭の 5 件を取り出す

```powershell
Get-Process | Select-Object -Property ProcessName, Description, StartTime -First 5
```

`Get-Process` の結果から最後の 5 件を取り出す

```powershell
Get-Process | Select-Object -Property ProcessName, Description, StartTime -Last 5
```

![](https://1bed.allright.life/wp-content/uploads/2019/01/5.png)

### 加工して出力する

`Get-Process` の `StartTime` を和暦に変換して取り出す

```powershell

$CultureInfo = New-Object CultureInfo("ja-jp", $true)
$CultureInfo.DateTimeFormat.Calendar = New-Object System.Globalization.JapaneseCalendar
Get-Process | Select-Object -Property ProcessName, Description, @{Name = "wareki"; Expression = {$_.StartTime.ToString("gy年M月d日", $CultureInfo)}}
```
![](https://1bed.allright.life/wp-content/uploads/2019/01/6.png)

`Get-Process` の結果にから Modules オブジェクトに含まれる数順で並べる

```powershell
Get-Process | Select-Object -Property ProcessName, Description, @{Name="ModulesCount"; Expression={$_.Modules.Count}} | Sort-Object -Property ModulesCount -Descending
```
![](https://1bed.allright.life/wp-content/uploads/2019/01/7.png)

## 参考

* [PowerShell で和暦/西暦変換](http://vwnet.jp/Windows/PowerShell/2018122702/ConvJC.htm)
* [Select-Object](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object?view=powershell-6)
Github で Issue駆動開発って最強じゃない？ #UI #UX エンジニアの生産性 


- Github Issue の ui が最強すぎてタスクが多いときに絶対必要感があるので、ちょっとメモりたい
- storyにするまでもない 軽いステートの記録、開発的な問題解決の記録、忘れておきたくないものなどの記録、解決用などに‥
- noisyになるようであればチームとと相談させていただきたい‥(問題ならclose





Github ISsue Driven Development for brain flash memory best way

- Memorize not storied trouble
- middle size bug or trouble / small size is slack / big size is story
- UI is perfect than any other services in the world so comfortable
- if resolved close issue its issues natural act ya
- pivotal tracker os slack or sublimetext memo or other app or any services are sometile so noisy to my brain..
- good hacking with Github :)

---

https://twitter.com/YumaInaura

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

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PHPはときどき掛け算ができない

# 発覚の経緯
プログラミングコンテストサイト「AtCoder」の「[C - AtCoDeerくんと選挙速報](https://atcoder.jp/contests/arc062/tasks/arc062_a)」でどうしても正答ができなかった。
それほど難しいロジックはないはずなのに……
そして、計算途中に変な値になっていることが発見された。

# 出現条件

**Windows版のPHP7.0〜7.1** で `117231566641875000 * 7` を計算する。
PHP7.1の最新版では間違った結果が表示されます。
PHP7.2.0以降では正しい結果(820620966493125000)が表示されます。

# どういう不具合か
117231566641875000 ✕ 7 = 820620966493125120
大きな数字ですが、下4桁に注目してください。
5000に7を掛けて答えは35000なので、掛け算の結果も下4桁は5000のはず。
なのに、5120という中途半端な数字（計算結果が正しくない）

```console
c:\php-7.1.25-Win32-VC14-x64>php -r "$a = 117231566641875000 * 7; echo $a . PHP_EOL; printf(\"%d\", $a);"
8.2062096649313E+17
820620966493125120
```
PHPのマニュアルには、整数の範囲を超えたら浮動小数点数になる、という記述はあるけれど、今回はその範囲の最大（2の63乗-1、約9✕10の18乗)より小さいにもかかわらず、浮動小数点数になって、誤差が発生している。

```bash
# ↓今回の計算結果
820620966493125120
9223372036854775807
# ↑PHP(64bit版)で扱える整数の最大値
```

# 回避方法
単純な掛け算で答えが間違ってしまうので、掛け算を自作するしかない。
（「[BCMath 任意精度数学関数](http://php.net/manual/ja/book.bc.php)」を使えれば回避できますが、AtCoderは非対応）

```php
function omulti($a, $b) {
	$aa = str_split(strval($a));
	$bb = str_split(strval($b));
	foreach ($aa as $ka => $va) {
		foreach ($bb as $kb => $vb) {
			$res[$ka + $kb + 1] += intval($va) * intval($vb);
		}
	}
	for ($i = max(array_keys($res)); $i > 0; $i--) {
		if ($res[$i] > 9) {
			$res[$i - 1] += floor($res[$i] / 10);
			$res[$i] %= 10;
		}
 
	}
	ksort($res);
	return implode("", $res);
}
```
数字を文字列に変換して分割し、1桁ずつ計算して桁上りを処理して文字列としてガッチャンコしております。
正整数同士の掛け算にしか対応しておりません。

# intdiv()の発見
ちなみに上記で不正解になっていたテストケースの5番は正答できたのですが、テストケース9番で今度は除算の結果が間違っていて、不正解になりました。
ここでまたオリジナル除算を作ったのですが、PHP7には **intdiv()** なる関数があることを発見しました。
他の言語ではそもそもあったりしますが、除算における商（除算の結果の整数部分）を取得できる関数です。（他の言語では　`a // b` みたいな表記を良く見かけます）
これを基に除算して切り上げる関数を作りました。（オリジナル除算よりも圧倒的にコードが短くて済む）

```php
function divceil($dividend, $divisor) {
	return intdiv($dividend, $divisor) + ($dividend % $divisor !== 0);
}
```

# 総括
まぁ、10の14乗を超えるような数を扱う機会は通常あまりなく、しかもWindows版の一部のバージョンでしか起こらない不具合なので、実際問題として誰も困らないのかもしれませんね。今回は **intdiv()** を知ることができたのが収穫でした。

# 後付け
本稿は[YYPHP Advent Calendar 2018 - Qiita](https://qiita.com/advent-calendar/2018/yyphp)の9日目の記事です(空いていたので忍び込みました)。
Debianで、suのパスワード入力を省略する

一々、ターミナルで、一般ユーザーからrootに移るとき、パスワードを入力しなくてはいけないのが面倒なので、パスワード入力を省略する方法を書いておきます。
スーパーユーザーで作業します。

(1)以下のコマンドを実行

```
 groupadd wheel
 adduser user wheel
 adduser root wheel
```
(2)/etc/pam.d/suを編集

```
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth            sufficient      pam_wheel.so trust use_uid

（こうなってるのを、下の一行をアンコメントする）

# Uncomment the following line to implicitly trust users in the "wheel" group.
auth            sufficient      pam_wheel.so trust use_uid |
```
wineアプリケーションの起動時のスタート

wineアプリケーションを起動時に自動スタートさせたい場合に方法が見つかりました。英語のページで見つけましたが、同じことを考えている人がいるもんです。

.lnkファイルからの実行はパスの表記の問題で、素直にアイコンのプロパティから.desktopファイルを作ってもうまく行きません。

ここでは、Google PhotoのAuto Backupを例に取ります。方法は以下の通り。

```
cd ~user
cp "~/.local/share/applications/wine/Programs/Google Photos Backup/Google Photos Backup.desktop" ~/.config/autostart
```
これで、起動時に自動的にアプリケーションが起動します。
VCCW wordmove エラー `in `deployer_for': undefined method \`[]' for nil:NilClass (NoMethodError)`


## エラーメッセージ

```
▬▬ Using Movefile: ./Movefile ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
/home/vagrant/.gem/ruby/2.4.0/gems/wordmove-2.4.0/lib/wordmove/deployer/base.rb:16:in `deployer_for': undefined method `[]' for nil:NilClass (NoMethodError)
	from /home/vagrant/.gem/ruby/2.4.0/gems/wordmove-2.4.0/lib/wordmove/cli.rb:68:in `pull'
```

## エラーが発生した状況

古い VCCW で運用していた開発用サイトを、新しいバージョンの VCCW で構築し直し、wordmove で本番サイトから pull しようとした時に発生

### 環境

* Vagrant box "vccw-team/xenial64"  
  v20161209 → v20180107
* VCCW v2 → v3


## 原因

VCCWのアップデートにより、含まれる wordmove が v2.1 → v2.4 に差し替わった。wordmove の設定ファイル movefile の書き方が以下のように変わっていたためにエラーが起きた。

* ファイル名が movefile から Movefile.yml に変更  
  (movefile でも movefile.yml でも動作はした)
* ファイル頭に `global: sql_adapter: default`
* 値のクォーテーションが不要に  
  以前：`"wordpress_path: /var/www/html/wpd"`  
  現在： `wordpress_path: /var/www/html/wpd`
* hooks: 等の設定が追加 (使う必要はない)


## 解決方法

`wordmove init` で movefile の雛形を作り、それに従って movefile を新しい書き方で書き直すことで解決した。


## 参考記事

* ★[VCCW Wordmove を実行したら undefined method \`\[\]’ for nil:NilClass (NoMethodError) が発生する場合の対処 | deadwood](https://www.d-wood.com/blog/2018/07/12_9564.html)
* [undefined method \`\[\]' for nil:NilClass (NoMethodError) · Issue #401 · welaika/wordmove](https://github.com/welaika/wordmove/issues/401)
* [i got the error of undefined method '\[\]' for nil:NilClass in new version (2.1.2) · Issue #396 · welaika/wordmove](https://github.com/welaika/wordmove/issues/396)
* [Error when using Movefile · Issue #150 · welaika/wordmove](https://github.com/welaika/wordmove/issues/150)
書き初めがてらdotfilesつくった

## はじめに
この記事は、[UUUM Advent Calendar 2018](https://qiita.com/advent-calendar/2018/uuum) 24日目です。

* 7日目:   [JavaScriptで関数型ゲームエンジンを作るよ！part1](https://qiita.com/takeokunnn/items/fbff10849dffe0e224a6)
* 15日目: [自分の .emacs.d について書くよ](https://qiita.com/takeokunnn/items/7357c11a50ded45fdb3e)
* 20日目: [Webの技術でYoutube Viewer作った](https://qiita.com/takeokunnn/items/7357c11a50ded45fdb3e)

12/24が埋まってないのが気持ち悪かったので書きました。
ちなみに、12/24は暇すぎて `nginx.conf` と格闘していました。来年は予定が入りますように。。。

投稿日が1/4なので簡単に今年の目標を書くと、「強いインフラエンジニアになる」です。
インフラエンジニアになるにあたって、まずは `dotfiles` からかなと思い、正月を溶かしてつくりました。

## さいきょうの`dotfiles`を作りたい

せっかく作るんだから、めちゃくちゃイケてる物を作りたい！といういつもの病気が発症し、とりあえず世の中に転がってる `dotfiles` を片っ端から読んでいきました。

そんな中、へーしゃCTOの `dotfiles` が最高にイケてたので ~~パクって~~ 参考にしながら作りました。

* [bto/dotfiles](https://github.com/bto/dotfiles)
* [汎用性・拡張性の高い dotfiles 環境を作る (UUUM攻殻機動隊(エンジニアブログ))](http://system.blog.uuum.jp/entry/2016/01/26/110000)

## 構成(2019/1/4現在)

repo: [takeokunn/dotfiles](https://github.com/takeokunn/dotfiles)

```shell
dotfiles ) tree .
.
├── Makefile
├── README.md
├── bin
│   └── brew-init.sh
├── config
│   ├── Makefile.sample
│   ├── config.sh.sample
│   └── homebrew
│       ├── pkgs.txt
│       └── taps.txt
├── modules
│   ├── editorconfig
│   │   └── dot.editorconfig
│   ├── fish
│   │   ├── Makefile
│   │   └── config.fish
│   ├── git
│   │   ├── dot.gitconfig
│   │   └── dot.gitignore
│   ├── oh-my-fish
│   │   ├── Makefile
│   │   ├── bundle
│   │   ├── channel
│   │   └── theme
│   ├── tmux
│   │   └── dot.tmux.conf
│   └── vim
│       ├── Makefile
│       └── dot.vimrc
├── src
│   ├── make
│   │   ├── dot.mk
│   │   ├── http.mk
│   │   └── os.mk
│   └── shell
│       ├── init
│       │   └── constants.sh
│       └── init.sh
└── tmp

```

## 簡単な解説

* `make` を叩くと、 `modules/*/dot.*` が `~/` に展開される
* さらに、 `modules/*/Makefile` のタスクも実行される
* `./bin/brew-init.sh` を叩くと必要なpackageをhomebrewでinstallできる

## 今後やりたいこと

[takeokunn/.emacs.d](https://github.com/takeokunn/.emacs.d) をこの `dotfiles` に入れようとしたが、 `quicklisp` や `sbcl` など依存関係が結構あり、うまく `Makefile` を書けなかった。いつか頑張るかもしれない。

`oh-my-fish` 周りの `Makefile` がうまく書けなくて苦労した(してる)

`homebrew` 向けにしかまだ書ききれてないので、 `yum` や `apt` 向けにも拡張していきたい

## さいごに

`Makefile` めっちゃ良い、 `gulp` や `npm scripts` が霞むほど良い。
再帰する竹内関数も高速化

再帰しない竹内関数の高速化( https://qiita.com/nihongi/items/cb8ba21562d430d4fc63 )の続きです。前回、形が変わりすぎて竹内関数だか何だかわからなくなってきたので、原点に返ります。

## 正しい竹内関数

```bash:tarai02.sh
#!/bin/sh
tarai() {
  echo "${1} ${2} ${3}" >&2
  if [ ${1} -gt ${2} ]; then
    echo -n $(tarai $(tarai $(( ${1} - 1 )) ${2} ${3}) \
                    $(tarai $(( ${2} - 1 )) ${3} ${1}) \
                    $(tarai $(( ${3} - 1 )) ${1} ${2}))
  else
    echo -n ${2}
  fi
}

tarai ${1} ${2} ${3}
echo
```

前回までの知見で、遅延評価は効果絶大、遅延評価をすればメモ化は不要ということがわかりました。まず、上記のコードを少しだけ変形します。

```bash:tarai06.sh
#!/bin/sh
tarai() {
  echo "${1} ${2} ${3}" >&2
  if [ ${1} -gt ${2} ]; then
    x=$(tarai $(( ${1} - 1 )) ${2} ${3})
    y=$(tarai $(( ${2} - 1 )) ${3} ${1})
    z=$(tarai $(( ${3} - 1 )) ${1} ${2})
    echo -n $(tarai ${x} ${y} ${z})
  else
    echo -n ${2}
  fi
}

tarai ${1} ${2} ${3}
echo
```
ちゃんと再帰呼び出ししています。外側のtaraiに渡す引数を予め計算するように変えただけです。

## 身も蓋もないショートカット

ここで、`x<=y`であればTarai(x, y, z)の結果はyだとわかっているので、taraiの呼び出しを省略できます。いわゆる遅延評価というより、ショートカットですね。

```bash:tarai07.sh
#!/bin/sh
tarai() {
  echo "${1} ${2} ${3}" >&2
  if [ ${1} -gt ${2} ]; then
    x=$(tarai $(( ${1} - 1 )) ${2} ${3})
    y=$(tarai $(( ${2} - 1 )) ${3} ${1})
    if [ ${x} -gt ${y} ]; then
      z=$(tarai $(( ${3} - 1 )) ${1} ${2})
      echo -n $(tarai ${x} ${y} ${z})
    else
      echo -n ${y}
    fi
  else
    echo -n ${2}
  fi
}

tarai ${1} ${2} ${3}
echo
```
前回のスタック版と時間を比較してみます。

```console
$ time sh tarai05.sh 100 50 0 2>/dev/null
100

real    0m4.218s
user    0m3.912s
sys     0m0.303s
$ time sh tarai07.sh 100 50 0 2>/dev/null
100

real    0m7.628s
user    0m2.107s
sys     0m5.505s
```
スタック版の方が速いですが、今回の再帰ショートカット版もいい勝負しています。スタック版ではほとんどの時間がuserモードなのに対して、再帰ショートカット版では、sysモードの時間が大きいという点が興味深いです。

## bashの限界か

やっぱ、もっとモダンな言語でやった方が良いよね。(感想)