OmniAICreator/Qiita-1.07M huggingface dataset:
保守性と再利用性を向上させる設計に必要な3つの考え方

## 設計:ソフトウェア実装前の最後の作業
「オブジェクト指向でなぜつくるのか-第2版-」の第9章では、プログラミングの前段階の作業として、業務分析、要求定義、設計の3つが必要であると説明されていました。

業務分析で現実世界の業務を整理し、要求定義でコンピュータが肩代わりする仕事の範囲を定義した後に、それをソフトウェアでどう実現するかを決めるのが設計の作業になります。

設計の進め方やノウハウは実行環境やアプリケーションの性質ごとにバリエーションがあるため、それらに依存する部分を対象外とした一般的な考え方が、「オブジェクト指向でなぜつくるのか-第2版-」の第10章にて紹介されています。

## この記事のゴール
- 保守性と再利用性を向上させる設計に必要な3つの考え方を理解する

## 保守性と再利用性を向上させる3つの考え方
設計で重要なことは要求定義どおりに正しく動かすことですが、その次に重要なことはソフトウェアの保守性と再利用性を向上させることです。なぜなら、以前とは違ってアプリケーションの規模が増大し、ソフトウェアの寿命も長くなったからです。

オブジェクト指向プログラミングのクラスやポリモーフィズム、継承といった仕組みは、ソフトウェアの保守性と再利用性を向上させるためのものですが、うまく使いこなさなければその効果は望めません。

そこで、保守性と再利用性を向上を目的とした設計の指針として、以下3つの目標を掲げると良いようです。

1. 重複を排除する
2. 部品の独立性を高める
3. 依存関係を循環させない

### 重複を排除する
重複する機能があるだけで、ソフトウェアの規模が大きくなるため、テストが大変になりますし、理解もしづらくなります。さらには、変更時の修正漏れも深刻な問題として挙げられます。

そういった問題を発生させないためにも、設計の段階で機能の重複が起きないように気をつける必要もありますし、安易に「コピー&ペーストプログラミング」を行わないことも対策のひとつとなります。

そもそもこれまでの歴史で登場してきた **サブルーチン** やオブジェクト志向プログラミングの **ポリモーフィズム** ・ **継承** などは、コードの重複を削減するための仕組みでもあります。しっかりと先人たちの知恵を受け継いで、同じ苦しみを味あわないようにしたいところですね。

### 部品の独立性を高める
ソフトウェアの中身を理解するためには、まずはコードを読まなければなりませんが、数万行、数十万行に及ぶコードを全て理解することは非常に困難です。

こうした複雑なソフトウェアを理解しやすくするためには、まず最初のステップとしてコードを「分割する」ことが挙げられています。ソフトウェアを一枚岩として作るのではなく、複数のサブシステムや部品に分割して構成するということです。

さらに次のステップとして、分割したサブシステムや部品の **独立性を高める** ことが挙げられています。独立性が高まれば、修正時の変更箇所の特定が容易になりますし、他機能への影響も最小限に抑えることができます。

こういった独立性を測る2つの尺度として、 **凝集度** と **結合度** というものがあります。

- **凝集度**
    - 個々の部品の機能のまとまり度合いを評価する尺度
    - 凝集度が強いほど良い設計と言える
- **結合度**
    - 部品間の結びつきの度合いを評価する尺度
    - 結合度が弱いほど良い設計と言える

オブジェクト指向においては、1つのクラスに定義する機能の意味的なまとまりを強くし、クラス間のやりとりを少なくすることで良い設計ができるということになります。

### 依存関係を循環させない
ここでいう依存関係とは、ある部品が別の部品を利用していることを意味します。下の図をみてください。

![oop-依存関係の循環.png](https://qiita-image-store.s3.amazonaws.com/0/186009/328a7ab6-0195-3e9f-245d-51da9dda1d8e.png)


この図は部品Aは部品Bに、部品Bは部品Cに、さらに部品Cは部品Aに依存していることを示しています。依存関係が循環していますね。

これは、部品Aは部品Bが、部品Bは部品Cが、部品Cは部品Aがなければ機能しないことを意味しているので、部品Aだけが必要なのときに部品Bと部品Cまでも必要になってしまいます。これでは再利用性が著しく低下してしまいます。

また、部品Aに変更を加えるときに、部品Aに依存している部品Cへの影響を調べなければなりません。さらにもしその影響により部品Cに変更が必要になった際は、部品Cに依存している部品Bの影響も調べなければならなくなります。これでは保守性が著しく低下してしまいます。

つまり、こういった依存関係の循環をなくせば、再利用性と保守性が向上することになります。

## まとめ
保守性と再利用性を向上させる設計をするには、以下3つの考え方が重要である。

- 重複を排除する
    - 重複を排除することで部品やコードが少なくなる。
    - 結果テストが簡単になったり、機能変更時の修正漏れがなくなる。
- 部品の独立性を高める
    - 独立性を高めれば、修正時の変更箇所の特定が容易になる。
    - さらに他機能への影響も最小限に抑えられる。
- 依存関係を循環させない
    - 依存関係の循環させないことで、個々の部品を切り出して使用できる。
    - さらに他機能への影響を最小限に抑えられる。

## 所感
どれも基本的なことで当たり前だなと思う反面、気を抜くととやってしまいがちなことが書かれているという印象でした。

完全にコードが重複していなくても、似たようなロジックが書かれることもよくないなと、経験上思いました。似たようなロジックが複数あるときは、しばしば修正が漏れてしまいがちで、結果的にシステムの不具合を引き起こす原因になります。

また部品の独立性を高める方法として、 「private メソッドをたくさん作る」 ということも挙げられていて、個人的に忘れがちだなと思いました。

クラス内でした使われていないにも関わらず、 public なメソッドを作ってしまうと、それだけで「別クラスで呼ばれているのか？」と考慮しなくてはならなくなりますよね。ちょっと意識するだけで、その先の開発で起こりうる考え事を減らすことができるのだなと実感しました。
ディープラーニングG検定問題集を買ったのでやってみた(初見感想)

#この記事、何?

つい先日問題集が発売されたので買ってやってみた感想。

#どういう人向け?

G検定を受けようかと思っている人向け。
一緒に勉強しましょう。

#章立て

１．人工知能をめぐる歴史と動向
２．機械学習の基礎
３．機械学習の具体的手法
４．基礎数学
５．ディープラーニングの概要
６．ディープラーニングの手法
７．ディープラーニングの研究分野と応用
８．総仕上げ問題

なるほど。
まあ、こっちはまだまだAI初心者。まだPredictとかって言っても写経レベルでしかやれてないし。
自分としてのなりたい像も、どこに特化したいか、特化すべきかも見えてないので、この範囲がターゲットにしている範囲は薄く広く押さえておきたいしね。

#傾向
みんな言っているような感じでした。気づいた点を列挙するとこんな感じ。

##出題数
多い
じゃんじゃん解かないとタイムアウト

##計算
ほぼない。全くないわけではない。
f(x) = x^3 +5x^2 -3x +10 を微分するとか、
f(x,y) = x^2 + 3x - y^2 - 7y +2をyで偏微分するとかあった。
行列演算はあった。
電卓使いたくなるような計算はなかった。

##用語
普段scikit-learn使って機械学習に少しかかわっているけど、使ってない方法論はふんわりとしか理解してない。
だから結構、「あ～あるある、それどっちだっけ?」が結構ある。
今回、そういう言葉を不正解を復習することで点数上げて学習しようかと。
(ん?これも一種の誤差逆伝播?)


##歴史(暗記...)
うーん・・・これが一番のネックかも。
SVMとかRNNとかそういう言葉って、使う側としてもざっくり何なのかを意識するから、
「○○は～～という特性があり・・・」って言われて、「そりゃそうだろ」と思うのであまり苦はない。
けど、「～～が19xx年に提唱して・・・」といわれると。。。
いや、原理はわかるよ、それ・・・誰だっけ?って話。
先人への感謝が足りませんね。勉強します。はい。

#感想
自分がこれ書くのはアレだけど、よくできているな・・・と。
畳込みとか、誤差逆伝播とか、どういう原理で機械学習が成り立っているかを、出題を通して押さえてほしいといっているように感じる。
計算問題で微分が出たのも、誤差をどうやって「ブラックボックス(と思われているもの)」が、「理解」して、「判断」しているかにつながる。
微分わかってないと、「局所最適解」って言われても「?」だと思うしね。
行列もそう。Neural Networkが相手で、画像解析とかで数百次元とかを相手にするなら必須だし。

隠れ層がどう存在してどう役割を果たすかが見えてくると、実践的にパラメータ推定するときに役立つ。
最終的に、社会事象の解決したい「課題」に向き合うとき、「謎のブラックボックス」のままだと、やみくもに試してみるしかない。
結果、的外れな方法論で必死にパラメータいじって過学習モデル作成に勤しむ。。。

そういう意味でも、下の駄文に書いたように、自分が「わかったつもり」になってしまわないように、いったん客観評価として試験範囲を押さえようかと思っています。

#頑張りましょう
次の試験はちょうど一か月後?
でもIPAのペーパーテストと違って試験開催日と結構ギリギリでも受け付けられるみたい。
急な出張とか入ったらヤだから申込もうちょっと待つけど、今度受けようかと思います。

まあ、何冊も問題集があるわけじゃないから、どうしても少ないサンプル(この問題集)に過学習してしまう。
前回買った本はそれに対する、Validation Test用のデータとして役立ってもらいましょうかね。



#前置き(にするつもりだった駄文)

すみません・・・書いたのはいいけど、駄文だった。けど載せちゃう。

以前、これ書いた。

■ディープラーニングG検定公式テキストを買ったので読んでみた(消化不良版)
https://qiita.com/siinai/items/4a81c89565ad9a25bda6

その時、微妙と思ったんだけど、やっぱ自分の学習スタイルだと、教科書ではなく、問題集が欲しかったの。
どうしても純粋に本を読んでいるだけだと、こんな感じ。

・なんとなく知っていること
 → 「あっ、知ってる~」って思って終わり。だけど、正確にはわかってない。
・全く知らないこと
 → 「わからないな～難しいな～」・・・で終わり。

・・・駄目じゃん。

それだと進まないので前回買った本はまっすぐ本棚へ行ってしまってました。

これまで資格取ったとき・・・って、Oracle Masterだけだけどさ、勉強して取ったのって。
問題集があると、今どれだけ自分が分かっていないかを数値化できるので「よっしゃ、あげたるわ～」ってなる。

というわけで、基準。一回解いてみた。そう、これが最低点でここから上げようと。

・・・既定時間くらいで解けたと思う。
その割には点数よかった。ん?もしかして合格点?っていうか、合格点っていくつよ・・・

調べたけどよくわからなかった。
まあいいわ。なんとかなるでしょ。
まあ、1冊しかない問題集を反復するんだから、正解率をかなり高いところまで過学習してから、どうするか考えようかな、と。



#お詫びと訂正の転載 (追記:2019/02/17)

やっぱエキスパートシステムに関する出題、修正されてた。
https://book.impress.co.jp/books/1118101076

(※以下、引用)

```
誤記のためにご迷惑をおかけし、誠に申し訳ございません。

    25ページ 解答4の（ア）の正答
        [誤]
        A
        [正]
        B
        【 第2刷にて修正 】

```

うん。

ただ、できれば、「弱いAI」と「強いAI」の定義も修正してほしいんだけど・・・
少し前に買ったこのあたりや、WebでAIを語っている人の間では、「弱いAI」と「強いAI」の違いを心の有無や、汎用性の高さとしていることが多い。そして、多くの見解で一致しているのは、まだ強いAIは実在しないということ。

しかし、この問題集はフレーム問題を解消しているかどうかを分水嶺と考えているように思う。
囲碁とか将棋とかでフレーム問題は長い間、AIを阻んだ。だからAIはアマチュアにも勝てない時期が長かった。
しかし現在人類を凌駕している。この現象を根拠に「解決した」とするなら、AlphaGoたちは「強いAI」といえる。
ただ、「AlphaGoだけが世界で唯一実在する強いAIだ」といわれると、「?」と思う・・・よね?

まあ、松尾先生もそのことを突き詰めて言葉の定義をしてほしいわけじゃなさそうなので、いいかなとは思うけど、結果の評価を判定される資格試験で正解か不正解かを分類したい身としては気になってしまう・・・

まあ、バッファをもって合格点取ればいいだけの話なんですけどね。


■深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト
https://www.amazon.co.jp/dp/4798157554

■人工知能は人間を超えるか (角川ＥＰＵＢ選書)
https://www.amazon.co.jp/dp/B00UAAK07S
【PHP】バッチ処理をcronで自動実行する

# バッチ処理とは
まとめて実施される処理のこと。

>[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典〜バッチ処理](https://wa3.i-3-i.info/word11215.html)

# cronとは
``cron``とは、ジョブを自動実行するためのデーモンプロセス（バックグラウンドプロセス）のこと。

cronを設定するコマンドが``crontabコマンド``。

>[crontabコマンドについてまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-crontab)

# 実際に動かす
## ファイル構造

```
batch_test
  ├── add_time.php
  └── time.txt
```
### add_time.php
現在時刻をtxtファイルに追記するだけのプログラムです。

cronで処理を実行する場合、ファイルパスは``絶対パス``で記述する必要があります。``require``や``include``を使用するときも同様です。

```add_time.php
<?php
// time.txtに現在時刻を追記する
$file = '/usr/local/var/www/htdocs/batch_test/time.txt';
$current = file_get_contents($file);

date_default_timezone_set('Asia/Tokyo');
$current .= date("Y-m-d H:i:s")."\n";

file_put_contents($file, $current);
```
### time.txt
追記用のファイルです。
こんな感じで現在時刻が追記されていきます。

```time.txt
2019-02-09 22:20:00
2019-02-09 22:21:00
2019-02-09 22:22:00

```

ファイルを作成したら一度処理を実行してみます。
動作に問題がなければ、引き続きcronの設定に移ります。

```
$ cd batch_test
$ php add_time.php
```

## cronの設定
cronの設定を``crontabファイル``に記述します。

crontabファイルは「この時間（間隔）でこのファイルの処理を実行する」 という内容を記述するファイルです。``crontab -e``コマンドで編集できます。

以下の順番で記述します。

1. 処理を実行する時間（または間隔）
2. PHPのパス
3. 処理が記述されているファイルのパス

>[プログラムの自動実行にcronを使おう サンプルプログラム付きで設定も簡単](https://www.genius-web.co.jp/blog/cat-123/php-cron.html)

最初にPHPの場所を確認します。パスは全て``絶対パス``で記述する必要があります。

```
$ which php
/usr/local/opt/php@7.1/bin/php
```

``crontab -l``コマンドでcronの設定を確認できます。
現在は何も設定されていません。

```
$ crontab -l
crontab: no crontab for name
```

``crontab -e``コマンドを実行するとviエディタが開くので、処理内容を記述します。（エディタは環境によって異なるかもしれません。）

add_time.phpの処理を1分おきに実行するように設定します。

```
*/1 * * * * /usr/local/opt/php@7.1/bin/php /usr/local/var/www/htdocs/batch_test/add_time.php
```

``:wp``で確かに保存しましたが、エラーが出てしまいました・・・

```
$ crontab -e
crontab: no crontab for name - using an empty one
crontab: "/usr/bin/vi" exited with status 1

$ crontab -e
crontab: no crontab for name - using an empty one
crontab: no changes made to crontab
```

これは``:wq``の前に``:set backupcopy&vi``を実行することで解決できました。

>[crontab でno changes made to crontabで変更できない時](http://ab.riric.jp/blog/?p=278)

これで登録されました！

```
$ crontab -e
crontab: no crontab for name - using an empty one
crontab: installing new crontab

$ crontab -l
*/1 * * * * /usr/local/opt/php@7.1/bin/php /usr/local/var/www/htdocs/batch_test/add_time.php
```

もっと複雑な処理をさせたいのですが、今日はこの辺で。
2019年1月現在 MacでのC++17の環境構築について(Eclipse)

CLion使えるお金持ちの方はCLionでどうぞ。
ここではEclipseでC++17を扱う方法について記述します。
デバッガー以外は特にハマるところもないです。
emacsで10年ぐらい前にゴリゴリC++書いてた頃とは隔世の感ありますね。
VimとかEmacsで頑張る方はすでにいろいろソリューションがあると思うので申し上げることはありません。がんばってください。
IDEを使うのは単純にC++の知識がほぼないからです。補完が欲しいよね。

## 1. Eclipseのインストール
何も考えずAll In One Eclipse使いましょう。
http://mergedoc.osdn.jp/
からEclipse2018-12を落として入れます。
私はPHPとかもEclipseで書く可能性があるのでUltimate入れました。
![スクリーンショット 2019-02-09 22.56.30.png](https://qiita-image-store.s3.amazonaws.com/0/13106/ad375223-5ccd-b3bd-6f63-c1956bdbc743.png)


## 2. デバッガーのインストール

gdbがうまく動きません!?
うそーん
https://stackoverflow.com/questions/39702871/gdb-kind-of-doesnt-work-on-macos-sierra/39778562?stw=2#39778562
を見つけて`lldbmi2`を使うことにしました。
gdb動かぬーで一晩無駄にしましたが`lldbmi2`はサクッと動きました。
リンク先にEclipseの設定方法も載っているのでそれを参考に

## 3. C++17のHelloWorld

C++17の特有構文でHelloWorldします。
https://qiita.com/leon-joel/items/81415c1ef355c6246280
にC++17の構文まとめがあるのでこれを使ってHelloWorldしましょう。
### プロジェクト作るまで
![スクリーンショット 2019-02-09 23.03.16.png](https://qiita-image-store.s3.amazonaws.com/0/13106/9630433d-5fd0-aeb0-297d-47d1323b8fd1.png)
![スクリーンショット 2019-02-09 23.03.49.png](https://qiita-image-store.s3.amazonaws.com/0/13106/2eb6f382-5bfc-1499-1af9-b302bbef3b5b.png)
![スクリーンショット 2019-02-09 23.04.06.png](https://qiita-image-store.s3.amazonaws.com/0/13106/e8c0113a-ea98-7c88-e096-fed9d318ea5d.png)
### 試してみるソースコード
```C++
#include <iostream>
using namespace std;

namespace a::b::c {
	void func() {
		cout << "C++17" << endl;
	}
}

int main() {
	a::b::c::func();
	return 0;
}
```
## デバッグうまくいきました
![スクリーンショット 2019-02-09 23.07.17.png](https://qiita-image-store.s3.amazonaws.com/0/13106/51e7314e-1183-d64a-2c28-5b2921766e39.png)

### 以上です
C++初心者には補完が効くIDEはありがたいです。

2/14にオライリーから「Modern C++チャレンジ」という本が出るので超楽しみです。
https://www.oreilly.co.jp/books/9784873118697/

その本を楽しむための環境構築でした。
使っていくうちに色々出てくるのでしょうけど、その時その時設定していきましょう。
以上です。enjoy!
【Python】特定のインスタンスにメソッドを追加

`types.MethodType`を使う

```
types.MethodType(function, instance)

Create a bound instance method object.
```

> バウンドされたインスタンスメソッドを作成します

## 動作環境

```
Python 3.7.1
```

## 特定のインスタンスにだけメソッドを追加する

```python
class MyClass:
    def __init__(self, name):
        self._name = name


a = MyClass('tamago')
b = MyClass('taro')
```

`b`のインスタンスにだけメソッドを追加したい場合、`types.MethodType()`で`b`に紐づくインスタンスメソッド(`get_name`)を生成し、`b.get_name`に設定する

```python
# 関数を定義
>>> def get_name(self):
...     return self._name

>>> import types
# bのインスタンスメソッドを生成し、設定する
>>> b.get_name = types.MethodType(get_name, b)

>>> b.get_name()
'taro'

```

また、`a`には`get_name`というメソッドは無いため、エラーになる

```python
>>> a.get_name()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute 'get_name'

'MyClass' object has no attribute 'get_name'
```

面白い

## 参考文献

- [インスタンスに動的にメソッドを追加する - PYTHONIC BOOM BOOM HEAD](http://kk6.hateblo.jp/entry/2012/09/09/%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AB%E5%8B%95%E7%9A%84%E3%81%AB%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)
- [Python Tips：特異メソッドを作りたい - Life with Python](https://www.lifewithpython.com/2014/12/python-use-eigen-method.html)
日めくりPhoenix、毎日Elixir

# 日めくりPhoenix、毎日Elixir

# ・はじめに
１億２千万人のmixファンの皆さん！今日も元気にiexしてますか？

最近マンネリなあなたのために日替わりでelixirネタを表示するwebアプリ「日めくりPhoenix、毎日Elixir」(通称：evrylixir)の実装にチャレンジしてみます！


# ・開発環境
|PC|Mac Book Pro (Retina, 13-inch, Late 2013) |
|:--|:--|
|OS|Mojave|
|Memory|8GB|
|言語|elixir v1.7|
|FW|Phoenix 1.3|

# 参考サイト
[mix phx.gen.jsonを使わずとも気軽に作れるElixir／Phoenix API](
https://qiita.com/piacere_ex/items/a689b886f88249901a88)

# 前提条件
- Google Custom Search APIを有効化しAPIキーを取得済みであること。
- Custom Search Engineの検索エンジンIDを取得済みであること。

# 実装

コンソールから以下のコマンドを入力しPhoenixの初期画面の表示まで行います。

```elixir
>mix phx.new evrylixir --no-ecto
>iex -S mix phx.server
```

![fig01.PNG](https://qiita-image-store.s3.amazonaws.com/0/256958/8123764f-5b81-0b96-69cf-c856e21fea23.png)

下記のファイルを追加し、コードを記述します。

```elixir:lib/evrylixir_web/controllers/json_controller.ex
defmodule EvrylixirWeb.JsonController do
  use EvrylixirWeb, :controller

  def getUrls(conn, param)do
    render(conn,"api.json",%{api_data: param})
  end
end
```

```elixir:lib/evrylixir_web/viewss/json_view.ex
defmodule EvrylixirWeb.JsonView do
  use EvrylixirWeb, :view

  def render("api.json",%{api_data: _})do
    url = Scraper.randomScrape("elixir")
    %{
      url: url
    }
  end
end
```


```elixir:lib/scraper.ex

defmodule Scraper do

  def randomScrape(keyword) do
    HTTPoison.get!("https://www.googleapis.com/customsearch/v1?key=APIキー&cx=検索エンジンID&q=" <> keyword)
    |>body
    |>Poison.decode!
    |>items
    |>Enum.map(fn(%{"link"=>link}) -> link end)
    |>Enum.random
  end
  def body(%{status_code: 200,body: json_body}) do
   json_body
  end
  def items(%{"items"=>items}) do
    items
  end

end

```

以下のファイルにコードを追記します。

```elixir:lib/evrylixir_web/router.ex

  ...省略...

  scope "/", EvrylixirWeb do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :index

    get "/api", JsonController, :getUrls
  end
```

```html:lib/evrylixir_web/templates/page/index.html.eex
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>

<div id="app" class = "row">
<iframe :src="jsons.url" width="100%" height="600px" ></iframe>
</div>


<script>
var app = new Vue({
  el: '#app',
  data:
  {
    jsons:[]
  },
  mounted(){
    axios.get('/api').then(response=>{this.jsons=response.data})
  }
})
</script>
```



```elixir:mix.exs

defp deps do
    [
      ...省略...

      {:poison, "~> 3.1.0"},
      {:httpoison, "~> 0.9.0"}
    ]
end
```

実装はここまでです。

# テスト

動作確認を行います。

```elixir
>mix phx.server
```

![fig02.png](https://qiita-image-store.s3.amazonaws.com/0/256958/60de8fdc-1222-2dfb-eee6-b86fdd49682c.png)


**え!?**   

**(ﾟﾛﾟ;)**

続く！！
nodeでcliツールを作る

ターミナルで

```
my-cli --env=production
```

みたいな感じで起動できる対話型のcliツールを作るやり方です。

# 対話型cli
[enquirer](https://github.com/enquirer/enquirer)というnpmを使えば対話型のcliツールは簡単に作れます。

# 標準入力からもらう引数
標準入力から引数をもらうには[yargs](https://github.com/yargs/yargs)というnpmを使えば簡単にできます。

# 独自コマンド
node index.jsみたいに起動させるのではなく、my-cliのような独自コマンドでプログラムを動かすにはpackage.jsonのbinを使います。
package.jsonに以下のように書いて

```
  "bin": {
    "my-cli": "./index.js"
  }
```

index.jsの先頭に

```
#!/usr/bin/env node
```

を書いて、

```
npm install -g
```

を実行します。

これでターミナルでmy-cliと実行することで./index.jsが動くようになります。
数字と文字

前回:https://qiita.com/New_enpitsu_15/items/b71c7da6387b315d6f7e
次回:https://qiita.com/New_enpitsu_15/items/cf3993ddc1a5b748f6d4
目次:https://qiita.com/New_enpitsu_15/private/479c69897780cabd01f4

Pythonには、というか、ほとんどのプログラム言語には数字と文字の区別があります。

#数字と文字の区別？

前回、`文字列`という単語が出てきたのを覚えていますか？
文字列は、その名の通り文字の集合です。

文字は文字じゃん…と言われれば、文字は文字なのですが

たとえば

1+1

は2ですよね？
ところがどっこい。

"1"+"1"

は"11"なのです。
そんな小学生のひっかけみたいなこと…と思うかもしれませんが、実際に

```python
print(1+1)
#2
print("1"+"1")
#11
```

と実行してあげるとそうなるのです。

これは`1`は数値を表していて、
`"1"`は文字を表しているから。

だいたいイメージはつくとは思いますが、
文字列(`"1"`とか)同士の足し算は結合ってことになります。
なので"1"と"1"を結合したら"11"なんですね。

1+1はそのまま数値の計算ですから2です。

数字と文字の区別は、そういったところから必要となってくるんですね。

#ちょっとまって！"や'を文字として使いたいんだけど！

普通では、`"`と`'`は文字を区別するための記号なので使うことはできません。

でも `"+"` と表示したかったりするときはどうすればいいの？

大丈夫。そんな時は、`'"+"'`と、周りを違う引用符で囲ってあげましょう。

```Python
print('"+"')
#"+"
```

####せんせー！だったら'"+"'は表示できないんですかー？

できます。
でもこれは少し厄介。普通に`"`で囲っても、`''`と表示されるだけでしょう。

```Python
print("'"+"'")#"'"と"'"を結合している
#''
```

だったらどうするの。そんな時はバックスラッシュ(えんまーく)を文字として表示したい`"`の前につけてあげましょう。

```Python
print("'\"+\"'")
#'"+"'
```

すると、`'"+"'`と表示されましたね。
この、文字の前につけるバックスラッシュのこと、またはバックスラッシュとそのあとの文字を、__エスケープシークエンス__といったりします。


#エスケープ

エスケープは`"`の前に`\`と書きましたが、他にもいろいろあります。
例えば、`\'`は`'`を文字として。`\\`は`\`自体を文字として表示してくれます。

```Python
print("\"")
#"
print('\'')
#'
print("\\")
#\
```

ほかにも、`\n`で改行。

```python
print("ここで日記は途切れている\n\n\nとでも思っていたのか")
#日記はここで途切れている
#
#
#
#とでも思っていたのか
```

などなど、ほかにもいろいろな種類があります。

(調べるときは「Python エスケープ」等で)

#次回は

変数についてやりますよ～
なんでprint(aaa)だと`aaa`と表示されずにエラーなの？
そんな謎を解明。
PostgreSQLの導入（備忘録）

#導入背景
今回は新たにDBクライアントTeamSQLを使って学習しようと思い、初期設定をしていたところ、以前作成したデータベースの名称を忘れていたことが発覚。
ターミナルでデータベースのリストを見ようとしても以下の表示が出た。

```terminal
$psql -l
psql: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```
種々の設定を忘れていたこともあり、最初からやり直した。

##アンインストール

homebrewでインストールしたpostgreSQLを削除

```
$ brew uninstall postgresql
```

##インストール

```
$ brew uninstall postgresql
```
##起動


```
$ brew services start postgresql
```

##結果

```
$ psql -l
                                     List of databases
   Name    |   Owner    | Encoding |   Collate   |    Ctype    |     Access privileges     
-----------+------------+----------+-------------+-------------+---------------------------
 postgres  | XXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | XXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/XXXXXXX            +
           |            |          |             |             |XXXXXXX=CTc/XXXXXXX
 template1 | XXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/XXXXXXX            +
           |            |          |             |             | XXXXXXX=CTc/XXXXXXX
(3 rows)
```

※XXXXXXと表示した部分はユーザー名です。
データベース名を確認できたので、TeamSQLからデータベースに接続できるようになった。
picoCTF 2018 General Warmup 1 - Points: 50

#問題

https://2018game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/073c4577-bd2e-a92b-cff2-b4bd0265996a.png)

#解いてみた

Aですかね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/c7670c37-23fc-c870-e365-54d00184075f.png)

というようにウォームアップ系の問題はかなり簡単だったので一気にやりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/caad10c2-e0ab-03a1-0543-e52b09da02b2.png)
picoCTF 2018 Forensics Warmup 2 - Points: 50

#問題

https://2018game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/fffc9706-9ff5-862f-88d6-e98223f18129.png)

#解いてみた

添付ファイルをダウンロードしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/bc3f10c6-20c0-366b-5a8a-3fada86ee1b7.png)

ん？1問目のチュートリアル的な問題と一緒？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/8402981d-dbe8-ea95-7391-06ec6457d690.png)

一緒でした。。。
gatsby-starter-blogで生成されるブログポストのURLを変更する

## はじめに

gatsby-starter-blogで生成されるブログポストはルート直下にできます。
しかし、ブログポスト以外のページ（例えば自己紹介ページ）を作る予定がある場合、少々不便です。
また、デフォルトではすべてのマークダウンファイルをホームに表示するように書かれているため、ブログポスト以外のページをマークダウンで書くことはできません。（ブログポスト一覧に表示されてしまうから）

そこで、ブログポストは`/blog/`下に作られるようにし、ホームでは`/blog/`以下にあるページのみを表示させるようにしてみます。

## URLの変更

`content/blog`内にある場合だけURLを変更。

```diff:gatsby-node.js
   const { createNodeField } = actions
 
   if (node.internal.type === `MarkdownRemark`) {
-    const value = createFilePath({ node, getNode })
+    let value = createFilePath({ node, getNode })
+    if (node.fileAbsolutePath.indexOf(`content/blog`) > -1) {
+      value = `/blog${value}`
+    }
     createNodeField({
       name: `slug`,
       node,
```

URLが変更されていることを確認しましょう。

```shell
gatsby deploy
```

## ブログポスト以外のページをマークダウンで書く

まずGatsbyに`src/pages`の中も見るように指示。

```diff:gatsby-config.js
     siteUrl: `https://n.k-kachi.net/`,
   },
   plugins: [
+    {
+      resolve: `gatsby-source-filesystem`,
+      options: {
+        path: `${__dirname}/src/pages`,
+        name: `src`,
+      },
+    },
     {
       resolve: `gatsby-source-filesystem`,
       options: {
```

つづいて`src/pages`にマークダウンファイルを置く。

```md:src/pages/about.md
---
title: About Me
---

Hello!!
```

この状態で一旦ホームにどう表示されるか見てみましょう。

```shell
gatsby deploy
```

一覧リストにAbout Meも表示されてしまっていますね。

## `/blog/`以下にあるページのみを表示

`node.fields.slug`にルート以下のパスが格納されているため、これが`/blog/`で始まる場合のみ表示されるようにします。

```diff:/src/pages/index.js
           keywords={[`blog`, `gatsby`, `javascript`, `react`]}
         />
         <Bio />
-        {posts.map(({ node }) => {
+        {posts
+        .filter(({ node }) => node.fields.slug.startsWith("/blog/"))
+        .map(({ node }) => {
           const title = node.frontmatter.title || node.fields.slug
           return (
             <div key={node.fields.slug}>
```

これでAbout Meのページが一覧からなくなったと思います。
一応About Meのページが存在することを`http://localhost:8000/about/`にアクセスして確認しましょう
picoCTF 2018 Forensics Warmup 1 - Points: 50

#問題

https://2018game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/8f6656ca-33a7-eb17-60a1-e514bc68994c.png)

#解いてみた

添付ファイルをダウンロードします。
画像です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/233e13c8-2f8f-9232-7734-82b4466a7fbb.png)

そのまんま答えです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a72aaf35-dc7f-be81-36b0-01a280b7e9ae.png)

正解したときは右上がUnsolvedからSolvedに変わるだけっぽいです。
disjoint eventとindependent event

# この記事について
オンライン大学[coursera](https://www.coursera.org)の講義[Introduction to Probability and Data](https://www.coursera.org/learn/probability-intro/home/info)の3週目のメモです。

# disjoint event(排反事象)
- 事象Aと事象Bが同時に発生しない2つ以上の事象
- disjoint eventな2つの事象A、Bは以下の関係が成り立つ
$$P(A and B) = 0$$

## 例1
コイントスを1回行う。コインは0.5の確率で表、0.5の確率で裏が上になるコインを使用する。

- 事象A : 1回目のコイントスで表が上になる
- 事象B : 1回目のコイントスで裏が上になる

1回のコイントスで表と裏の両方が上になることはないので、事象Aと事象Bは同時に発生しないため、この2つの事象はdisjoint eventであるといえます。

# independent event(独立事象)
- 事象Aの発生が事象Bが発生する確率に影響せず、その逆も成り立つ2つ以上の事象
- independent eventな2つの事象A、Bは以下の関係が成り立つ  
$$P(A|B) = P(A|\bar{B})$$
$$P(B|A) = P(B|\bar{A})$$

## 例2
コイントスを2回行う。コインは0.5の確率で表、0.5の確率で裏が上になるコインを使用する。

- 事象A : 1回目のコイントスで表が上になる
- 事象B : 2回目のコイントスで裏が上になる

この2つの事象A、Bはお互いに影響せず、仮に1回目のコイントスで表が上になった場合、
2回目のコイントスでは表が上になる確率が0.5、裏が上になる確率も0.5です。1回目のコイントスで裏が上になった場合も同様です。そのため、この2つの事象はindependent eventであるといえます。

# disjoint eventとindependent eventの違い
disjointとindependentという似たような名前を持つ事象ですが、次のような違いがあります。  
例1のdisjoint eventである事象A、Bでは1回のコイントスで表が上になりながら裏が上になることがないため
$$ P(AandB) = 0$$
となります。

一方、independent eventかつdisjoint eventでない例2の事象A、Bでは1回目と2回目のコイントスでは相互に影響を与えることはありませんが、1回目と2回目のコイントスの両方で表が上になる場合があるため、
$$ P(AandB) \ne 0$$
となります。
gitを使っててファイルが消えたときはまずreflog

# 概要
備忘録を共有します。
ブランチからmasterブランチへ移動できていない状況で、`merge`->`add`->`commit`->`push`したら、ファイルが消えたように見えました。


# 対処法
`git reflog`でcommitやpushの状況確認します。

```bash
$ git reflog
c57e199 (HEAD -> master, origin/master) HEAD@{0}: commit: v17 commit
3ef1bb8 (v16) HEAD@{1}: checkout: moving from v17 to master
e1a7554 (v17) HEAD@{2}: commit: v17 mod commit
0ffbfa4 HEAD@{3}: commit: v17 commit
a87f8e1 (origin/v17) HEAD@{4}: commit: v17.1
3ef1bb8 (v16) HEAD@{5}: checkout: moving from master to v17
3ef1bb8 (v16) HEAD@{6}: checkout: moving from master to master
3ef1bb8 (v16) HEAD@{7}: merge v16: Fast-forward
...
```


今回の場合、`0ffbfa4`までは正常なので、そこに戻ればよいです。
以下のようなよくわからないエラーを吐き出しましたが、ファイルは回復しました。


```bash
$ git checkout 0ffbfa4
README.md: needs merge
error: you need to resolve your current index first
```


# 参考文献
- [gitでpushしたあとファイルが消えた時にreflogで対応した話](https://snova301.hatenablog.com/entry/2019/02/09/222858)
- [git reflog についてまとめてみる - Github](https://gist.github.com/kymmt90/9c997726b638b316f9be07aa4e3eea5e)
- [いざという時のためのgit reflog - Qiita](https://qiita.com/yaotti/items/e37c707938847aee671b)
GitLabPagesでホームページを公開しよう。

#GitLabPagesで静的なホームページを公開しよう。

詳しくわかっていないので、間違っていたらご指摘お願いします。

やり方はいたって簡単です。
gitを普段から使っている人にはそう難しくないです。
もしもGitの使い方とかがわからない人がいましたら、そこから勉強し直しましょう。
現在GitHubを使っていて、GitLabPagesを使いたい方は以下のURLを参考にしてみてください。
[GitHubからGitLabへ移行しよう](https://qiita.com/flmil/items/89ca07fa976546365c49)

## 今回は1からサンプルのHTMLファイルを公開する手順を順序持って紹介していきます。

### 1.GitLabへアップするファイルを作ります。

※  `README.md`と`index.html`を作ります。

```
$ mkdir sample
$ cd sample
$ touch README.md
$ touch index.html
$ ls 
README.md  index.html
```

### 2.`.gitlab-ci.yml`を作ります。

```
$ touch .gitlab-ci.yml
```

`.gitlab-ci.yml`の中を記入していきます。

```ruby:.gitlab-ci.yml
image: python:2.7
pages:
  stage: deploy
  script:
  - mkdir .public
  - cp -r * .public
  - mv .public public
  artifacts:
    paths:
    - public
  only:
  - master
 
```

### 3.GitLabにpushする。
```
$ git init
$ git add .
$ git commit -m 'Commit_Message'
$ git push -u origin master
```

### 4.パイプラインを実行してウェブサイトを公開する
サイドメニューのCI/CD > パイプラインをクリックしたあとに、画面右上のパイプライン実行をクリック

### 5.GitLabのホームページからURLを探す。

プロジェクトページの　設定[setting] ⇨　Pages URLを探す。

## 独自ドメインを設定する

お名前.com を私は利用しています。

### 1. ドメインを追加
サイドメニューの設定 > Pagesをクリックして表示される画面の右上の新ドメインをクリック

### 2. ドメインを入力し、新しいドメインを作成をクリックして以下を確認します。

DNS
```sample.com ALIAS ~~~~.gitlab.io.```

検証ステータス
```_gitlab-pages-verification-code.sample.com TXT gitlab-pages-verification-code=~~~~```



### 3. お名前.comの設定より、「DNSレコードを設定する」

| ホスト名 | TYPE | VALUE |
|:-----------|:-----------:|:------------|
| sample.com | CNAME | ~~~~~~~~~~~~~~~.gitlab.io. |
| _gitlab-pages-verification-code.sample.com | TXT | gitlab-pages-verification-code=~~~~ |

登録を終えてしばらくしてから、2のページに戻り、「↺」を押して下記のようになれば、認証が完了し、独自ドメインでの Web サイトの公開が完了します。

# 参考文献

・[GitLab Pagesで静的ウェブサイトを公開する方法](https://www.gitlab.jp/blog/2020/06/29/how-to-use-gitlab-pages)
・[GitLab Pages で独自ドメインの静的 Web サイトを HTTPS で公開する](https://blog.linkode.co.jp/entry/2019/11/29/175113)
ARM系Chromebook（Crostini）でフロントエンド開発環境をつくる

ChromebookのLinux（Crostini）でフロントエンド開発環境をつくる。
（npm,gulp,sass,ejsなど)
ASUS Chromebook flip C101PA はCPUがARM系のためすこし躓いたのでメモ。

# Visual Studio Code をインストール
便利なエディタ。
日本語環境と合わせてインストール方法がたくさん紹介されています。

**参考になるサイト** 
- http://www.webcyou.com/?p=8765
- https://www.taneyats.com/entry/vscode-on-c101pa
- https://www.axon.jp/entry/2018/10/18/201812

私の環境だと日本語環境のMozcがうまくいかなかったので以下のようにしました。

- [日本語入力をAnthyで構築](https://qiita.com/shin1kt/items/8d6be8e16e309db9cd79)

# Node.jsとnpmのインストール

## NVMのインストール
Node.jsとnpmをバージョン管理しながらインストールできるNVMをインストールする。

```
$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
```

自動的に起動するように設定
~/.bashrc
~/.profile
どちらかの末尾に追記

```txt:.profile
# 以下を末尾に追記
source ~/.nvm/nvm.sh
```

## Node.jsとnpmのインストール
```
$ nvm install stable
$ nvm use stable
```
インストールの確認

```
$ node -v
$ npm -v
```
それぞれのコマンドでバージョンが表示される。

## gulpのインストール
```
$ npm install gulp
```
とかでインストールできます。
あとはSASSとかをインストールして使えます。

## gulp-sass等がインストールできないときにやること
私の環境では、gulp-sassなど一部のパッケージがインストールにエラーを吐きました。

```
$ sudo apt install build-essential
```
をインストールしたら、解消できました。

---

あとは、いつものようにフロントエンド開発環境を整えるだけ。
安くて軽くて小さくて、持ち運びしやすいChromebook flip C101PAのデフォルトの機能（Crostini）で、ここまでの環境が整えられるのはとても素晴らしいことだと思います。
XSLT でxmlからxml作成 条件分岐の方法

# 経緯
XSLT という普段お目にかからないものを使った業務を行っていたので備忘録を兼ねてまとめていきます。
調べれていけば見つかる情報も多いですが何より自分がひと眼で見られる情報がほしかったので・・・

xmlファイルからxmlを作るなんて機会があった人の役にも立てればいいかな・・・

# 基本
```xml
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
 <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
	<xsl:template match="/">
        <!-- ここに内容を記述 -->
	</xsl:template>
</xsl:stylesheet>

```

上記の内容で内容を記述となっている個所に出力したいxmlファイルを作成していく形となる。
元のファイルから取得したい値などを新しいファイルに移すことになります。
プログラムで一からファイルを作るのが面倒な場合や
ファイルが複雑な時に使えるかと。

# 条件分岐
出力するときの条件分岐の方法をまずは記載
開発をしている中で一番多く書いた気がするのでまずは一番目に持ってきました。
XSLTはあくまでXMLのためタグの中ですべて完結しないといけないので分岐を作る時はよく考えないと
どこからどこまでが1ブロックの中かわからなくなったり・・・
## IF文
javaやpythonなどほかの言語で一般的にあるif文はありますが記述方法に一癖あります。
単純な条件に一致したときになにかを出力それ以外の時は出力しないときは以下のようになります。

```xml
<xsl:if test="条件">
<!-- 条件に一致したときに出力する内容 -->
</xsl:if>
```

一致したときと明記しているのは`if elseif` はおろか`if else`がこの文法では使えません。
なので`if else`を使いたいときは次の方法を行いましょう。

## IF ELSE文

```xml
<xsl:choose>
	<xsl:when test="条件">
		<!-- 条件に一致したときに出力する内容 -->
	</xsl:when>
	<xsl:when test="条件">
		<!-- 条件に一致したときに出力する内容 -->
	</xsl:when>
	<xsl:when test="条件">
		<xsl:choose>
			<xsl:when test="条件">
                          <!-- 条件に一致したときに出力する内容 -->
			</xsl:when>
			<xsl:otherwise>
                          <!-- 条件に一致したときに出力する内容 -->
			</xsl:otherwise>
		</xsl:choose>
	</xsl:when>
	<xsl:otherwise>
		<!-- 条件に一致したときに出力する内容 -->
	</xsl:otherwise>
</xsl:choose>

```

上記のように`<xsl:choose>`タグでくくることで`<xsl:when>`タグ`<xsl:otherwise>`タグが使えて条件の分岐が行えます。
通常の`if else`を作りたければ`<xsl:when>`タグ`<xsl:otherwise>`タグのみ
`if elseif`を作りたければ`<xsl:when>`タグで`elseif`の条件を記載していくことになります。
また中にさらに`<xsl:choose>`タグを入れることで別の分岐を作ることができます。
【GoogleAppsScript】GMAILを送る

# 作成目的
- 加工したデータや作業進捗情報などをメールで共有する必要が出たため作成

# 手順／方法
1. `GmailApp.sendEmail()` のように、GmailAppクラスの sendEmailメソッドを使用する
2. 以下のような書き方になる
  - {  } 内は省略可能
  - MailAppではfromが設定できない(エラーとなった)
     - ログインしているアカウントに紐づいたメールアドレスでないと送れないようだ

```javascript
GmailApp.sendEmail( "宛先アドレス", "題名", "本文", { cc: "ccアドレス", bcc: "bccアドレス", from: "差出人アドレス", name: "差出人名" } );
```
[【Google Apps Script - APIリファレンスページ】 GmailApp クラス - sendEmailメソッド](https://developers.google.com/apps-script/reference/gmail/gmail-app#sendEmail(String,String,String,Object))

# 具体例①
- 宛先などを関数内で設定する

```javascript:send_gmail.gs
function sendGmail() {

  // 変数へ必要な情報を設定する
  var to_mail_address     = "?????@gmail.com";
  var mail_subject        = "掲題： テストメール送信";
  var mail_message        = "本文： テストメールをお送りします！";

  var from_mail_address   = "?????@gmail.com";
  var from_mail_user_name = "差出人名";
  
  // GMAILを送る  
  GmailApp.sendEmail(
    to_mail_address,
    mail_subject,
    mail_message,
      {
        from: from_mail_address,
        name: from_mail_user_name
      }
  );

}
```

# 具体例②
- 宛先などをパラメータで設定する

```javascript:send_gmail.gs
/* 
*  @param {string} to_mail_address     受信者
*  @param {string} mail_subject        掲題
*  @param {string} mail_message        本文
*  @param {string} from_mail_address   送信者
*  @param {string} from_mail_user_name 送信者名
*/
function sendGmail(to_mail_address, mail_subject, mail_message, from_mail_address, from_mail_user_name) {
  GmailApp.sendEmail(to_mail_address, mail_subject, mail_message, { from: from_mail_address, name: from_mail_user_name });
}
```
Railsでページ遷移時にPay.jpのフォームが表示されない問題の解決方法

## Turbolinksを切らないと、Pay.jpのフォームは表示されない

https://pay.jp/docs/checkout の注意事項にも書かれているように、
RailsでPay.jpのチェックアウトを利用しようとすると、Turbolinksに邪魔されてフォームがうまく表示されません。
具体的にいうと、ページ遷移時にチェックアウトのフォームが表示されません。
<img width="1279" alt="スクリーンショット 2019-02-09 20.53.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/253667/ecf2ed1d-f9f4-af10-22fe-e08f63ad8b88.png">

ページ遷移時にjQueryが発火しない問題自体は、
https://qiita.com/kumagi/items/289ccadf344f32613304
https://hackbaka.hatenablog.com/entry/2018/02/15/175259　
あたりを参考にして、

`$(document).on('turbolinks:load', function() {　　});`
で解決できるわけですが、
これを使ってページ遷移時にチェックアウトのScriptをappendしても、チェックアウトのフォームは表示されませんでした。
Script自体は追加されているようでしたが、srcがきちんと機能しないせいで表示されないみたいです。

つまり、 どうあがいてもTurbolinksが邪魔してページ遷移時にフォームを表示することができなかったので、ページ遷移時にフォームを表示するためには、やはりTrubolinksを切る必要があるようです。

とはいえ、自分の場合はTurbolinksを完全に切るのは嫌だったので、フォームを設置したページのturbolinksだけ切ることで問題を解決しました。

具体的には、画面遷移前のリンクに以下の属性を追加して、リンク先のturbolinksを一時的に切ることで、画面遷移後にもチェックアウトのフォームを表示できました。

```erb:リンク先のturbolinksを切る.html.erb
<!-- aタグでturbolinksを切る -->
<a href="<%= book_url(book) %>" class="link" data-turbolinks="false"></a>

<!-- link_toでturbolinksを切る -->
<%= link_to @book, data: { turbolinks: false} do %>

```

参考：　https://qiita.com/morrr/items/54f4be21032a45fd4fe9

<img width="1278" alt="スクリーンショット 2019-02-09 21.44.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/253667/ced0003b-93fa-1ebe-a800-975796a9d7f8.png">


多分、turbolinksを切らずに、htmlにjsを埋め込みたい場合に全般的に役に立つ方法だと思います。
cmdでvimコマンドを使う方法

環境：Windows10

**1. Windowsのバージョンに合わせてダウンロード**
[香り屋-KaoriYa]
(https://www.kaoriya.net/software/vim/)

**2. ダウンロードしたファイルをC:\Program Files配下に移動**

**3. 環境変数にファイルパスを登録**
```C:\Program Files\vim\vim81-kaoriya-win64```

以上

**参考**
[windowsのコマンドプロンプトでvi(vim)を起動する方法]
(http://harucharuru.hatenablog.com/entry/2017/05/01/223230)
[ For Windows 】ゼロから始めるVimエディタ (インストール編)]
(https://qiita.com/Futo23/items/21456f8acbad3c6bb442#2-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92cprogram-files%E9%85%8D%E4%B8%8B%E3%81%AB%E7%A7%BB%E5%8B%95%E3%81%95%E3%81%9B%E3%81%BE%E3%81%99)
ColaboratoryでGPUを使った量子回路のシミュレーション

# はじめに
今回は量子コンピュータそのものについてや，ゲート操作等の基本的な部分は書きません．
もし量子コンピュータ？ゲート？という方はこちらを参考になさってください．

[量子コンピュータと量子ゲートと私](https://qiita.com/eccyan/items/180fb909a55a59bb4e1b)
[ゲート式量子コンピュータの基本知識](http://eman-physics.net/quantum/computer1.html)  

あと今回のコードは[ここ](https://colab.research.google.com/drive/1TAQ3ndvTVIroFKMev6d4Xuyek0wi5A72)にあります．実行したい場合はplaygroundモードで開いてください．(研究室の合宿用に簡単に作ったものなので，コードは汚いです．．．)
## 量子コンピューティングシミュレータ
最近では[Qunasys社](https://qunasys.com/)の[Qulacs](http://qulacs.org/index.html)などのGPUによる量子コンピューティングのシミュレーションツールなどがあります．そもそも量子コンピュータは，言い換えれば超並列処理が得意なコンピュータで，そのシミュレーションをGPUにやらせようというのは自然な流れかなって感じがします．そこで今回は，Googleの[Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)を用いて簡単にシミュレーションをしてみたいと思います．

## 環境
[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)(Googleのアカウントを持っていれば，誰でも無料で使用可能です)
また，今回はpythonでgpuが簡単に使える[CuPy](https://cupy.chainer.org/)と呼ばれるモジュールを使用していきます．

##準備
1. ```ファイル```から```Python3の新しいノートブック```を選択し，新しいノートブックを作成  
2. ```ランタイム```から```ランタイムのタイプを変更```を選択し，```ハードウェアアクセラレータ```を```GPU```にする．　　


## 実験
今回は2量子ビット，10量子ビットの回路で実験を行なっていきます．
まず初期状態を$\mid{0}\rangle^{\otimes{n}}$とします．

### 2量子ビットでの量子もつれ
回路図でいうとこんな感じ.（図は[IBMQExperienceのComposer]  
(https://quantumexperience.ng.bluemix.net/qx/editor))  
下が実行時間で上が最終的な状態です．
<img width="195" alt="スクリーンショット 2019-02-09 20.59.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/286117/771760d5-173d-2dc9-3e25-94529eb90808.png">
**CPU**  
<img width="370" alt="スクリーンショット 2019-02-09 21.01.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/286117/a6e6d518-4ce8-e9de-5ec7-f8eb0a95e9c0.png">

**GPU**
<img width="366" alt="スクリーンショット 2019-02-09 21.02.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/286117/cfa1a066-9791-3dc6-d1b7-7d8398f26ae1.png">

あれ，GPUの方が遅いですね...
では10量子ビットではどうでしょうか？

### 10量子ビットでの量子フーリエ変換
回路図は大きくなってしまうので割愛します(colabのnotebookには，qiskitで出力したものがあります．)が，アダマールゲートと，ある回転角の制御ユニタリ
ゲートの連続で実装されます．(詳しくは[量子フーリエ変換 (Quantum Fourier Transform) とは](https://whyitsso.net/physics/quantum_mechanics/QFT.html))

**CPU**
<img width="505" alt="スクリーンショット 2019-02-10 15.05.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/286117/28592714-a13b-e9cb-7098-041217be9d14.png">

**GPU**
<img width="495" alt="スクリーンショット 2019-02-10 15.06.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/286117/fb2f202a-04e6-5403-3686-6a753f142ba9.png">


なんと約20倍にも早くなりました！ではどのくらいであればGPUを使うと有利なのか，今回は量子フーリエ変換で検証してみます．　　
以下のような結果になりました．

<img width="529" alt="スクリーンショット 2019-02-09 21.30.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/286117/2e34e55f-293f-1292-883b-2774670140e2.png">

これを見ると，8量子ビットを境に実行時間の差が大きく開いていっていることがわかります．

##まとめ
今回はgpuを用いたcupyによる量子回路のシミュレーションを行なっていきました．前述の通り量子コンピュータは非常に並列処理が得意なコンピュータです．現在シミュレーションできる量子ビットの数は約40~50程度とされていますが，もしかしたらこれがより大きくなっていくのかもしれません．

間違い等ありましたらご指摘いただけると幸いです！
###参考
[【秒速で無料GPUを使う】TensorFow(Keras)/PyTorch/Chainer環境構築 on Colaboratory](https://qiita.com/tomo_makes/items/f70fe48c428d3a61e131)
[制御ゲートの作り方](https://whyitsso.net/physics/quantum_mechanics/controlledgate.html)
Visual Studio CodeをオフラインPCで使用する

Visual Studio Code(以下VSCode)をオフライン環境のWindowsで**使えるように**します。
ユーザインストーラを使用してインストールする手順はこちらのサイトが詳しいです。
[Visual Studio Code (Windows版) のインストール](https://qiita.com/psychoroid/items/7d85ae6bade4a67aedb1#vscode%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)
ここではzip版を使用したインストールなしの手順を記載します。
# 前提条件
- オフラインPC
 - Windows
 - インターネットに接続されていないPC
- オンラインPC
 - インターネットに接続されているPC

# VSCodeのダウンロード
オンラインPCから[VSCode公式ページ](https://code.visualstudio.com/)にアクセスします。
![pic1.png](https://qiita-image-store.s3.amazonaws.com/0/342276/2f9a35a1-2e89-e72e-7c1f-e9b3ae0e5d4e.png)

左中央部にある`Download for Windows`ボタン右にある矢印を押下して
![pic2.png](https://qiita-image-store.s3.amazonaws.com/0/342276/7f3d1509-91e6-2fac-15a1-646a4e34bc65.png)

`Other downloads`を押下して表示されるページからWindowsの`zip`をダウンロードします。
(bitはオフラインPCのOSに合わせてください。ここでは64bitを使用します。)
![pic3.png](https://qiita-image-store.s3.amazonaws.com/0/342276/c83c0065-afb7-a320-02b0-16c2c20a7f60.png)

# VSCode拡張機能のダウンロード
VSCodeは拡張機能をインストールすることでカスタマイズすることができます。
オンラインPCではVSCode上から簡単に拡張できますが、オフラインPCではそうもいきません。あらかじめ拡張機能をオンラインPCでダウンロードしておきます。
ここでは日本語化する拡張機能を例として記載します。

オンラインPCからMarketplaceの[Japanese Language Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)にアクセスします。
![pic4.png](https://qiita-image-store.s3.amazonaws.com/0/342276/8f1e621e-19a0-d3c3-677f-6049fa57e0a5.png)

右列`Resources`にある`Download Expression`を押下してダウンロードします。

# インストーラの移動
ダウンロードしたVSCodeのzipファイル、拡張機能をUSBメモリやDVDなどを利用してオフラインPCにコピーします。

# VSCodeのインストール
zipファイルを解凍したら終了です。
![pic5.png](https://qiita-image-store.s3.amazonaws.com/0/342276/ef84bd9f-7fc6-f76a-9255-352ce5a90c11.png)

解凍したフォルダを消すことでアンインストールとなるため、解凍場所は明確にしておきましょう。
インストールという表記にしてありますが、記載の通り解凍のみでインストールではありません。

# 拡張機能のインストール
普通の手順でインストールすると**文字通りのインストール**になってしまうので、一工夫します。
**VSCodeを展開したフォルダ内に`data`フォルダを作成します。**
ここまで用意できたら、VSCode`Code.exe`を起動します。
![pic7.png](https://qiita-image-store.s3.amazonaws.com/0/342276/89c79dfd-8b22-d13f-4706-56e410b4d0c0.png)

英語表示ですね。
拡張機能を入れて日本語化しましょう。
左に表示されているアイコン一番下にある拡張機能を押します。
![pic8.png](https://qiita-image-store.s3.amazonaws.com/0/342276/b00713b9-3a17-2100-f92b-bb3de7969a76.png)

次にEXTENSIONSのバー右上にある`…`を押します。
（画像の赤枠部分）
![pic9.png](https://qiita-image-store.s3.amazonaws.com/0/342276/7e503378-7463-a6c9-5d76-e02326b8168e.png)

表示されたメニューの`Install from VSIX...`を押します。
![pic10.png](https://qiita-image-store.s3.amazonaws.com/0/342276/5a4f10de-ed42-217f-225a-a22cfa48f04f.png)

先ほど拡張機能をコピーしたフォルダを開き、VSIXファイルを選択します。
![pic11.png](https://qiita-image-store.s3.amazonaws.com/0/342276/a803a7eb-2496-2b2a-ffe9-3fa92390641c.png)

しばらくすると右下にポップアップが表示されます。
`Restart Now`をクリックし、VSCodeを再起動します。
![pic12.png](https://qiita-image-store.s3.amazonaws.com/0/342276/49821735-1b99-dfe4-d101-d264cbc0520e.png)

日本語化されたVSCodeが起動します。
![pic13.png](https://qiita-image-store.s3.amazonaws.com/0/342276/51ea043d-b4e7-b808-4e62-8f06f849e9ca.png)

# まとめ
zip版VSCodeを展開し、展開先にdataフォルダを作ってから起動すれば拡張機能も気にせずインストール可能です。これは`ポータブルモード`というものを利用しました。
以下のサイトを参考にさせていただきました。
[VS Codeを持ち運ぶには（ポータブルモード）](http://www.atmarkit.co.jp/ait/articles/1807/20/news023.html)

これでインストール不要環境でもVSCodeを使用することができます。
拡張機能も入れ放題です。
コピーひとつで複数端末への導入も可能です。
RailsのDBモデルの命名規則をまとめてみた

#初めに
初めて複数単語の組み合わせでモデル名を作る機会があって悩んだので、モデルの命名規則と生成されるもの一覧をまとめてみました

http://railsdoc.com/model
こちらの情報です。

##単語一つの場合の命名規則

例としてmodelという名前のモデル

|モデル名	|model   |
|:---|:---|:---|
|モデルクラス名  |Model	|
|ファイル名	|model.rb|
|テーブル名	|models	|

##単語複数の場合の命名規則

例としてmodel schedule

モデル名	|model schedule   ||
|:---|:---|:---|
|モデルクラス名  |ModelSchedule	|
|ファイル名	|model_schedule.rb|
|テーブル名	|model_chedules|


##単語複数の場合のモデル作成コマンド

モデル作成時のコマンドは下記のどちらでも大丈夫です

```
 rails g model ModelSchedule  user_id:integer schedule:text
 rails g model model_schedule  user_id:integer schedule:text
```

ただし単語複数の場合も、単語一つの場合もモデル作成時sを付けて複数形にするのはだめです！

```
rails g model Models  user_id:integer schedule:text
rails g model ModelSchedules  user_id:integer schedule:text
```

modelは必ず単数形で作成しましょう
Page Builder by SiteOriginで作ったブロックが表示されない時

私は、Page Builder by SiteOriginで作ったブロックがエディタ画面で表示出ず、悩んでいました。
試行錯誤している中、やっと表示できるようになりました。

![スクリーンショット 2019-02-09 21.03.59.png](https://qiita-image-store.s3.amazonaws.com/0/20977/c6cf7871-020c-affb-4db3-e3b433651936.png)

私は、ネット回線が髪プランと称される超低速なので、通信速度の問題だと思い込んでいました。
それで、ブラウザのFierfoxで試すなど試行錯誤を続けて来ました。
その中で、ようやく表示できるようになりました。

![スクリーンショット 2019-02-09 21.01.44.png](https://qiita-image-store.s3.amazonaws.com/0/20977/eb1018dd-b225-e52d-93c3-7e21142f0f90.png)

エディタ画面の上の鉛筆のようなアイコンをクリックすると、ブロックを表示できました。

普段は、この状態です。
![スクリーンショット 2019-02-09 21.17.30.png](https://qiita-image-store.s3.amazonaws.com/0/20977/0c3a35d3-1f9a-1764-2b20-dd62336a1386.png)

表示させたいPage Builder by SiteOriginで作ったブロックの場所をクリックして選択します。
すると、先に赤丸で囲んだ鉛筆のようなアイコンが表示されます。

![スクリーンショット 2019-02-09 21.19.10.png](https://qiita-image-store.s3.amazonaws.com/0/20977/4d9b6060-df3e-503f-fff5-d7496fb52556.png)

鉛筆のようなアイコンをクリックすると、この画像のように、ブロックが表示されて編集できるようになります。
【業界対応①】最低限のIT業界語を覚える。

・IT業界に入ってまだ若々しさ全開の私が、業界独自文化を学び、極上のごますり人間を目指す記事第一弾。
・「そのような学習や調査をする暇があるなら技術向上を図れ」という有無を言わせぬ正論を星の数ほど浴びてきた、同情満載生活。
・初回はIT独自用語はもちろん、ビジネス上でも用いられる用語を調査することにしよう。

## 経緯
-  とあるお方との会話。
    - 「このプログラム、うまく実行できないんですけど、どうしたらいいですかね？」
    - 「あーー。これはタイポだね。」
    - 「？」
    - 「・・・・・」
    - 「・・・・・」
    - 「あー、タイポ分からない？"入力ミス"っていう意味だよ」
    - 「そうなんですね。すぐ修正します」
- もう半年以上この業界で働いている私のあまり無知ぶりを炸裂。
- よし。このような「無風の静寂」が起きないように調査しよう。

## カタカナ系
### アーキテクチャ
- 「構成」

### アウトプット
- 「成果物」「産出」

### アクセシビリティ
- 「利用のしやすさ」「汎用さ」

### アサイン
- 「参加」「割り当て」

### アジェンダ
- 「議題」

### アドオン
- 「拡張機能」

### エコシステム
- 「業界やサービスの連携関係」

### エビデンス
- 「証拠」

### オーソライズ
- 「認証」「許可」

### オーナー
- 「システムやプロジェクトの所有者」

### オンスケ
- 「予定通り」

### オンプレ
- 「システムやサーバーの独自運用」

### カットオーバー
- 「新システムの開発や導入」「新システムへの移行」

### キックオフ
- 「プロジェクト開始宣言」

### コミット
- 「約束」

### コンフリクト
- 「衝突」

### サチる
- 「飽和」「満杯」

### サマリー
- 「要約」

### スキーマ
- 「構造」

### スキーム
- 「枠組みを伴った計画」

### スクラッチ
- 「ゼロから」

### スパゲティ
- 「複雑でこんがらがるコード」

### タイポ
- 「入力ミス」

### タスク
- 「課題」「仕事」

### デグレ
- 「修正内容が消える」「新バージョンの劣化」

### デバッグ
- 「バグの修正作業」

### デプロイ
- 「本番への配備」「展開」

### バッファ
- 「一時的なデータの記憶場所」

### ハンドリング
- 「調整」「運用」「対応」

### フィックス
- 「確定」

### ペンディング
- 「未解決状態」「保留」

### マイルストーン
- 「重要な節目」

### マージ 
- 「統合」「反映」

### リスケ
- 「予定の組みなおし」

### リソース
- 「必要なもの。」

### リモート
- 「ネットワーク経由の場所」

### レビュー
- 「他の人からの評価」

### ローンチ
- 「立ち上げる」

## 日本語系

### 落とす
- 「システムを終了させる」「ファイルやデータを保存する」

### 親
- 「関係上、上の位置にあるもの」

### 切る
- 「別領域作成して、そこに格納」

### こける
- 「処理の失敗」

### 殺す
- 「サーバーやプロセスの強制終了」

### 子
- 「関係上、下の位置にあるもの」

### 死ぬ
- 「サーバーやプロセスの終了」

### 島
- 「固まり」

### 通す
- 「設定する」「接続道をつくる」

### 叩く
- 「実行する」

### 流す
- 「処理の実行」

### 人月
- 「一人文の月単位の作業量」

### 走る
- 「プログラムが実行される」

## 英語系（略語）
### ASAP（アサップ）
- 「できるだけ早く」。

### DB
- 「データベース」。

### foo
- 「意味がないときに用いる、使い捨て用語（海外）」

### hoge（ホゲ）
- 「意味がないときに用いる、使い捨て用語（日本）」

## まとめ
- 今回は、業界用語調査ということで、色々な独自言葉の豊富さに圧倒されながら、記事を書く。
- これらの多種多様な言葉の考案者と、それらを使いこなせる賢者達の敏腕ぶりに、感涙必須の映画鑑賞時と同じ心情。
- これらの秀才限定の言葉を扱うのは、今世では早すぎる私は、聞き取り専門に回るとしよう。

## 参考
- https://qiita.com/t_nakayama0714/items/478a8ed3a9ae143ad854  
→こちらの記事を参考にしました。大変お世話になりました。
- https://wa3.i-3-i.info/tag-word-list14-1.html  
→こちらの記事を参考にしました。大変お世話になりました。
コマンドラインでgistを操作できる"gist"

手軽にコードを共有したいときにgistは便利ですよね。今回は https://gist.github.com/ にわざわざアクセスすることなくgistへのアップロードなどができる [gist](https://github.com/defunkt/gist) を紹介します。

## インストール

Homebrew

```
brew install gist
```

gem

```
gem install gist
```

Bundler

```
source :rubygems
gem 'gist'
```

<br>

インストールしたらまず

```sh
gist --login
```

で認証を行います。正しくログインできれば`~/.gist`にアクセストークンが書き込まれます。

## 主な機能

### public gist を作成

手元にある `hoge.js` を public gist としてアップロードするには

```sh
gist hoge.js
```

だけです。gistの作成が完了すると、そのgistのリンクがコンソールに出力されます。
また、

```sh
gist hoge.js -c
```

とすれば、作成されたgistのリンクがクリップボードにコピーされます。

```sh
gist hoge.js -o
```

とすれば、作成されたgistを既定のブラウザで確認することができます。
一般的なCLIツールと同様

```sh
gist a b c # ３つのファイル a b c を1つのgistとしてアップロード 
gist *.rb # 拡張子.rbのファイル全てを1つのgistとしてアップロード 
```

のようなこともできます。

### private gist を作成

```sh
gist -p hoge.js
```

### 別名を付けて gist を作成

手元にある `hoge.js` を `fuga.js` としてアップロードするには

```sh
gist -f fuga.js hoge.js
```

### description も付けて gist を作成

```sh 
gist -d "これはhoge.jsです。" hoge.js
```

### gist の更新

```sh
gist -u GIST_ID fuga.js
```

元のGIST_IDのgistに `fuga.js` が無ければそのgistに `fuga.js` が新たに付け加えられ、元々あれば内容が更新されます。

### gist の削除

```sh 
gist --delete GIST_ID
```

### gist 一覧の表示

自分がこれまでに作成した gist の一覧は

```sh
gist -l
```



他の人の public gist の一覧は

```sh
gist -l USER_ID
```

### gist の中身を確認

```sh
gist -r GIST_ID
```

で標準出力されます。

## その他の使い方の確認

```sh 
gist -h
```

あるいは

```sh
man gist
```
Python Twitter APIを使わずにツイートを収集

## Twitterアフィリエイトを行うにあたって
ツイートのパクリは欠かせません。ただし、Twitter APIを使ってツイートの収集をしていると、アカウントが凍結されてしまいます。
<img width="697" alt="Twitter アカウント凍結" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266239/0bb42a5c-f15a-3913-4403-79a23a28a139.png">
複数のアカウントを切り替えてTwitter APIをコールしていてもそのうちすべて凍結されます。
Twitter APIを使わずにツイートが収集できればこの問題は解決します。

## ツイートにアクセス
こんな書式でアクセスすればJSONでツイートは得られます。
https://twitter.com/i/profiles/show/kabu01/timeline/tweets?include_available_features=1&include_entities=1&include_new_items_bar=true
解析が面倒。。。

## twitter-scraperの利用
上記の形式でTwitter APIを使わずにツイートを収集できる twitter-scraper ライブラリを使います。 python 3.6 以上で利用できます。

```
$ pip install twitter-scraper
```

インストールしただけではエラーが出てしまいます。

```
File " path to /lib/python3.6/site-packages/twitter_scraper.py", line 42, in gen_tweets
replies = int(interactions[0].split(" ")[0].replace(comma, "").replace(dot,""))
ValueError: invalid literal for int() with base 10: '\n'
```

こんなエラーが出るので該当ファイルを次のように修正してください。
修正前

```
replies = int(interactions[0].split(" ")[0].replace(comma, "").replace(dot,""))
retweets = int(interactions[1].split(" ")[0].replace(comma, "").replace(dot,""))
```

修正後

```
try:
    replies = int(interactions[0].split(" ")[0].replace(comma, "").replace(dot, ""))
except ValueError:
    replies = 0

try:
    retweets = int(interactions[1].split(" ")[0].replace(comma, "").replace(dot, ""))
except ValueError:
    retweets = 0
```

## ツイート収集
こんな風に使います。

```python
from twitter_scraper import get_tweets
for tweet in get_tweets('kabu01', pages=1):
    print(tweet)
    print("\n")
```

こんな風にリンクや画像も含めて取得できます。

```

{'tweetId': '1087597341912125440', 'time': datetime.datetime(2019, 1, 22, 15, 26, 27), 
'text': '今日は長女の幼稚園で劇の発表会がありました。内容は何と「おおきなかぶ」（笑）\n劇のように今年は「大きな株」が抜けるでしょうか！？', 
'replies': 0, 'retweets': 0, 'likes': 10, 'entries': {'hashtags': [], 'urls': [], 'photos': [], 'videos': []}}


{'tweetId': '1085825146915479552', 'time': datetime.datetime(2019, 1, 17, 18, 4, 23), 
'text': '直近、こちらの２つの投資勉強会を申し込んだ。\n忘れないように記録しています。\nいつもYouTubeで坂本さんの動画を見ている。\nとても勉強になります。\n本人に会うことができて楽しみにしています。( ◠‿◠ )pic.twitter.com/0KamlaDJG3', 
'replies': 0, 'retweets': 0, 'likes': 4, 'entries': {'hashtags': [], 'urls': [], 
'photos': ['https://pbs.twimg.com/media/DxGgNYpVAAANxGu.jpg', 'https://pbs.twimg.com/media/DxGgNYnU0AATgfm.jpg'], 'videos': []}}


{'tweetId': '1087178896452141056', 'time': datetime.datetime(2019, 1, 21, 11, 43, 42), 
'text': '今月発売のDIME、2019年3月号「株で人生を変えた人に学ぶ勝ちワザ」に掲載されました。\n\n私は50ページに載りましたが、その他、著名な方も掲載されておりました。pic.twitter.com/C8TC7ADBeG', 
'replies': 0, 'retweets': 0, 'likes': 11, 'entries': {'hashtags': [], 'urls': [], 
'photos': ['https://pbs.twimg.com/media/DxZvcNHUYAEv3E9.jpg'], 'videos': []}}

```
【rails5】CSVエクスポートで出力される時刻とビューに出力される時刻を、JSTで一致させたい

#CSVエクスポートで出力される時刻とビューに出力される時刻を、JSTで一致させたい

解決。

下記のように設定しており、時刻の保存もTime.nowやTime.currentなど様々なパターンで試したが、どうやってもDBに保存される値とビューの表示が９時間ズレてしまい、CSVファイルに上手く反映されない。

```
#DB保存はUTCだが、表示はJST
config.time_zone = 'Tokyo'

# DBに保存する時間をJSTにする
config.active_record.default_timezone = :local
```
##結論

PC自体のタイムゾーンを変更してやると解決出来ました。

下記の記事を参考にしました。

1
https://eng-entrance.com/linux-time-timezone

2
https://www.server-memo.net/tips/command/cp/cp.html

現在のタイムゾーンを確認するため、コンソールでdateと打つと、

```
$ date
Sat Feb  9 11:19:48 UTC 2019
```
システムのタイムゾーンがUTC時刻になっている。

おそらくこれが原因。

タイムゾーンをJSTに設定するには、１の記事によると、

> 「/usr/share/zoneinfo/」ディレクトリのしたにあるゾーン情報ファイルを「/etc/localtime」としてコピーすることでタイムゾーンを設定できる。実態をコピーしてもよいが、シンボリックリンクをはっても同じ効能が得られる。

とのこと。

試します。

```
$ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
cp: cannot create regular file ‘/etc/localtime.2019-02-09’: Permission denied
```
アクセス拒否されました。

２の記事を参考に、-fオプションをつけます。

```
$ cp -f /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
cp: cannot remove ‘/etc/localtime’: Permission denied
```
これもアクセス拒否。。

２の記事に

> ※他のユーザがオーナーのファイルで、コピーしようするユーザに書き込み権限が無い場合は、「-f」オプションをつけても上書きはできません。（rootユーザを除く）

と書いてあったので、sudoコマンドを入れると、

```
$ sudo cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```
アクセス拒否されない！

再度dateと打って確認すると、

```
 $ date
Sat Feb  9 20:27:11 JST 2019
```
JSTになりました！

この後CSVエクスポートすると、CSVファイル、ビュー共に日本時間で表示が出来ました！

pumaのタイムゾーンがUTCになっていたので、このあたりをどうにか出来ればと思っていましたが、PC自体の時刻設定など気にしたこともなかったので、勉強になりました！