OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7のセットアップ(さくらのVPS)

さくらのVPSでサーバーを構築していきます。

以下の環境でセットアップしていきます。
**〜さくらのVPS 1Gプラン〜**
メモリ：1G
CPU：仮想2Core
ストレージ：HDD 100GB
OS：CentOS 7（カスタムOS）

# はじめに
コントロールパネルとVNCでの操作は省略。

# 1．Terminalを起動する
Terminalアプリを起動。
次のコマンドを実行する。（abc.comはご自身のドメインに置き換えて）

```
$ ssh root@abc.com
```
すると初回のみ次のように表示される。

```
The authenticity of host 'abc.com (***.***.***.***)' can't be established.
ECDSA key fingerprint is SHA256:abcdef12345ghijk67890lmn.
Are you sure you want to continue connecting (yes/no)? 
```
”yes”を入力し、returnキーを押す。

```
Are you sure you want to continue connecting (yes/no)? yes
```
すると次のようなものが表示される。

```
Warning: Permanently added 'abc.com,***.***.***.***' (ECDSA) to the list of known hosts.
root@abc.com's password: 
```
パスワードを入力し、returnキーを押す。

```
Warning: Permanently added 'abc.com,***.***.***.***' (ECDSA) to the list of known hosts.
root@abc.com's password: 
[root@abc ~]# 
```
これでログインができた。

# 2．アップデートする
はじめに次のコマンドを実行し、アップデートする。

```
[root@abc ~]# yum -y update
```

# 3．直接rootでログインできないようにする
次のコマンドを実行し、直接rootでログインができないようにする。

```
[root@abc ~]# vim /etc/ssh/sshd_config
```
38行目先頭の#を削除し、"yes"を"no"にする。

``` :/etc/ssh/sshd_config
#PermitRootLogin yes
```
↓

``` :/etc/ssh/sshd_config
PermitRootLogin no
```
保存したら次のコマンドを実行し、sshdを再起動する。

```
[root@abc ~]# systemctl restart sshd
```
ログアウトする。

```
[root@abc ~]# exit
Connection to abc.com closed.
```
次のコマンドを実行し、rootで直接ログインできなくなっていることを確認する。

```
$ ssh root@abc.com
root@abc.com's password: 
Permission denied, please try again.
```

# 4．SSHが切断されないようにする
デフォルトのままだと少しの間操作しないだけでSSHが切断される。

次のコマンドを実行する。

```
[root@abc ~]# vim /etc/ssh/sshd_config
```
112行目先頭の#を削除し、"0"を"60"にする。
113行目先頭の#を削除し、"3"を"30"にする。

``` :/etc/ssh/sshd_config
#ClientAliveInterval 0
#ClientAliveCountMax 3
```
↓

``` :/etc/ssh/sshd_config
ClientAliveInterval 60
ClientAliveCountMax 30
```
保存したら次のコマンドを実行し、sshdを再起動する。

```
[root@abc ~]# systemctl restart sshd
```

# 5．Port番号を変更する
デフォルトのままだと不正アクセスをされる可能性が上がる。

次のコマンドを実行する。

```
[root@abc ~]# vim /etc/ssh/sshd_config
```
17行目先頭の#を削除し、"22"を好きな数字にする。

``` :/etc/ssh/sshd_config
#Port 22
```
↓

``` :/etc/ssh/sshd_config
Port 50000
```
保存したら次のコマンドを実行し、ポートを開放する。

```
[root@abc ~]# firewall-cmd --add-port=50000/tcp --zone=public --permanent
```
次のコマンドを実行し、Firewallをリロードする。

```
[root@abc ~]# firewall-cmd --reload
```
次のコマンドを実行し、sshdを再起動する。

```
[root@abc ~]# systemctl restart sshd
```

# 6．SELinuxを停止する
あとあと面倒になるのであらかじめ停止しておく。
次のコマンドを実行する。

```
[root@abc ~]# vim /etc/selinux/config
```
7行目の"enforcing"を"disabled"にする。

``` :/etc/selinux/config
SELINUX=enforcing
```
↓

```:/etc/selinux/config
SELINUX=disabled
```
保存したら次のコマンドを実行し、再起動する。

```
[root@abc ~]# reboot
```
再起動し終えたら再度ログインし、次のコマンドを実行する。

```
[root@abc ~]# getenforce
```
次の表示がされたらSELinuxは無効化されている。

```
[root@abc ~]# getenforce
Disabled
```
もしも"Enforcing"が表示されたら、3をもう一度実行する。
メソッドチェーンのパターンを考えた

# メソッドチェーンのパターンを考えた

おそらく、私はただpipeline operatorが欲しいだけだろう。以下のようなコードを本当に嫌っている。

```js
const x1 = f(x0);
const x2 = g(x1);
const x3 = h(x2);
```

Promiseの本懐はこれを解決することではないが、メソッドチェーンでpipeline operatorのようなことができるので、好きだ。もともとRubyのObject#tapも好きだったし。

```js
await Promise.resolve(x0).then((x) => {
  return Promise.resolve(f(x));
}).then((x) => {
  return Promise.resolve(g(x));
}).then((x) => {
  return Promise.resolve(h(x));
});
```

シンタックスはいかついが、変数がクロージャに閉じていて気持ちがいい。こういうものを欲しいと思った時にサクッと対応したいけど、毎回考えてしまうので、今回は一般的に考えた。

# RubyのObject#tapの再実装

Object.prototype.tapにブチ込めばよい。

```js
Object.prototype.tap = function (callback) {
  return callback(this);
};
```

簡単すぎるし、モンキーパッチなので、これを避けていきたい。

# 基礎パターン (Promise風)

```js
function createThenable(object, callback) {
  const _object = callback(object);
  return {
    value: _object,

    then: function (_callback) {
      return createThenable(_object, _callback);
    },

    await: function () {
      return _object;
    },
  };
}
```

awaitは、操作感が伝わりやすいかと思い、この命名にした。valueをプロパティで呼ぶだけでもよい。上のコードは、このように使う。

```js
createThenable(1, (i) => {
  return i + 1;
}).then((i) => {
  return i + 1;
}).then((i) => {
  return i + 1;
}).await();
```

Object#tapが好きだと書いたが、これを再実装するには、createThenableをcreateTappableに、thenをtapに書き換えればそれで済むだろう。よく考えれば、前述したPromiseの副産物はObject#tapと同じものだった。

# Array.prototype.pushでメソッドチェーンしたい

そういえば、RubyのArray#pushは返り値がselfなのでメソッドチェーンできるけど、JavaScriptのArrayはそうなっていない。RubyからJavaScriptへ乗り換えた者には覚えがあるだろう。

```js
createThenable([], (array) => {
  array.push(1);
  return array;
}).then((array) => {
  array.push(2);
  return array;
}).then((array) => {
  array.push(3);
  return array;
}).await();
```

さきほどのコードをそのまま利用するとこうなるが、明らかに冗長なので特化させたい。

```js
function pushArray(array, callback) {
  array.push(callback(array));
  return {
    push: function(_callback) {
      return pushArray(array, _callback);
    },

    array: array,
  };
}
```

すると、以下のように書くことができる。

```js
pushArray([], () => {
  return 1;
}).push(() => {
  return 2;
}).push(() => {
  return 3;
}).array;
```

# 手軽なルーターを書きたい

ルーターというのは、Web Application Frameworkのルーターのことで、正規表現にマッチしたら引数のクロージャを実行する、というのを繰り返すものが欲しい。RegExp.prototype.execの返り値がtruthyの場合に、クロージャに引数として渡したいし、それをマッチするまで繰り返したい。この記事を書くきっかけとなった問題意識がこれ。

```js
function router(routes, regexp, handler) {
  routes.push({ regexp: regexp, handler: handler });
  return {
    bind: function (_regexp, _handler) {
      return router(routes, _regexp, _handler);
    },

    route: function (string) {
      for (let i = 0; i < routes.length; ++i) {
        const r = routes[i];
        const match = r.regexp.exec(string);

        if (match) {
          return r.handler(match);
        }
      }
    },
  };
}
```

この様に使う。

```js
router([], /aaa/, (match) => {
  return console.log(1);
}).bind(/bbb/, (match) => {
  return console.log(2);
}).route('bbbbbb');
```

先頭の空配列リテラルが美しくないが、再帰のために必要なものなので、どうしても隠したければこれを隠蔽する関数を書くとよいだろう。ところで、私がルーターと呼んだ「正規表現にマッチしたらクロージャを実行し、マッチしなければ次の候補を試す」ものは頻出だと思うが、通常はどのように書くのだろうか。
[個人用メモ/nil対策]Rubyで nil.to_sは文字列に変換して文字列を返す。使うのはNG

# 目的 
- 作業中バグが出てそれの修正が必要だったのでそれに対処した時のメモ


## 現象
![Image from Gyazo](https://i.gyazo.com/063f11d3f02dc8e486a4aba235ee48e4.png)
 
## 期待値
nilの値を挿入時にエラーが出ないようにしたい
 
## 対策

 ```ruby:
[OK]
# nil対策(pryで確認できます)
# rubyにはnilになってしまう状態を防ぐために「nilガード」という書き方が存在
# nilガード => 「もし変数がnilだった場合、値を入れる構文」

# 変数aに nil を代入
a = nil
# もし変数がnilだった場合、空文字列を入れる構文
a ||= ''   # =>　""
p a        # =>　""


# 変数aに "お茶"を代入
a = "お茶"
# nilガードで判定
a ||= ''    # =>　"お茶"
p a         # =>　"お茶"



-----------------------------------------
[OKだけどイケてない]
#[２番目に書いた記述。「nilガード」の存在を知らない]
object.nil? ? '' : object
# 三項演算子で対策。nilだったら空文字列を返す


-----------------------------------------
# [NG]
# [最初に記述したコード：UTF-8でしか動かない処理の場合はダメ]
# nil対策
object.nil? ? object.to_s : object
# 三項演算子で対策。nilだったらto_sメソッド
# to_sは文字列に変換して文字列を返す
```
で上記現象のバグが修正できた。

| pryでの確認　|
|:----:|

|nilの場合| nilではない場合|
|:-------:|:----------:|
|![Image from Gyazo](https://i.gyazo.com/216f8e4fd27518857ab8d41b22a95faf.png)|![Image from Gyazo](https://i.gyazo.com/668695b8efe25ed463daf6b3f8ec747b.png)|

#### なぜ`''`を使うのか？

<font color='red'>`s.to_s` と  `''`では文字コードが違うため</font>

```ruby:
# '' は<Encoding:UTF-8>
p ''.to_s.encoding #=> #<Encoding:UTF-8>

# .to_s は<Encoding:US-ASCII>
p nil.to_s.encoding #=> #<Encoding:US-ASCII>
```


## 余談

Rubyで nil.to_i は 0 を返す

[追記]
※UTF-8でしか動かない処理に投入するのであれば，`s.to_s` は使ってはいけない。
[Ruby で s が nil か String か分らぬとき s.to_s と s || '' はどっちがいい？
](https://qiita.com/scivola/items/1f6704f81aba18df9012)

## 参考

[to_s (Array)](https://ref.xaio.jp/ruby/classes/array/to_s)
sympyの微分方程式で「Euler’s formula」を参考にした//本家stackoverflowの投稿を修正された

#本家stackoverflowの投稿を修正された。Answerを翻訳してみた
(参考)Solving a 4th order ODE with SymPy raises NotImplementedError: CRootOf is not supported
https://stackoverflow.com/questions/51223475/solving-a-4th-order-ode-with-sympy-raises-notimplementederror-crootof-is-not-su

私の初期投稿

```
sympy NotImplementedError?
diff(x,2)-->Ok,diff(x,4)-->Error
What am I doing wrong? 
Thank you in advance and sorry for the bad english! 
Euler's critical load
https://en.wikipedia.org/wiki/Euler%27s_critical_load
wolframalpha------------------------------------------------------------------------------------------------------
{w''''(x)+ƒÉ**2*w(x)''=0}
 http://www.wolframalpha.com/input/?i=%7Bw''''(x)%2B%CE%BB**2*w(x)''%3D0%7D
{w[x] == (Cos[x ƒÉ] Subscript[c, 1])/ƒÉ^2 + (Sin[x ƒÉ] Subscript[c, 2])/ƒÉ^2 + Subscript[c, 3] + x Subscript[c, 4]}
sympy--------------------------------------------------------------------------------------------------------------
full_script.py :
    from sympy import *
    x = symbols('x', real=True)
    ƒÉ = symbols('ƒÉ', real=True,positive=True)
    w = symbols('w', cls=Function)
    eq=w(x).diff(x,2) +ƒÉ**2*w(x)
    print("w=",dsolve(eq).rhs)
    eq=w(x).diff(x,4) +ƒÉ**2*w(x).diff(x,2)
    print("w=",dsolve(eq).rhs)
v= C1*sin(x*Abs(ƒÉ)) + C2*cos(x*ƒÉ)
NotImplementedError: CRootOf is not supported over ZZ[ƒÉ]
```


(Answerのgoogle翻訳)
SymPyで4次ODEを解決するとNotImplementedErrorが発生する：CRootOfはサポートされていない
あなたは間違って何もしていません。 NotImplementedErrorは、SymPyが解決したい式を処理できないことを意味します。この場合、問題は、多項式モジュールにあります。多項式モジュールでは、記号係数fを持つ方程式t ** 4 + f ** 2 * t ** 2 = 0で何らかの形で苦労しています。それは本当にそれを扱うことができるはずです...この特定の方程式の回避策として、記号係数?を数（例えば、7）で置き換えます。
print（dsolve（eq.subs（E、7）、w（x））。rhs.subs（7、E））
C1 + C2 * x + C3 * sin（x * f）+ C4 * cos（x * f）を出力します。
もちろん、7が他の数字と組み合わせて14などになったら、これは簡単に間違ってしまう可能性があります。しかし、それはここで動作します。

```fullscript.python
from sympy import *
x = symbols('x', real=True)
w = symbols('w', cls=Function)
FE = symbols('FE', real=True,positive=True)
eq=w(x).diff(x,4) +FE**2*w(x).diff(x,2)
print("w=",dsolve(eq.subs(FE, 7), w(x)).rhs.subs(7, FE))
# w= C1 + C2*x + C3*sin(x*FE) + C4*cos(x*FE)
```
Case-Sensitive な環境でも Visual Studio Code が使いたい！

最近、Markdown で文章を作成したりする機会が増えてきました。

そこで普段使ってるエディタを Markdown プレビューなどの機能が豊富な Visual Studio Code (VS Code) にしようと決心。

しかし、インストールしてアイコンをダブルクリックしても起動せずにコケてしまうという事態に(Docs でピコンと跳ねたあと、スンと消える)。

色々試した結果、VS Code のシステムファイルを case-insensitive なシステムにおいたら起動できることがわかった。



## 現象の確認と改善後の動作

### case-sensitive な環境では(一部省略)
```sh
$ /Applications/Visual\ Studio\ Code.app/Contents/MacOS/Electron

> [main 20:15:32] Error: listen ENOTSUP ...
```
とエラーを吐いて起動せず。

### case-insensitive な環境にシステムファイルをおいたら
```sh
$ /Applications/Visual\ Studio\ Code.app/Contents/MacOS/Electron --user-data-dir=/Volumes/MacHD2/Library/Application\ Support/Code

> [main 20:44:13] update#setState idle
```
と起動できることを確認。

## 改善法
### case-insensitive なディスクを作成する。
Mac であれば`ディスクユーティリティ`から現在のディスクに別パーティションを作ってしまうのが手っ取り早い。
結局 case-sensitive な環境では動作していないが、case-sensitive な環境をそのままに動作可能なので、個人的には許容範囲。

![part.png](https://qiita-image-store.s3.amazonaws.com/0/259755/94d29b4e-8b36-d19e-2ffb-716aa4dc072d.png)

このように、ここで新たなパーティションのディスクシステムを case-insensitive にする。

ここにシステムファイルを置くようにすれば VS Code を起動できるようになる。

### VS Code 起動用の `.app` 作成
毎回ターミナルからコマンドで実行するのは不便なので、起動用のシェルスクリプトを作成して、`.app` にバンドルしてしまおう。

`.app` を作るのは結構簡単で、
以下のような構成でディレクトリとファイルを用意するだけである。
アイコンは各自好きに用意すること。

```
MyVSC.app
└── Contents
    ├── Info.plist
    ├── MacOS
    │   └── startup.sh
    └── Resources
        └── icon.icns
```

起動用シェルスクリプトは上で打ったコマンドを書くだけ。

```sh:startup.sh
#!/bin/sh
/Applications/Visual\ Studio\ Code.app/Contents/MacOS/Electron --user-data-dir=/Volumes/MacHD2/Library/Application\ Support/Code
```

以下のような XML を `Info.plist` として保存。
**最初を大文字**にしなければならない。

```xml:Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
 <dict>
  <key>CFBundleExecutable</key>
  <string>startup.sh</string>
  <key>CFBundleIconFile</key>
  <string>icon.icns</string>
  <key>CFBundlePackageType</key>
  <string>APPL</string>
  <key>CFBundleSignature</key>
  <string>????</string>
 </dict>
</plist>
```

あとはこの `MyVSC.app` を `/Applications` に配置すればOK。

![icon.png](https://qiita-image-store.s3.amazonaws.com/0/259755/d5895543-d2b6-d4ff-f73f-b426bafd1673.png)
(例とは名前変えてあるけど気にしない)
「Kubernetesによるコンテナオーケストレーション」参加メモ

https://devlove.doorkeeper.jp/events/76164

DevLOVE主催の「Kubernetesによるコンテナオーケストレーション」に参加してきました。
雑なメモとなりますが、共有します。

# 参加目的
- いつものDevLOVEでの開催
- 最近、流行っているらしい。
- 技術トレンドを追いかけるため

# Introduction of Kubernetes & Rancher
- https://www.slideshare.net/cyberblackvoom/introduction-of-kubernetes-rancher
- 市川さん
- インフラエンジニア、フリーランス

### Market trend of Kubernetes
- 十分な成熟したソフトウェアに到達した段階と認められた
- Amazon EKS が正式版
- Azure Kubernetes ServiceがGAになった
- VMwareでもサービス開始
- GitHubもKubernetesを利用している。SREの事例として面白い

### Kubernetes Acrhitecture
- google内のコンテナオーケストレーションツールからインスパイアされたツール
- master と nodeで構成される
- podに対してのローリングアップデート、ロールバックを行うことができる

### Introduction RANCHER
- コンテナ環境の構築、運用するための管理プラットフォーム

### おすすめ
- プログラマのためのDocker教科書
- 資格
    - CKA
    - CKAD
- katacoda.com

# Kubernetes(k8s)を使いこなすために理解しておくべきこと/ベストプラクティス
- 須江さん
- red hatの人
- https://www.slideshare.net/nobusue/devlove-k8s-nobusue-20180711

### コンテナイメージ作成
- Dockerfileを使う 
- 適切なレイヤー化をする
    - 責任範囲ごとにコンテナの回想をメンテナンス
    - Dockerイメージはレイヤー毎にIDが付与され、切り戻しも容易かつ確実
- ログ出力先の変更（stdoutすること）
- 環境依存パラメータやシークレットの外部化
    - ConfigMapを活用
- 信頼できるイメージを使うこと
- コンテナ・セキュリティの１０大要素がある。あとで読む

### k8sへのデプロイメント
- デプロイメントの３要素
    - コンテナイメージ（git管理）
        - dockerfileで管理
    - アプリケーション（git管理）
        - k８sで管理
    - 永続データ
        - 今まで通りバックアップとかレプリカとかで管理

### ノード障害対応の自動化
- リカバリーではなく、イメージからの再作成となるので、ステートは失われる
- ステートを保持したい場合は、コンテナ外部のストレージを利用する
- 縮退運転を考慮した設計が必要

### Podのヘルスチェッック
- サービスレベルでのヘルスチェックが可能
- VMで運用しているものをコンテナ化するだけでも、運用の省略化が可能

### リソース浪費の抑止：Quota/Limit
- 設計すること。悪さする。

### ログの出力
- 標準出力にはく、fluentdで収集、elasticsearchで可視化？

### 
- ステートレスサービスを乗せるのがよい。
- 永続データは、得意ではない。
- WEBAPIの課題
    - LB, searvice Discovery
        - k8sにのせるだけで解決する
        - RESTを多用するサービスは、載せると楽になる。

# 感想
- そもそもコンテナとVMの違いもわからない状態で参加しましたので、知らないことが数多くありました。
- わからないことが多く増えたことは、良かった。
- 2時間でわかった気になれるので、勉強会に出席するのは良いと改めて実感する。
- コンテナとVMの違いを簡単に説明している資料を見つけたので共有。
    - https://qiita.com/miyasakura_/items/87ccb6d4a52d4a00a999
integromatを使って SLACKで投稿した内容を  別のSLACKワークスペースに投稿する

複数のSLACKワークスペースを使っていて、これまで共有したい内容を手動でコピペとかしてたんですが、面倒になってきて自動化できないかなと。

> **基本的な使い方とかの参考**
Integromatの使い方 - Qiita https://qiita.com/nendocode/items/b3f9f9810a0dfd744dcf
IntegromatでBacklogのWebhookを利用して、Slackに自動通知を出す方法 | 株式会社INDETAIL - インディテール https://www.indetail.co.jp/blog/16609/


#大枠
▼「Watch messages」で受け取って、別のワークスペースに投稿しているだけです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94687/014f1319-ac59-73d6-e504-7f9f2e828d06.png)

#詳細
Routerで振り分けて、テキストとファイルシェア（主に画像を想定）で処理を別けています。

**1-1.テキスト側フィルタ**
<img src="https://qiita-image-store.s3.amazonaws.com/0/94687/8314c11f-7c67-be6d-d660-e596e7dae73e.png" width=30%> 
「Text」が「Exists」じゃない時にエラーを吐くことがあって（カレンダー通知とかかな？）条件を足しています

**1-2.テキスト側モジュール（Create a message）**
<img src="https://qiita-image-store.s3.amazonaws.com/0/94687/7c2d8dd3-74e9-68de-f447-7bf6ebf8ae2a.png" width=50%> 

**2-1.ファイルシェア側フィルタ**
<img src="https://qiita-image-store.s3.amazonaws.com/0/94687/cd1f80c9-c086-8ab9-1c7f-91809e0c3478.png" width=30%> 

**2-2.テキスト側モジュール（Upload a file）**
<img src="https://qiita-image-store.s3.amazonaws.com/0/94687/837cbd09-888f-595a-175d-8f4a038b4805.png" width=50%> 


▼画像タイトルがテキストになっているけどまあ目的は達してるからヨシとします
![qiita_inu.jpg](https://qiita-image-store.s3.amazonaws.com/0/94687/a7514494-0284-5ece-d76b-9cfa26eaca67.jpeg)



#まとめ
integromat面白いですね。グリグリ動かせるインターフェースが気持ちよいです。
（もちろんもっと複雑な処理をするなら別の手段をとったほうが良さそう）
fseek()関数を利用してファイルポインタを移動させる

C言語によるファイル処理を行う時に、一度EOFまで読み込んだ後に任意の場所にファイルポインタを移動させてまた処理を行いたい時がある。

fseek()関数を利用すると、ファイルポインタを任意の場所まで移動させることが出来る。

```c
int fseek(FILE *stream, long offset, int whence);
```

`*stream` にはファイルポインタを、`offset`には基準となる地点からのバイト数を、`whence`には基準となる地点を渡す。

whenceには、 `stdio.h` で定義される以下の定数を指定することが出来る。

```c
#define	SEEK_SET	0	/* ファイルの先頭を基準にする */
#define	SEEK_CUR	1	/* その時点でのファイルポインタの位置を基準にする */
#define	SEEK_END	2	/* ファイルの終端を基準にする */
```

例として、学生の一覧が書き込まれているファイル `students.txt` を読み込み普通に表示した後に、先頭1文字だけ大文字にして出力するプログラムを示す。

```fseek_sample.c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
	FILE *fp;
	char buff[100];

	fp = fopen("students.txt", "r");
	if (fp == NULL) {
		printf("ファイルを開けません。\n");
		exit(EXIT_FAILURE);
	}

	printf("-----学生名の一覧を表示します-----\n");
	while (fgets(buff, 100, fp) != NULL) {
		printf("%s", buff);
	}
	printf("\n");

	// ファイルポインタfpをファイルの先頭SEEK_SETから0バイトの地点に移動させる
	fseek(fp, 0L, SEEK_SET);
	printf("-----学生名の一覧を再表示します。-----\n");
	while (fgets(buff, 100, fp) != NULL) {
		buff[0] = toupper(buff[0]);
		printf("%s", buff);
	}
	printf("\n");

	fclose(fp);

	return EXIT_SUCCESS;
}
```

```students.txt
takuya
kotaro
toshiaki
chikara
kuniharu

```

```
# 実行結果
-----学生名の一覧を表示します-----
takuya
kotaro
toshiaki
chikara
kuniharu

-----学生名の一覧を再表示します。-----
Takuya
Kotaro
Toshiaki
Chikara
Kuniharu

```
自分なりのズンドコキヨシを書いてみることにした。

# ズンドコキヨシ

こちらの記事に触発されて、自分も書かねば！と思い今更ながら「ズンドコキヨシ」を書いてみました。

[1行で書く『「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了』](https://qiita.com/sanonosa/items/4733857340fe6ccf6c3f)

## やりたかったこと

「ズンドコキヨシ」が何をやるプログラムなのかは、先人の記事を見てもらうとわかると思いますので、私なりにやりたかったことを書いてみます。

- RepeatやRangeを使うと繰り返し回数のマジックナンバーが発生するのが嫌
    - **無限に**「ズン」「ドコ」を生成したい。
    - なるべく**シーケンスのまま**処理したい。
- 無駄に最新C#要素を挟み込みたい。（ワガママ）
- スッキリしたコードにしたい。
    - _今回目指すのはワンライナーではない_

## 書いたコード

```csharp:ズンドコキヨシ-C#7.3-
using System;
using System.Linq;
using System.Collections.Generic;

class Program {
    static void Main() =>
        Ext.GenerateInfinite(() => Guid.NewGuid().CompareTo(Guid.NewGuid()) > 0 ? "ZUN" : "DOKO")
            .Quintuple()
            .TakeWhile(t => t != ("ZUN", "ZUN", "ZUN", "ZUN", "DOKO"))
            .Select(t => t.w0)
            .Append("DOKO")
            .Append("KI・YO・SHI!!")
            .Select(w => w + " ")
            .ToList()
            .ForEach(Console.Write);
}

static class Ext {
    /// <summary>流れてきたシーケンスをバッファしつつ5-tupleで返す</summary>
    public static IEnumerable<(T w4, T w3, T w2, T w1, T w0)> Quintuple<T>(this IEnumerable<T> ts) {
        var result = (w4: default(T), w3: default(T), w2: default(T), w1: default(T), w0: default(T));
        foreach (var item in ts) {
            result = (result.w3, result.w2, result.w1, result.w0, item);
            yield return result;
        }
    }

    /// <summary>無限に生み出す</summary>
    public static IEnumerable<T> GenerateInfinite<T>(Func<T> generator) {
        while (true) {
            yield return generator();
        }
    }
}
```

### 工夫した箇所

- LINQ標準メソッドには無限に要素生成するメソッドが無いようなので、`GenerateInfinite(generator)`メソッドを作って、ここで**無限に**「ズン」「ドコ」するようにした。
- シーケンスを流したままZUNx4DOKO判定をしたかったので、元のシーケンスを五つ組シーケンスに変換する`Quintuple()`拡張メソッドを作ることにした。
- 五つ組の比較(Tuple比較)をやりたかった。(C#7.3)
- 表示の直前まで**シーケンスのまま**処理した。

# まとめ

自分なりのコダワリを出すことは出来たような気がします。
こういった実験的なコードを書くのは楽しいですね！
GraphQLの旅(4) PythonからGraphQLをたたく

# docker-composeでさっとjupyterを起動

- docker-compose.yamlファイル作成

```yaml
version: '2'
services:
  jupyter:
    image: jupyter/base-notebook
    environment:
      GRANT_SUDO: "yes"
    user: root
    ports:
     - "8888:8888"
    tty: true
    stdin_open: true
```

- 起動

```
docker-compose up -d
```

- 起動後Jupyterにアクセス

URL

```
http://<localhostかdockerサーバ>:8888/
```

- アクセス後, `new -> terminal`でターミナルを起動し、[graphqlclient](https://github.com/prismagraphql/python-graphql-client)をインストール。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/d0a8a7ea-01ba-a069-29e0-b65a7b060ec2.png)

# GraphQLにアクセス

[以前の記事](https://qiita.com/Hiroyuki_OSAKI/items/cabc086cac06787be18e)で準備したGraphQLサーバがあるとします。

- 動いているGraphQL

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/07a60455-781a-83b9-1a34-ba0c6f29a9f4.png)

- Jupyterからのアクセス

**`<GRAPHQL IP>`、`<PORT>`の部分は置き換えてください**

```python
from graphqlclient import GraphQLClient

client = GraphQLClient('<GRAPHQL IP>:<PORT>')

result = client.execute('''
{
  user(id: "cjj47bqxd000j0815axku73co") {
    ...namename
  }
}

fragment namename on User {
  name
  id
  __typename
}
''')

print(result)
```

- 結果

```json
{"data":{"user":{"name":"tokyo","id":"cjj47bqxd000j0815axku73co","__typename":"User"}}}
```

GraphQLの結果をちゃんと受け取れていることがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/cee5ca90-1fd6-d38f-6183-5c73085a8454.png)



## 参考

- [JupyterのDockerイメージまとめ](https://qiita.com/kshigeru/items/ea174d6bcacc474f2a51)
- [graphqlclient](https://github.com/prismagraphql/python-graphql-client)
zcc インラインアセンブラ

z88dkのzccでインラインアセンブラを使う。

参考
[z88dk - The Stack Frame](https://www.z88dk.org/wiki/doku.php?id=usage:stackframe
)

```inline.c
/*
zcc +msx -lndos -create-app inline.c
bload"cas:",r
*/

#include <stdio.h>

int myfunc(char len, unsigned char *p)
{
        #asm

        ld      hl, 2
        add     hl, sp
        ld      e, (hl)
        inc     hl
        ld      d, (hl)         ; de=p
        inc     hl
        ld      b, (hl)         ; b=len
loop:
        ld      a, (de)
        call    $00a2           ; CHPUT
        inc     de
        djnz    loop

        ld      hl, $cafe       ; return value

        #endasm
}

void main()
{
        int ret = myfunc(5, "0123456789");
        printf("\nret = %x\n", ret);
}
```

WebMSXを起動しa.casファイルをCassetteにドロップする。
![WMSX Screen (1).png](https://qiita-image-store.s3.amazonaws.com/0/257554/1b9432c7-427a-55e4-02f0-9ecdaef8ae05.png)

- FASTCALL版

```fast.c
/*
zcc +msx -lndos -create-app fast.c
bload"cas:",r
*/

#include <stdio.h>

int __FASTCALL__ myfunc(unsigned char *p)
{
        #asm

loop:
        ld      a, (hl)
        or      a
        jr      z, exit
        call    $00a2           ; CHPUT
        inc     hl
        jr      loop
exit:
        ld      hl, $babe       ; return value

        #endasm
}

void main()
{
        int ret = myfunc("hello, world");
        printf("\nret = %x\n", ret);
}
```

![WMSX Screen (3).png](https://qiita-image-store.s3.amazonaws.com/0/257554/450ab56d-884c-f3a5-7463-c0170fd52ce7.png)
URLDECODE後の日本語の文字化けの対処について【PHP】

## **URLDECODE後の日本語の文字化けの対処について**
　URLでエンコードされた機種依存文字を例にします。
　「%E2%93%88」と「%E2%93%85」についてです。
　単純にデコードを行い、文字コード変換を行うと、
　前者が〇S（Sが〇枠に入った文字）、後者が〇P（Pが〇枠に入った文字）となります。
　まず、環境ですが、以下のようになります。
　①php.ini・・・default_charset = "SJIS"
　②xxx.php・・・charset="SJIS"
　の状態とします。この環境下で、どの文字コードで文字化けしない結果が得られるか
　検証です。
　事前に、「mb_detect_encoding($wk1, "ASCII,EUC-JP,UTF-8")」で
　文字コードを調べておきます。この文字コードは、UTF-8となりました。
　urldecode関数を使用し、UTF-8から文字コード変換を行い、上記の機種依存文字が正常に表示されるか検証です。

```php:xxx.php
$wk1 = "%E2%93%88";
echo urldecode($wk1,'SJIS','UTF-8');   // ①の結果
echo urldecode($wk1,'CP932','UTF-8');  // ②の結果
echo urldecode($wk1,'EUC-JP','UTF-8'); // ③の結果
```

①、②とも「?」と出力されました。③は、残念ながら文字化けで変な漢字？が出力されました。
①、②ともSJIS関連ですが扱える漢字が②の方が多く文字化けにも対応されていますが、
ある機種依存文字は、まだ対応していないなど課題はあります。
そうしたら、これでは限界？と思っている方もいらっしゃると思いますが
実は、以下の方法で文字化けを解消することができます。

```php:xxx.php
$wk1 = "%E2%93%88";
echo urldecode($wk1,'HTML-ENTITIES','UTF-8');   // ④の結果
```

これは、HTML エンティティを適切な文字に変換するというもの。
④の結果は、「Ⓢ」という機種依存文字となります。正常に表示されていますか。
上記のような、URLがエンコードされたものには、適用可能ですが、&で書かれた数値付の記号（&#xCODE）みたいなのは、これとは別の方法で変換をかけないとうまくいかないので注意が必要です。
CentOS7.2以降のブートローダーパスワード設定方法

# 前置き
CentOS7からブートローダーのパスワード設定方法が変わったのでメモ

実施環境はCentOS7.3、パーティションはMBRです。
EFIだとディレクトリの一部が異なる可能性があります。

# 以前のブートローダーのパスワード設定方法
CentOS6では`grub-md5-crypt`コマンドでブートローダーのパスワード設定をしていましたが、CentOS7では無くなった模様。

```
[root@hostname]# which grub-md5-crypt
/usr/bin/which: no grub-md5-crypt in
 (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
[root@hostname]#
```

yumで検索しても無し

```
[root@hostname]# yum provides grub-md5-crypt
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.yz.yamagata-u.ac.jp
 * extras: mirror.qoxy.com
 * updates: mirror.0x.sg
No matches found
[root@hostname]#
```

調べたところ、CentOS7.2以降ではブートローダーのパスワード設定は`grub2-setpassword`コマンドを使用するようです。

# CentOS7.2以降のブートローダーのパスワード設定方法
`grub2-setpassword`はパスワードのハッシュ値を含むuser.cfgを生成するコマンドです。
実行すると設定するパスワードを二回聞かれるので、それぞれ同じパスワードを入力します。

```
[root@hostname]# grub2-setpassword
Enter password:
Confirm password:
[root@hostname]#
```

`/boot/grub2/`にパスワードのハッシュ値を含んだ`user.cfg`が生成されます。

```
[root@hostname]# ls -l /boot/grub2/user.cfg
-rw-------. 1 root root 298  7月 10 22:08 /boot/grub2/user.cfg
[root@hostname]#
```

```
[root@hostname]# cat /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.D6FC85B1A45126E6A679CC412DA00243F5B26E6
BA8E2817A35FED4C1E00B27F051668A9A6DC27E54360381F0DA302CB775C2565D148EA8B6E55FFA
BDECEBF10C.B210A279E2A0655C984F3C28BB83B5E266A67F3B8E0C7C5B77D6CAA74FBEA9C7C9C7
A3554F8752E3DFD571855118FD6CE3263FDC908E4BD8AC048252E8A73284
[root@hostname]#
```

これでブートローダー起動時にブートエントリーを修正しようとするとIDとパスワードを求められるようになります。
以前のようにgrub.cfgを再作成する必要は無くなりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/b59621b9-42f6-aa20-6410-4182904d373f.png)

**'e'**キーでブートエントリーの修正モードに入ろうとすると、IDとパスワード入力を求められます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/0524606c-b6f6-af16-9daa-35533b89d170.png)

# 補足
ブートエントリーの修正時のみではなく、通常のブート時にもパスワードを確認するようにするには以下の対応が必要となります。
※パスワードを忘れるとOSの起動ができなくなるので、設定する場合は慎重に実施してください！

grub.cfgを開き、パスワードで保護する必要があるブートエントリを検索する。
「--unrestricted」パラメータを削除する。

```
menuentry 'CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)' --class centos --
class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 
'gnulinux-3.10.0-514.el7.x86_64-advanced-cbe73024-c98b-4644-8dc5-c8ed40b80d2f' 
{
        load_video
        set gfxpayload=keep
```
なお、grub.cfgを`grub2-mkconfig`で再生成した場合は「--unrestricted」パラメータが復活する為、通常ブート時のパスワード保護も消えます。
その場合、再度上記手順を実施する必要があります。


以上
weighttpを使ってサーバー速度を測ってみよう！

表題の通りです。現在[自作OSS](https://qiita.com/developer-kikikaikai/items/c504a1963310e2842849)が使い物になるか試すために[lighttpdのマルチスレッド化](https://github.com/developer-kikikaikai/lighttpd_multithread)にトライしているのですが、それがやっとまともな性能測定が出来るレベルまで動作するようになったので測定してみました。

##準備～weightのインストール

構築した環境はUbuntu18.04です。

1 . 事前準備その1, ソースコードダウンロード
以下からダウンロードします。
https://github.com/lighttpd/weighttp

2 . libevのインストール

```
sudo apt install libev-dev
```
3 . コンパイル、インストール
ソースを展開して以下を実行します。

```
./autogen.sh
./configure
make
make install
```

インストールのデフォルトパスは/usr/localになります。


## 使ってみる

使い方は以下です。

```
weighttp -n リクエスト数 -c 同時接続クライアント -t クライアントが使用するスレッド数 -k(キープアライブの場合) localhost/index.html
```

例えば1クライアントから100,000コネクションを試すなら以下のような感じです。
$ weighttp -n 100000 -c 1 -t 1 -k  localhost

出力はこのように、処理時間の他にstatus code, failedパケットの数等が確認できます。

```
$ weighttp -n 100000 -c 1 -t 1 -k  localhost/index.html
weighttp 0.4 - a lightweight and simple webserver benchmarking tool

starting benchmark...
spawning thread #1: 1 concurrent requests, 100000 total requests
progress:  10% done
progress:  20% done
progress:  30% done
progress:  40% done
progress:  50% done
progress:  60% done
progress:  70% done
progress:  80% done
progress:  90% done
progress: 100% done

finished in 9 sec, 728 millisec and 61 microsec, 10279 req/s, 36050 kbyte/s
requests: 100000 total, 100000 started, 100000 done, 100000 succeeded, 0 failed, 0 errored
status codes: 100000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 359118810 bytes total, 23018810 bytes http, 336100000 bytes data
```

## 比較してみる

いくつかパターンを変えてlighttpd 1.4.49とマルチスレッド化lighttpdの速度比較をしてみました。

### 比較結果

index.htmlにアクセスする速度 (100,000リクエスト)

|パターン|lighttpd 1.4.49 速度|リクエスト/sec|マルチスレッド化速度|リクエスト/sec|
|:----|:----|:----|:---|:---|
|1 client, 1 thread|8.440sec|11847|9.728sec|10279|
|4 client, 1 thread|1.728sec|57862|2.609sec|38327|
|4 client, 4 thread|2.284sec|43769|2.717sec|36797|
|100 client, 4 thread|1.608sec|62185|1.725sec|57952|
|500 client, 4 thread|1.720sec|58126|2.192sec|45604|
|1000 client, 4 thread|1.893sec|52823|1.463sec|68311|


純粋な1回1回のリクエストはlighttpd 1.4.49の方が格段に速いですが、クライアント数が増えると勝負できるくらいのスピードが出ています。
実際にprogressの進みを見てる感じ、lighttpd 1.4.49は各コネクションの応答を同じ速度で返しているのに対し、マルチスレッドの方はドドドっと返してちょっと止まってといった動作をしていたので、weightを実行するPCを分ければもう少しいい結果が出るかもしれません。

また、今回の修正でいい影響が出ていそうな重い処理として、cgiの比較もしてみました。
cgiにアクセスする速度 (10リクエスト, リクエスト/secは省略)

|パターン|lighttpd 1.4.49 速度|マルチスレッド化速度|
|:----|:----|:----|
|1 client, 1 thread|60.707sec|60.129sec|
|4 client, 4 thread|18.243sec|18.045sec|
|10 client, 4 thread|6.107sec|6.113sec|

う～ん、変わらん(笑) でもpythonコードを利用してコード自体はすっきり出来たので、速度がトントンで割と満足です。


…というか先々月の自分は、この時点でlighttpdに速度はトントンか勝てるとか言ってたんですよね。実際はいじればいじるほど色々と工夫をしないといけないことがわかり、泣きそうでした笑
おかげでいいthreadpoolのライブラリが出来ましたが。

ちなみに1000でやめたのも私がいじったマルチスレッドlighttpdがこれ以上は安定して動作しないからです。
ここから先のバグつぶしは本質から離れていくのでやる気ないですが(-_-;)

### 余談:メモリ比較

ついでにメモリ使用量の比較もしてみました。

|モジュール|メモリ使用量|
|:----|:----|
|lighttpd 1.4.49|32MByte|
|マルチスレッド化lighttpd|561MByte|

…ま、まあライブラリ使用感確認の為に接続可能なコネクション分のメモリ取ってたり、スレッドのスタックサイズ8つ立ち上げたり、メモリについては気にせず作ってますからこれくらい許容範囲じゃないですかね(震え)
軽量 && 高速を実現することの難しさを感じます。

世の中で使われてるOSSってほんとすごいな
Macでスクリーンショットの保存先や画像名やファイル形式を変える方法

#背景
***
私は、Macでよく**スクリーンショット機能**を使っています。
しかし、初期設定で撮影すると画像は、デスクトップに保存されてしまい、画像名も長いため、個人的に不便でした。  

よって、今回は**スクリーンショットの保存先・保存名・ファイル形式を自由にカスタマイズできる方法**をまとめていきます。

#Macでスクリーンショットを保存する方法
***
- **画面全体**  
画面全体を保存します。

`command + shift + 3`

- **選択範囲のみ**  
マウスで選択した部分のみ保存します。  
ショートカットキーを押しながら、保存したい範囲を選択します。

`command + shift + 4`

#スクリーンショットの保存先変更の方法
初期設定では、デスクトップに保存される設定になっています。
##1.ターミナルを起動する
まず初めに、Macのターミナルをクリックして起動します。
<img width="357" alt="n.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/265047/cc05e852-7a89-d7b2-baf5-52cfbd131373.jpeg">

ターミナルを開くことができたら、次にコードを入力していきます。

##2.保存先変更のコード入力
以下のコードを入力します。

```
↓~/Pictures/の部分を変更することで保存先を自由に変更できます
defaults write com.apple.screencapture location ~/Pictures/

↓再起動コードを入力すると変更の処理完了
killall SystemUIServer
```
##3.元に戻す方法
以下のコードを入力します。

```
↓保存先を初期設定に戻します
defaults delete com.apple.screencapture location

↓再起動コードを入力すると完了
killall SystemUIServer
```

#スクリーンショットの保存名変更の方法
***
初期設定では、`スクリーンショット+現在時間`という名前で保存されます。  

例）`スクリーンショット 2018-12-04 11.30.00`
##1.ターミナルを起動する
まず初めに、Macのターミナルをクリックして起動します。
ターミナルを開くことができたら、次にコードを入力していきます。

##2.保存名変更のコード入力

- スクリーンショットの部分を変更

```
↓名前を"ScreenShot"に変更する
defaults write com.apple.screencapture name "ScreenShot"

↓" "内をなくすと、スクリーンショット部分を消去できます
defaults write com.apple.screencapture name ""

↓再起動コードを入力すると完了
killall SystemUIServer

```

- 現在時間の部分を消去

```
↓現在時間の部分を消去
defaults write com.apple.screencapture include-date -bool false

↓再起動コードを入力すると完了
killall SystemUIServer
```
##3.元に戻す方法
以下のコードを入力します。

```
↓スクリーンショットの部分を元に戻す
defaults write com.apple.screencapture name スクリーンショット

↓現在時間の部分を元に戻す
defaults delete com.apple.screencapture include-date

↓再起動コードを入力すると完了
killall SystemUIServer
```
#ファイル形式の変更方法
##1.ターミナルを起動する
まず初めに、Macのターミナルをクリックして起動します。
ターミナルを開くことができたら、次にコードを入力していきます。

##2.ファイル形式変更のコード入力

- **jpg**に変更

```
↓jpg形式に変更
defaults write com.apple.screencapture type jpg

↓再起動コードを入力すると完了
killall SystemUIServer
```
- **png**に変更

```
↓png形式に変更
defaults write com.apple.screencapture type png

↓再起動コードを入力すると完了
killall SystemUIServer
```
- **gif**に変更

```
↓gif形式に変更
defaults write com.apple.screencapture type gif

↓再起動コードを入力すると完了
killall SystemUIServer
```
その他にも、いくつかのファイル形式を指定することができます。
  

#おわりに

今回は、Macにおけるスクリーンショットのカスタマイズについてまとめていきました。
それぞれの作業にあったスクリーンショット環境がつくれるので、データベース作成や資料作りの際に重宝しています。Macユーザの方は、是非試してみてください!!
Mastodonで利用しているPostgresqlを9.5から9.6にアップグレードしてみた(Ubuntu 16.04編)

Mastodonに利用しているPostgresqlのバージョンが9.4以下だと
Mastodonをv2.4.2に上げることが出来ないのですが、9.5なら問題ないのでいいかなーと思ってたのですが
どうせまた何れはやらなければならないし、9.5ってのも微妙だったので9.6にアップグレードしてみました。
多分9.4から9.6でもいけるはず…

今回の作業は以下のURLをまるまる参考にしています。
https://gist.github.com/johanndt/486955d141d7f8883a537c2679b6a4f2
うちの環境は非DockerなんでDocker環境な方にも適用できるかわかりません。
あと、一応作業前にスナップショットなりバックアップなり取っておくことをオススメします。

1．とりあえずコンソールに入ったらpostgresqlの参照先の追加とパッケージリストの更新

```
sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main"
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
```
2.Postgresql 9.6をインストール
`sudo apt-get install postgresql-9.6`

3.インストールが終わったら
`dpkg -l | grep postgresql` で

```
ii  postgresql                          9.5+173ubuntu0.1                           all          object-relational SQL database (supported version)
ii  postgresql-9.5                      9.5.13-0ubuntu0.16.04                      amd64        object-relational SQL database, version 9.5 server
ii  postgresql-9.6                      9.6.9-2.pgdg16.04+1                        amd64        object-relational SQL database, version 9.6 server
ii  postgresql-client-9.5               9.5.13-0ubuntu0.16.04                      amd64        front-end programs for PostgreSQL 9.5
ii  postgresql-client-9.6               9.6.9-2.pgdg16.04+1                        amd64        front-end programs for PostgreSQL 9.6
ii  postgresql-client-common            173ubuntu0.1                               all          manager for multiple PostgreSQL client versions
ii  postgresql-common                   173ubuntu0.1                               all          PostgreSQL database-cluster manager
ii  postgresql-contrib                  9.5+173ubuntu0.1                           all          additional facilities for PostgreSQL (supported version)
ii  postgresql-contrib-9.5              9.5.13-0ubuntu0.16.04                      amd64        additional facilities for PostgreSQL
```
9.5と9.6がそれぞれインストールされている事を確認
また
`pg_lsclusters` 

```
Ver Cluster Port Status Owner    Data directory               Log file
9.5 main    5432 online postgres /var/lib/postgresql/9.5/main /var/log/postgresql/postgresql-9.5-main.log
9.6 main    5433 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
```
両バージョンともオンラインであることが確認できる

4.アップグレードするため9.6の設定等を削除して、ついでに止める
`sudo pg_dropcluster 9.6 main --stop`
これで9.5の設定を引き継ぐための箱ができた（と解釈している）

アップグレード作業をするためpostgresqlのサービスを止める
`sudo service postgresql stop`

そして、9.5をアップグレードをする
`sudo pg_upgradecluster 9.5 main`

で、ここでうちの環境ではエラーが発生した。
うちの環境ではcronで毎日セキュリティアップデートをする設定にしていたのだが
何かの拍子でpostgresql10もインストールされていたので怒られた。
というわけでバージョンを指定した。
`sudo pg_upgradecluster -v 9.6 9.5 main`

上手く行けば後はコーヒーでも飲みながら出来上がるのを待ちましょう。
大規模なインスタンスですとMastodonのDBをアップグレードするのに相当時間がかかるはずです。

終わりましたら
`psql --version` でバージョンを確認し
`psql (PostgreSQL) 9.6.9` のように9.6になっていることを確認してください。

もし違うバージョンが出力されたら
https://mementoo.info/archives/2146
を参考にしてください。

ということでやっつけですがpostgresのアップグレード方法でした。
TensorflowGPU 動作確認用スクリプト

自分のTensorflow-gpuが動作しているかどうかを判定するスクリプト：

```python

import tensorflow as tf

# デフォルトGPU (device:0)を指名で行列計算を行う
with tf.device('/gpu:0'):
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
    c = tf.matmul(a, b)
with tf.Session() as sess:
    print (sess.run(c))
```
[Tensorflow ver1.40+以降で確認済み]


エラーにならず、以下を確認できれば確実にGPUで回ってる事が確認できる：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/263382/f786e43f-afee-110d-ea2d-4c154d647911.png)
Rubyの小数計算について

# integerのみの式
```ruby
[7] pry(main)> (4 + 3) / 2
=> 3
```

# 分子を浮動小数点として変換した場合
```ruby
[8] pry(main)> (4.to_f + 3) / 2
=> 3.5
```

```ruby
[9] pry(main)> (4.to_f + 3) / 3
=> 2.3333333333333335
[10] pry(main)> (4 + 3.to_f) / 3
=> 2.3333333333333335
[11] pry(main)> (4 + 3) / 3.to_f
=> 2.3333333333333335
```

integerとして格納する場合とdecimalとして格納する場合がプロジェクトであったので、注意しないとなと思いました。
【Android Studio】アクティビティを持たないアプリをAVDでエミュレートする方法

仕事中に遭遇したトラブルと解決策のメモ。ググっても情報が出なかった。
日本語化済みのAndroid Studioを使用しているため、英語のまま使用している方は適時読み替えて下さい。

##問題
"Add no Activity"でプロジェクトを作成し、アクティビティを作成しないまま実行しようとすると
「デフォルトのアクティビティがねえよ！」
と跳ねられて実行できません。

![SnapCrab_NoName_2018-7-11_20-40-25_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/230368/79c082d0-d0c7-1795-1d00-e8cfd49031ff.png)

##解決策
1.構成の編集を開きます。
![SnapCrab_NoName_2018-7-11_20-42-10_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/230368/9f1339fa-cce5-c22d-8fd3-496e9989e6d6.png)

2.「起動オプション」内の「起動」プルダウンで「何もありません。」を選択します。
![SnapCrab_NoName_2018-7-11_20-42-17_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/230368/6b624d61-e10f-fa35-9cbc-931c3ee3fe74.png)

以上の手順で実行可能となりAVDでエミュレートできます。
firebase onメソッドについて

```a.js
firebase.database().ref("/messages")

    .on('value', snapshot => {
            snapshot.forEach(function (childSnapshot) {

                const messagesData = childSnapshot.val();

                message = messagesData['message'];

                messagePlace = messagesData['place'];     
              
            })           
＊＊＊＊＊＊＊＊＊＊ここの行＊＊＊＊＊＊＊＊＊＊＊＊＊＊
        })
```

こいつに.thenを書いて.onが終わった時に処理をさせようと思ったけど.onはPromiseではないのでできない。ここの行というところに処理をかくとmessagePlaceなどの変数使えるのでしたかったこと達成できた
【RPGツクールMV】エラー「Cannot read property ○○ of undefined」とは…？

RPGツクールMVに於いてゲームを作るにあたり、私が最もよく見かけるプラグイン導入時のエラーが、この
「Cannot read property ○○ of undefined」
です。
（○○には任意の変数名や関数名が入ります）

#このエラーは一体…！？
直訳すると、
**「アクセスしようとしてる変数が初期化されてねーから、その中に○○って変数／関数はねーよ」**
となります。

例を見てみましょう。

```javascript:rpg_object.js
Game_Action.prototype.itemHit = function(target) {
    if (this.isPhysical()) {
        return this.item().successRate * 0.01 * this.subject().hit;
    } else {
        return this.item().successRate * 0.01;
    }
};
```

↑これを…

こうじゃ↓

```javascript:rpg_object.js
Game_Action.prototype.itemHit = function(target) {
    var x = this.unknownVar.hit;    // ←！？！？
    if (this.isPhysical()) {
        return this.item().successRate * 0.01 * this.subject().hit;
    } else {
        return this.item().successRate * 0.01;
    }
};
```

**（今回は実験用にこうしているだけであって、プラグインを使わずに直接rpg_objectを変更するのはトラブルにつながるので良い子はまねしないでね！！）**



んで、戦闘テストを実行してみると――
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212739/9f7086ab-1247-398d-7993-f60f378be6b1.png)

で す よ ね ーーーーーー




#れっつ・デバッグ（原因探し）

バグが出ている場合、何はともあれ、先ずはデバッグ画面を見るのが先決です。
なになに……

![image.png](https://qiita-image-store.s3.amazonaws.com/0/212739/0bbbfef4-6b56-828b-167c-0e79000688b4.png)


デバッグ画面に於ける一連のfunctionの列挙は、上に行くほど直接的な原因となったコマンドに「近い」物となります。
この場合rpg_object.js の　Game_Action.prototype.itemHitの中で発生している、と言う事ですね。

「Cannot read property 'hit' of undefined」
まさか…hitがundefinedなのか！？


**いいえ違います**

先ほどの言葉をもう一度見ましょう。

「**アクセスしようとしてる変数**が初期化されてねーから、**その中に○○って変数／関数はねーよ**」

――つまり、この場合undefinedなのは、```this.unknownVar```なのです。
試しに```console.log```で出力してみましょう。

```javascript:rpg_object.js
Game_Action.prototype.itemHit = function(target) {

    console.log(this.unknownVar);

    var x = this.unknownVar.hit;    // ←！？！？
    if (this.isPhysical()) {
        return this.item().successRate * 0.01 * this.subject().hit;
    } else {
        return this.item().successRate * 0.01;
    }
};
```


![image.png](https://qiita-image-store.s3.amazonaws.com/0/212739/ebc448ad-81cd-eb37-3fbd-92f056fb6534.png)

まぁ```undefined```でしたねー。宣言していないんで当然の話なのですが。


#終わりに

今回の例では簡略化のため宣言されていない変数を使ったので、調査はここでおしまいなのですが…
若しも問題がプラグイン同士の競合に由来する場合、更にそのundefinedとなっていた変数をコード内で検索し、どこで値が入れられていたのか。何故その値を入れるはずだったコードが実行されていないのか
（私が見たことがあるのは、同じfunctionをOverrideしていたがために片方の存在が抹消されていたパターンやら、そもそもオブジェクトごと闇に葬り去られて使われなかったパターン、新規に作ったオブジェクトで、initializeの際に必要手順を怠ったパターンなど）
具体的な調査が必要となります。
ここら辺は経験やら理解が物を言う部分になって来ます。

この文が悩む皆様の役に少しでも役に立てば、と思います。
と言うか調査する際最低限デバッグ画面から個人情報を消した物を提供していただけると大分やりやすくなります…

もっと広まれ！デバッグ画面添付！
MMD4Mecanimでインポートしたモデルのアニメーション、音声を一時停止する方法

## 説明

MMD4Mecanimでインポートしたモデルのアニメーション、音声、Morph(口パクや表情)を止める方法はそれぞれ異なる。
それぞれ、以下のような方法で一時停止と再開が行える。
特にmmd4MecanimModel.animSyncToAudio=trueの状態だと、animator.speedを0に設定してもアニメーションが止まらないことには注意が必要である。

2018.07.15 最初からもういちど再生するためのRestart()を追加。

環境: Unity 2018.1.5f1 (64-bit) / OculusUtilities(1.26.0 2018/06/20) / MMD4Mecanim(2018/05/23)

## コード

```C#
public class PauseController : MonoBehaviour {
	[SerializeField] GameObject _charactor;
	private MMD4MecanimModel _mmd4 = null;
	private MMD4MecanimAnimMorphHelper _morph = null;
	private Animator _animator = null;
	private AudioSource _audio = null;
	private uTools.BlendShapeBlink _blink = null;

	private bool _isPaused = false;

	void Update () {
		if (MyOVRUtil.GetDown(OVRInput.Button.Back)) {
			_isPaused = !_isPaused;
			SetPause(_isPaused);
		}
		_mmd4     = _charactor.GetComponent<MMD4MecanimModel>();
		_morph    = _charactor.GetComponent<MMD4MecanimAnimMorphHelper>();
		_animator = _charactor.GetComponent<Animator>();
		_blink    = _charactor.GetComponent<uTools.BlendShapeBlink>();
		_audio    = _charactor.GetComponent<AudioSource>();
	}
	
	void SetPause(bool isPaused) {
		_isPaused = isPaused;

		if (isPaused) {
			// 一時停止
			if (_mmd4     != null) _mmd4.animSyncToAudio = false;	// これがないとspeed=0fにしても止まらない
			if (_mmd4     != null) _mmd4.animEnabled = false;		// これがないと表情がリセットされる。これがあると音声がリセットされる場合あり？その場合animタブに音声を設定しないことで対策できる。
			if (_morph    != null) _morph.enabled = false;
			if (_animator != null) _animator.speed = 0f;
			if (_blink    != null) _blink.enabled = false;
			if (_audio    != null) _audio.Pause();
		} else {
			// 一時停止解除
			if (_mmd4     != null) _mmd4.animSyncToAudio = true;
			if (_mmd4     != null) _mmd4.animEnabled = true;
			if (_morph    != null) _morph.enabled = true;
			if (_animator != null) _animator.speed = 1f;
			if (_blink    != null) _blink.enabled = true;
			if (_audio    != null) _audio.UnPause();
		}
	}

	public void Restart() {
		SetPause(false);

		if (_morph != null) {
			var animName = _morph.playingAnimName;
			_morph.PlayAnim(animName);
		}

		AnimatorStateInfo stateInfo = _animator.GetCurrentAnimatorStateInfo(0);
		_animator.Play(stateInfo.fullPathHash, 0, 0f);
		
		_audio.Play();
	}
}
```
【Ruby on Rails】Ruby on Railsで投稿一覧ページを作る①[Progate]

# Ruby on Railsを使ったSNS作成の一環です。投稿一覧ページを作ろう。

>データソースはProgate


# 1.まずはpostsコントローラを作成

<img width="894" alt="スクリーンショット 2018-07-11 19.14.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/8b09f8ad-30d9-459b-7c10-185ca478db5b.png">

$ rails generate controller コントロー名 アクション名
でコントローラを作成する

<img width="974" alt="スクリーンショット 2018-07-11 19.15.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/8fe3e058-2d6b-7249-6b4c-0cc4cf80fb6d.png">


# 2.投稿内容を変数に代入する
>最終的にはデータベースに接続していきたいんだけど、それにあたって投稿内容がHTMLで記述されたままだと不都合なんですって。

<img width="972" alt="スクリーンショット 2018-07-11 19.19.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/4a2ac01c-80e1-96ed-c7b6-c1c36a9e9ac6.png">

> <% %>  <%= %>の中に入れてRubyで記述する。

<img width="972" alt="スクリーンショット 2018-07-11 19.20.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/01a29a42-35b0-56fd-3669-3ba7efad26cb.png">


# 3.コントローラファイル内のアクションで変数を定義する

>Progate本編では投稿内容を配列として変数postsに代入し、each文で繰り返しとして表示する、というくだりがあるんだけどこれは簡単で理解しやすいんでここではカット。

<img width="893" alt="スクリーンショット 2018-07-11 19.26.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/25b5b945-0cce-0fa0-be9c-e304d415b361.png">

> 配列自体はコントローラファイル内のアクションで変数に代入する

<img width="973" alt="スクリーンショット 2018-07-11 19.26.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/de885f3a-f592-ea17-6d80-d6bc75b431e3.png">

> ビューファイル内にeach文を設置し、表示させる

<img width="975" alt="スクリーンショット 2018-07-11 19.26.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/99f09525-dd55-b960-491f-79e6d7315dd4.png">

>アクションで定義した変数をビューで使用することはできず、@変数とすることで使用可能になる。コントロールファイル内でのアクション定義の段階で、変数の前に@をつけるようにしよう

<img width="973" alt="スクリーンショット 2018-07-11 19.27.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/4b2ffe88-66ee-0b17-dc70-55d84d60d5a5.png">

>ビュー内で、アクションで定義した変数を呼び出す際も@変数でお願いします。

<img width="978" alt="スクリーンショット 2018-07-11 19.27.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/0e63f55f-d5e1-493c-4d3b-4bfb87d69def.png">


# これで、データベース接続の準備ができました！

続きは次回。
GitHubのプライベートリポジトリからDockerイメージにcloneする

GitHubのプライベートリポジトリからDockerイメージにcloneするのに苦労したのでメモしておきます。

主な手順は次の通りです。

1. 鍵ペアを作る
2. 公開鍵をGitHubリポジトリのdeploy keyとして登録する
3. Dockerfileに、秘密鍵と公開鍵をイメージに取り込む記述を書く
4. Dockerfileでgit cloneする記述を書く
5. Dockerイメージをビルドする

#### 鍵ペアを作る

GitHubのデプロイキーの仕組みを使ってcloneします。
デプロイキーにする鍵ペアを作ります。

まず、鍵のファイルを置くディレクトリを作ります。

```sh
$ mkdir ssh
```

鍵ペアを生成します。

```sh
$ ssh-keygen -t rsa -C foo@example.com
Generating public/private rsa key pair.
Enter file in which to save the key (/home/suzuki/.ssh/id_rsa): ssh/id_rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in ssh/id_rsa.
Your public key has been saved in ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Ivme5hlvowbsy+j9htos2E2nQVSzC5gww53weMd98nA foo@example.com
The key's randomart image is:
+---[RSA 2048]----+
|o.o + o S        |
|. . o + .        |
| . + o           |
|=ooB= + .. E     |
| =.O.B.o oo.     |
|.   .   o.       |
| o   + o .       |
|oo*.o* .         |
|  + B*=   +.     |
+----[SHA256]-----+
```

ディレクトリ```ssh```の下に、```rsa_id```(秘密鍵)と```rsa_id.pub```(公開鍵)の2つのファイルが作られます。

#### デプロイキーとして登録する

上記で作られた公開鍵を、GitHubのリポジトリにデプロイキーとして登録します。

#### Dockerfileに書く

Dockerファイルの```ADD```を使って、デプロイキーにした鍵ペアを、Dockerイメージに取り込みます。

```
# 鍵ペアを取り込む
RUN mkdir /root/.ssh
ADD ssh/id_rsa /root/.ssh
ADD ssh/id_rsa.pub /root/.ssh

# GitHubのサイトを登録しておく
RUN ssh -o StrictHostKeyChecking=no github.com; exit 0

# プライベートリポジトリからクローン
RUN git clone git@github.com:foo/quux.git /opt/quux
```

#### Dockerイメージを作る

```
$ docker build .
```
Swift：NSGraphicsContextを使って描画する

#背景
普段、簡単な図形の描画は`NSBezierPath`を使って行うのだが、描画色の細かい設定を変更したくなった際に、`CGContext`の`setBlendMode()`を使うために`NSGraphicsContext`を利用した図形描画を行う必要に迫られた。その際の方法をまとめる。

現状この記事にまとめられている方法は`NSGraphicsContext`ではなく`CGContext`を使った図形描画手法になってしまっている... 後で修正する

##ソースコード（2018/7/11 Swift4対応版）
```swift:
import Cocoa

class SampleView: NSView {
    
    required init?(coder decoder: NSCoder) {
        super.init(coder: decoder)
        
        wantsLayer = true
        layer?.backgroundColor = NSColor.gray.cgColor
    }
    
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        
        if let context = NSGraphicsContext.current?.cgContext {
            context.beginPath()

            // 線の幅の設定
            context.setLineWidth(2.0)
            // 線の色の設定
            context.setStrokeColor(CGColor.black)
            // 塗りつぶし色の設定
            context.setFillColor(CGColor.white)
            // 描画色のモード設定
            context.setBlendMode(CGBlendMode.multiply)
            
            // 既存のCGPathを使う場合
            context.addPath(path.cgPath)
            // パスの移動
            context.move(to: CGPoint)
            // 直線パスの追加
            context.addLine(to: CGPoint)
            // 曲線パスの追加
            context.addCurve(to: CGPoint, control1: CGPoint, control2: CGPoint)
            // 四角形パスの追加
            context.addRect(CGRect)

            // 中塗りパスの描画
            context.fillPath()
            //　パスのアウトラインの描画
            context.strokePath()
        }
    }
}
```

##備考
上に挙げた他にも大量の図形描画にまつわるメソッドが存在する。
GASでGoogleドキュメントを自動作成してslackに通知する仕組み

私の所属しているチームでは、毎朝各自がやることをGoogleドキュメントに記載して共有しています。
2月頃にドキュメント作成＆Slackへの通知を自動化したので、隙間時間に投稿します。

なお、以下参考にしたページです。

- [GithubのIssueをスプレッドシートから一気に生成してみた](https://qiita.com/ayasamind/items/38945bd69f8289d6ccaa)
- [公式リファレンス](https://developers.google.com/apps-script/reference/)

## 要件

- 営業日の9時前に当日の日付を名前にもつGoogleドキュメントを作成してSlackにポストする
- 新規ドキュメントの内容は、前営業日のものをコピーしたものとする（ゼロから書くのは手間なので）

## 作業手順

結構前のことなので、内容漏れてるかもしれません。もし動かなかったらすみません…。

- GoogleDriveにいく
- ドキュメント保存先のフォルダにアクセスする
- URLからフォルダIDを取得する
    - `https://drive.google.com/drive/u/0/folders/XXX`のXXX部分
- Slackの管理画面にいく
- 通知したいチャンネル用のincoming webhook urlを取得する
- Googleカレンダーにいく
- 設定 -> カレンダーを追加 -> 関心のあるカレンダーをさがすから `日本の祝日` にチェックをする
    - 祝日判定時にこのカレンダーを見に来る。
- [GASダッシュボード](https://script.google.com/home)にいく
- 新規スクリプトを作成する（適当に名前をつける）
- コードを書く
- 編集 -> すべてのトリガー -> 新しいトリガーを追加から実行スケジュールを登録する
    - 実行したい関数を選択後、時間主導型、日タイマー、午前8〜9時とした
    - GASのトリガーはcronみたいに厳格なものじゃなくて「8〜9時のどこかで実行するね」みたいなアバウトなものなので要注意。

## コード

```
var postUrl = '<Slackのincoming webhook url>';
var username = '<Slack通知者名>';
var icon = ':page_facing_up:';  // 通知時に表示されるアイコン
var targetFolderId = '<作成したドキュメントを配置するフォルダのID>'

/**
* copy docs
*/
function createCopy() {
  //ファイル名のベースとなる文字列
  var fileName = 'my_team';
  
  //コピー元となるドキュメントファイルのIDを取得
  var fileId = ''
  var files = DriveApp.getFolderById(targetFolderId).getFiles();
  // 一番最初のファイルが前日作成したファイルとなる
  if(files.hasNext()){
    var file = files.next();
    fileId = file.getId()
  }
  
  
  //ファイル名の日付部分作成
  var date = new Date();
  var formattedDate = Utilities.formatDate(date, "JST", "yyyyMMdd");
  
  //コピー元のファイルを開く
  var file = DriveApp.getFileById(fileId);
  //コピーを作成。作成したコピーを参照。
  var newFile = file.makeCopy(fileName + "-" + formattedDate);
  
  return newFile;
}

/**
* post message to slack
*/
function postMessage(message) {
  var jsonData =
      {
        "username" : username,
        "icon_emoji": icon,
        "text" : message
      };
  var payload = JSON.stringify(jsonData);
  
  var options =
      {
        "method" : "post",
        "contentType" : "application/json",
        "payload" : payload
      };
  
  UrlFetchApp.fetch(postUrl, options);
}

/**
* create docs bot
*/
function createDocBot()
{
  // 日付取得 祝日は実行しない
  var currentDate = new Date();
  var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) {
    return;
  }

  // 土曜日、日曜日は実行しない
  var weekday = currentDate.getDay();
  if (weekday == 0 || weekday == 6) {
    return;
  }
  
  // ドキュメントをコピーして作成
  var objDoc = createCopy();
  
  // ドキュメントをフォルダ配下に移動させる
  var docFile = DriveApp.getFileById(objDoc.getId());
  var targetFolder = DriveApp.getFolderById(targetFolderId);
  targetFolder.addFile(docFile);
  DriveApp.getRootFolder().removeFile(docFile);
  
  // slackへurlをpost
  var url = docFile.getUrl();
  var message  = "朝共有メモ: " + url
  postMessage(message)
}
```