OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQL入門 よく使うコマンドノート

こちらはPostgreSQL入門にあたり、よく使うコマンドをメモしたものです。

今後役に立つコマンドor修正点などがあれば随時更新していきます。


```sql

-- Create Database　（データベース作成）
createdb 'database-name'

-- Select Database　（データベース選択）
psql 'database-name'

-- Create Table (テーブル作成)
CREATE TABLE users (name text, age smallint, birthday date);

-- Insert data　（データー追加）
INSERT INTO users (name, age, birthday) VALUES ('Genie High', 31, '1989-12-01');

-- Select data (データ選択)
SELECT name, age, birthday FROM users;
SELECT * FROM users;　-- 全て選択

--  結果
    name    | age |  birthday  |
------------+-----+------------+
 Genie High |  30 | 1989-12-01 |  


-- Conditional Selection　（条件付きで選択）
-- Gで始まるデータ
SELECT * FROM users WHERE name LIKE 'G%';

--  結果
    name    | age |  birthday  |
------------+-----+------------+
 Genie High |  30 | 1989-12-01 |   


-- テーブル定義を変更
ALTER TABLE users ADD score smallint;

-- 結果
    name    | age |  birthday  | score 
------------+-----+------------+-------
 Genie High |  30 | 1989-12-01 |   

-- Update　（テーブルの行を更新）
UPDATE users SET score = 50 WHERE name = 'Genie High';
-- 複数の更新
UPDATE users SET score = 100 WHERE name = 'Genie High' AND name = 'John';


--  昇順（asc） 降順（desc） 
SELECT * FROM users ORDER BY score DESC;
SELECT * FROM users ORDER BY score ASC;

-- DESCの結果
    name    | age |  birthday  | score 
------------+-----+------------+-------
 sample     |  29 | 1989-10-03 |   100
 John       |  41 | 1930-12-01 |   100
 Andy       |  31 | 1930-12-01 |    50
 Genie High |  30 | 1989-12-01 |    50

-- ASCの結果
    name    | age |  birthday  | score 
------------+-----+------------+-------
 Andy       |  31 | 1930-12-01 |    50
 Genie High |  30 | 1989-12-01 |    50
 sample     |  29 | 1989-10-03 |   100
 John       |  41 | 1930-12-01 |   100


-- Delete 削除
DELETE FROM users WHERE name = 'Sally';
-- Delete Tables.
DROP TABLE users;

-- その他  
SELECT AVG(score) FROM users;　-- 平均値
SELECT SUM(score) FROM users;　-- 合計値
SELECT COUNT(score) FROM users;　-- 値の数

```

テーブル結合


```sql

  -- example: 新たなテーブル作成
  CREATE TABLE login (
    ID serial NOT NULL PRIMARY KEY,
    secret VARCHAR(100) NOT NULL,
    name text UNIQUE NOT NULL
  );
  -- example: Add some values.
  INSERT INTO login ( secret, name ) VALUES ('abc', 'Andy');
  -- example: Join Tables (テーブルの結合)
  SELECT * FROM users JOIN login ON users.name = login.name;

```

[PostgreSQLドキュメントはこちら](https://www.khanacademy.org/computing/computer-programming/sql/sql-basics/pt/creating-a-table-and-inserting-data)
特定のページを表示させているときのみクラスを付与する

jQueryのclickイベントで実現。
かなり原始的なやり方なので、オススメはしない。

○実装の背景
以下のコードのように、サイドバーのメニュー項目として「テスト〜テスト4」まで存在している。
各項目をクリックし、そのページを表示させている時のみ、liタグにpanel-headingとは別にもう一つclickedクラスを付与したい。
current_page?メソッドで実装できそうだが、うまくいかなかったため、この方法で試した。

```erb:sample.erb
<!-- サイドバー -->
<aside class="main-sidebar">
      <section class="sidebar">
        <ul class="sidebar-menu">
          <li class="panel-heading"> 
            <%= link_to 'テスト', hogehoge_path, remote: true, class: "block_modal" %>
          </li>
          <li class="panel-heading2">
            <%= link_to 'テスト2', hogehoge_path2, remote: true, class: "block_modal" %>
          </li>
          <li class="panel-heading3">
            <%= link_to 'テスト3', hogehoge_path3, remote: true, class: "block_modal" %>
          </li>
          <li class="panel-heading4">
            <%= link_to 'テスト4', hogehoge_path4, remote: true, class: "block_modal" %>
          </li>
        </ul>
      </section>
    </aside><!-- サイドバー終わり -->
```

```js:sample.js
// サイドバー クリックで現在ページにのみ、クラス付与
$(function(){
  
$(".sidebar-menu li.panel-heading").click(function(){
  if(!$(this).hasClass("clicked")){
    $(this).addClass("clicked");
  }
  $('.sidebar-menu li.panel-heading2').removeClass('clicked');
  $('.sidebar-menu li.panel-heading3').removeClass('clicked');
  $('.sidebar-menu li.panel-heading4').removeClass('clicked');
});

$(".sidebar-menu li.panel-heading2").click(function(){
  if(!$(this).hasClass("clicked")) {
    $(this).addClass("clicked");
  }
  $('.sidebar-menu li.panel-heading').removeClass('clicked');
  $('.sidebar-menu li.panel-heading3').removeClass('clicked');
  $('.sidebar-menu li.panel-heading4').removeClass('clicked');
});

$(".sidebar-menu li.panel-heading3").click(function(){
  if(!$(this).hasClass("clicked")) {
    $(this).addClass("clicked");
  }
  $('.sidebar-menu li.panel-heading').removeClass('clicked');
  $('.sidebar-menu li.panel-heading2').removeClass('clicked');
  $('.sidebar-menu li.panel-heading4').removeClass('clicked');
});

$(".sidebar-menu li.panel-heading4").click(function(){
  if(!$(this).hasClass("clicked")) {
    $(this).addClass("clicked");
  }
  $('.sidebar-menu li.panel-heading').removeClass('clicked');
  $('.sidebar-menu li.panel-heading2').removeClass('clicked');
  $('.sidebar-menu li.panel-heading3').removeClass('clicked');
});

});
```
サイドバーの各メニュー項目をクリックすると、clickedクラスを持っていなければ、clickedを付与。
それと同時に、クリックしたメニュー項目以外の項目にclickedクラスが付与されていれば、解除する。
これで、常にクリックした項目にのみclickedクラスを付与できる。

このclickedクラスを用いてcssで指定すれば、特定のページを開いている時のみ、文字色や背景色など変えられる。
Python3.7でバイナリ検索した結果をリストで出力する

# あー大変
工業標準化法の一部改正に伴い、2019/7/1から
法律名が「工業標準化法」から「産業標準化法」に改正されるそうです。

【JIS法改正（産業標準化法）（METI/経済産業省）】
https://www.meti.go.jp/policy/economy/hyojun/JISho.html

仕事で使っている帳票ツールの固定文字定義がバイナリ保管のようだったので、
文字コードで検索して、リストを出力する処理を作成しました。

# 環境設定
1.Python 3.7.2をインストールする。
2.python -m venv venv で仮想環境を作成する。

# コード
出来るだけ、pip installしなくても良い内容で書いてみました。

```py
import sys
import re
from pathlib import Path

p = Path("./")
pl = list(p.glob("**/*.*"))

outfile = open('SearchResult.txt', "w")

print("■■処理開始■■")

for plr in pl:
    print("　　－－" + Path.as_posix(plr))
    infile = open(plr, 'br')
    data = infile.read()
    infile.close()
    # 工業規格のSJIS文字コードで検索
    # Noneでない時(=対象文字が存在する場合)に出力
    if re.search(rb'\x8D\x48\x8B\xC6\x8B\x4B\x8A\x69',data) is not None:
        print("　　　　＠＠" + Path.as_posix(plr))
        outfile.write(Path.as_posix(plr)+"\n")

outfile.close()
print("■■処理終了■■")
```

数か月後ですが、事前準備しておかないとバタつきますよね。
パターソン&ヘネシー本を読んでいく（１）

パターソン&ヘネシー本を読んでいって、気になったところをメモしていって、コメント加えていきます。

https://www.amazon.co.jp/dp/B00UJ42A0K/

##「まえがき」の概要

*　プログラムを高速化するためには、並列化しないといけない。
なぜか
昔デュアルコアが多かったみたいだけど、16コアとか、３２コアとかが多い。一つのコアしか使わないのは非現実的。

* コンピュータを効率よく使うためには、ハードウェアとソフトウェアのインターフェースの知識が必要。

##１章、コンピュータの抽象化とテクノロジ
#はじめに

*  コンピュータにアメリカ経済のかなりの部分が依存している
*  コンピュータは異常なまでの技術革新を遂げている
*  コンピュータのコスト効率が１０倍になるたびに、コンピュータの利用機会が倍増される。

で、以下のような用途が新たに出てきたようです。

* 車載コンピュータ
* 携帯電話
* ヒトゲノム研究プロジェクト
* World Wide Web
* 検索エンジン

#コンピュータの利用形態の分類とその特性

コンピュータの利用形態は以下のようなものがあります。

*  パーソナルコンピュータ
　パーソナル・コンピュータは単一のユーザーに低いコストで高い性能を提供することに重点が置かれている。
　まあ周知の通りですね
*  サーバー
　サーバはたくさんの仕事をこなすことに重点が置かれている。
　科学技術計算やエンジニアリング分野のアプリケーションのような単一の複雑なアプリケーション
　大規模なWebサーバのような小規模なジョブを大量に扱う
　サーバはPCと共通する技術基盤だが、処理やストレージや入出力の能力の拡張性が高められている。
　スーパーコンピュータもサーバの一種
*  組み込みコンピュータ
　コンピュータの利用形態で最大のもの（産業規模？コンピュータの個数？）
　自動車、テレビ、飛行機や輸送船の制御なども司る
　信頼性が大事、故障の許容度は極めて低い（飛行機や自動車などに使われるため）

#ポストPCへのいざない
スマホやタブレットのようなパーソナル・モバイルデバイス（PMD)について触れられている

#本書で学べること

*  最初はメモリ制約があった。だが、メモリ容量が増えるに従い、問題にならなくなった
*  性能に関心のあるプログラマはその代わりに、現代のプロセッサの並列性や記憶の階層性などについて理解する必要が生じた

この本を学ぶと、以下のような質問に答えられるようになる

*  CやJavaのような高水準言語で書かれたプログラムが、ハードウェアの言語にどう翻訳され、実行されるか
*  ソフトウェアとハードウェアのインターフェースとは何か
*  プログラムの性能はどう決まり、どう性能を改善できるか
*  エネルギー効率の改善法
*  逐次処理から並列処理への最初の変換は、どのような理由によるものであり、どのような結果をもたらしたか

上の質問に対する答えを理解しないまま、性能のを改善しようとしたり、特性の評価をすることはやめてほしいみたいなことが書いてある。（耳が痛い）
これらを理解しないまま試行錯誤しても無駄だよ（にっこり）
科学的にやってね（にっこり）

* コンピュータの設計者は頭文字（acronym)をよく使う。
* プログラムの性能はいくつかの要因の組み合わせに左右されるよ。その要因は以下にリストした

アルゴリズム
プログラミング言語、コンパイラ、アーキテクチャ
プロセッサと記憶システム
入出力システム

ということで、次に続きます

次回は、

1.2コンピュータアーキテクチャにおける８つの主要なアイディア

です
よく使うtreeコマンド

# tree

ディレクトリの階層構造をいい感じに表示してくれるやつ

# 使い方

```
# HogeDir(省略可)以下の階層表示
tree HogeDir

# HogeDir(省略可)以下のn階層表示
tree -L 2 HogeDir
```

快適階層構造表示ライフ:v:
CSS Modulesの:localに入れっ子Classを効かせる

# TL;DR
こんな書き方でした。要するに、`:local`の中で`:global`を明示的に宣言することでした。

```foo.scss
:local {
  .foo {
    width: 100%;
    height: 200px;
    :global {
      .bar {
        color: blue;
      }
      .baz {
        background-color: green;
      }
    }
  }
}
```

# はじめに
Reactでも、Vue.jsみたいに**[スコープ付き CSS](https://vue-loader-v14.vuejs.org/ja/features/scoped-css.html)**を使いたい時、[`css-loader`](https://github.com/webpack-contrib/css-loader)を使って、**[CSS Modules](https://github.com/css-modules/css-modules)**として導入する方法があります。

しかし、下記の記述だと、`<Foo/>` にはスタイルが効くものの、その配下の`div.bar`や`div.baz`までスタイルは効いてくれませんでした。

```foo.scss
:local(.foo) {
  width: 100%;
  height: 200px;
  .bar {
    color: blue;
  }
  .baz {
    background-color: green;
  }
}
```

```foo.tsx
import * as React from 'react'
import { foo as fooStyle } from 'foo.scss'

const Foo: React.FC<{}> = props => (
  <div className={fooStyle}>
    <div className='bar'>Bar</div>
    <div className='baz'>Baz</div>
  </div>
)

export default Foo
```

*css-loaderの導入の仕方はこちらの記事を参考してください。本記事では割愛いたします。*
https://codeburst.io/4-four-ways-to-style-react-components-ac6f323da822
https://qiita.com/Quramy/items/a5d8967cdbd1b8575130

# 対策
## その１
最初見つかった対策は、`foo.scss`をこんな書き方にすることで、解決できました。

```foo.scss
:local(.foo) {
  width: 100%;
  height: 200px;
  [class=bar] {
    color: blue;
  }
  [class=baz] {
    background-color: green;
  }
}
```

`.bar`のような記法はある意味で[糖衣構文](https://ja.wikipedia.org/wiki/%E7%B3%96%E8%A1%A3%E6%A7%8B%E6%96%87)であり、本来の書き方に戻すことで、css-loaderが普通に解釈してくれました。

## その２
`[class=bar]`のような構文をたくさん書くと、「やっぱり、`.bar`書きたいだよね」と思っちゃいますね。
そこで見つかったのは、`:local`スコープの内部に `:global`スコープを明示的に宣言することでした。
[css-loaderのREADME](https://github.com/webpack-contrib/css-loader#scope)でも、この記法の存在を示唆しました。

```foo.scss
:local(.foo) {
  width: 100%;
  height: 200px;
  :global {
    .bar {
      color: blue;
    }
    .baz {
      background-color: green;
    }
  }
}
```

前述したように、`foo.scss`を上記構文に直すと、無事、`div.bar`や`div.baz`までスコープできました。

コンパイルされたHTMLやCSSはこんな感じでした。

```html
<div class="_3stJVexdk1_1H90Xh-wKBa">
  <div class="bar">Bar</div>
  <div class="baz">Baz</div>
</div>
```

```foo.css
._3stJVexdk1_1H90Xh-wKBa {
  width: 100%;
  height: 200px;
}
._3stJVexdk1_1H90Xh-wKBa .bar {
  color: blue;
}
._3stJVexdk1_1H90Xh-wKBa .baz {
  background-color: green;
}
```
「入門 監視」を読んでの監視設計まとめ 1

# はじめに

このたび、システムの監視について深く考えてみようと思いこの記事を書いています。
オライリーから出版されている「[入門 監視](https://www.amazon.co.jp/%E5%85%A5%E9%96%80-%E7%9B%A3%E8%A6%96-%E2%80%95%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Mike-Julian/dp/4873118646/ref=sr_1_fkmrnull_1?adgrpid=71142886531&hvadid=338577085871&hvdev=c&hvlocphy=1009310&hvnetw=g&hvpos=1t1&hvqmt=e&hvrand=10026784836535596666&hvtargid=kwd-616014051305&jp-ad-ap=0&keywords=%E3%82%AA%E3%83%A9%E3%82%A4%E3%83%AA%E3%83%BC+%E7%9B%A3%E8%A6%96&qid=1554795657&s=gateway&sr=8-1-fkmrnull)」を読んで自分の考えと合わせてまとめていこうと思います。


## アンチパターン

* ツールに依存しても、監視の仕組みはよくならない
* 監視は全員でやるべき仕事であり、チームや部署内での役割ではない
* 素晴らしい監視とは、チェックボックスに「これは監視しています」とチェックを入れて済むものではない
* 監視するだけでは壊れたものは直らない
* 自動化が足りていないということは何か重要なことを見落としている可能性を知る良い方法

自分自身の体験でも心当たりがあるものが多く、耳が痛い限りですが一つずつ見ていくとします。

### ツールに依存しても、監視の仕組みはよくならない
これは監視ツールだけに限らず、他のツールや仕組みに対して起こることだとは思います。
いわゆる、大企業が導入しているからという理由で導入したり、他の部門が使っていてうまくいっているから導入するというパターンです。

導入事例があるというと聞こえがいいが自分たちのシステムとあっているとは限らないので注意すること

### 監視は全員でやるべき仕事であり、チームや部署内での役割ではない
### 素晴らしい監視とは、チェックボックスに「これは監視しています」とチェックを入れて済むものではない

この2つの項目に関しては同時に出ることが多く、よく見てきた事象でもあります。
例えば、システムに詳しくなく引き継いだ運用。引き継いだものの監視の設計はされておらず、本番環境である以上「監視しろ」というお達しも…
某Excelとかで監視項目の表を作り、これを監視していますという**チェックボックス監視**ができあがり、詳しくないためにシンプルで簡単なものしかできず。。。いざ、何か起こると何もできず…
という何重苦にもなる事象

### 監視するだけでは壊れたものは直らない
上の話と通じるものがあるが何かが壊れたらそれに対する監視をする...直接的な解決をせず監視に頼るように項目を増やしても不完全なアプリケーションは直らないという話です。

### 自動化が足りていないということは何か重要なことを見落としている可能性を知る良い方法
従来のオンプレ環境とクラウド環境では監視する観点は大きく違います。
個別に何かを監視している従来に対しクラウド環境は何かの集合全体を監視することです。

まとまりを監視していくクラウド環境では自動化が必須となります。

## まとめ

このアンチパターンは仕事をしていて体験したこととリンクして**あるある**という感じで、まだまだ自分の周りでも多く見られる事象であると感じました。

これを基に今後、どう設計していくかの話もまとめていこうと思いますが本の中でもまだ第1章で長くなりそうなので分けて投稿しようと思います。

全部まとめるまでどれくらいかかるかわかりませんが少しでもお役に立てれば幸いです
IGListKitのデモでビルドエラーが発生したので解消した

IGListKitが便利だと聞いたので、早速使ってみようと思い公式のリポジトリをクローンし環境構築をしたのですが、ビルドエラーが発生してデモプロジェクトを起動することができませんでした。

#環境
|  | Version | 
|:----------|:------------|
| iOS       | 10.14.3     |
| CocoaPods | 1.6.0       |
| Xcode     | 10.1        |


#手順
公式サイトのREADMEに従い、以下を実行。

```
$ git clone https://github.com/Instagram/IGListKit.git
$ cd IGListKit/
$ ./scripts/setup.sh
```

私の場合、この時点でbundle: command not found が発生しました。
遠い昔にインストールしたような気がするけど、とりあえず以下を実行。
環境構築系本当苦手・・・:disappointed_relieved:

```
$ sudo gem install bundler -n /usr/local/bin
```

念のため確認

```
$ bundle -v
$ Bundler version 2.0.1
```


これで環境系は整ったはずなのでビルドを実行。

↓↓↓

<font color="Red">'IGListKit/IGListAdapterUpdateListener.h' file not found</font>

ビルドエラーが発生しました。\:persevere:


検索したら同じ事例を発見。
[こちら](https://github.com/Instagram/IGListKit/issues/1015)を参考にして以下を実行。

```
$ cd Examples/Examples-iOS 
$ pod update
```

再度ビルドした結果、ビルドエラーが解消されました！

何かおかしな点があればご指摘いただけますと幸いです。\:pray:


#参考
https://github.com/Instagram/IGListKit
https://github.com/Instagram/IGListKit/issues/1015
Jetson Nano 開発者キットが故障かな？と思ったら

**以下、執筆者個人の経験に基づく情報です。最終的な判断は NVIDIA 社公式情報に基づいて行ってください。**

# オペレーティング・システム（OS）が起動しない

- Jetson Nano 開発者キット SD カード・イメージを書き込んだマイクロ SD カードがスロットに正しく挿入されているか確認しましょう。

- （緑色 LED が起動途中に消えるとき）マイクロ USB ポートから給電する場合、確実に 5V 2A を供給できる USB 電源かどうか確認しましょう。Jetson Nano のデフォルト電力モードは 10W モードに設定されています（コマンドラインから 5W モードに変更可能）。スマートフォン付属の USB 充電器は 1A 程度しか供給できないものが多いです。消費電力の大きな USB デバイスを接続しているとさらに電源への要求が高くなります。いろいろと USB デバイスを接続したい場合は J25 電源ジャックからの給電を選択することで対処できます。J25 電源ジャックに適合する AC アダプタは以下のとおりです。

[Jetson Nano Developer Kit User Guide](https://developer.nvidia.com/embedded/dlc/jetson-nano-dev-kit-user-guide) - Other Power Supply Options
> The J25 power jack is 9.5 mm deep, and accepts positive polarity plugs with 2.1 mm inner diameter and 5.5 mm outer diameter.

内径 2.1 mm 外径 5.5 mm のプラグが付いた AC アダプタは比較的入手しやすいはずです。J25 電源ジャックからは 4A まで供給できます。AC アダプタは電気用品安全法が定める特定電気用品に該当しますので PSE マークが表示されたものを選びましょう。

**J25 電源ジャックから給電するときは J48 ジャンパ・ヘッダにジャンパを取り付けます。**
J48 ジャンパ・ヘッダは J25 電源ジャックの後方にあります。

[Jetson Nano Developer Kit User Guide](https://developer.nvidia.com/embedded/dlc/jetson-nano-dev-kit-user-guide) - Carrier Board

> [J48] Enables either J28 Micro-USB connector or J25 power jack as power source for the developer kit. Without a jumper, the developer kit can be powered by J28 Micro-USB connector. With a jumper, no power is drawn from J28, and the developer kit can be powered via J25 power jack.

# プログラム実行中にシステムダウンする

- 電源が十分かどうか確認しましょう（上記参照）。

- アプリケーションが過大なメモリを要求していないか確認しましょう。OS のデフォルト状態ではスワップ領域が設定されていません。よって、システムとアプリケーション合わせて使用できるメモリは 4GB の実メモリに限定されます。スワップ領域を設定することは比較的低速なマイクロ SD カードへのアクセスを大きく増やすことになるので余程高速なマイクロ SD カードを使用しない限り実用的ではないと思います。

# 接続した Raspberry Pi カメラが動作しない

- カメラのバージョンを確認してください。Raspberry Pi Camera Module V2 は使えますが V1 には対応していません。

- GStreamer からアクセスしてみてください。GStreamer コマンドで Jetson Nano のマルチメディア機能にアクセスする方法は [Jetson Download Center](https://developer.nvidia.com/embedded/downloads) にアップされている **L4T Accelerated GStreamer User Guide** を参照してください。

# プログラムの実行が遅い

ファイル読み書きが極端に多いアプリケーションを実行していませんか？ファイルシステムを展開しているマイクロ SD カードは比較的低速な記憶デバイスです。

以上です。
Google Colabで画像を表示する

①OpenCVをimportします。

```python
!apt-get -qq install -y libsm6 libxext6 && pip install -q -U opencv-python
```

②画像をアップロードします。

```python
from google.colab import files
uploaded = files.upload()
```

実行するとアップロードできるようになります。

③画像処理して表示します。(今回は二値化)

```python
#-*- coding:utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 入力画像を読み込み
img = cv2.imread("20190404 002.JPG")

# グレースケール変換
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 二値化
retval, img_binary = cv2.threshold(img_gray, 180, 255, cv2.THRESH_BINARY)

# 結果を出力
plt.imshow(img_binary)
```

おわり！
「宇宙データなんてビジネスにならなくない？」の巻

※全てフィクションです
#会社にて
私「2019年度をどう生き抜くか。。。新しいアイディアが欲しいよぉぉぉ」
私「2018年に宇宙ビジネスがどうちゃらとか言ってたから、今年ぐらいなんとかビジネス生まれるかもな」

そんなこんなで、宇宙データを使ってみます

#ストレッチ目標
私「最初から難しいことしてもしゃぁないから、まずは簡単そうなのやってみよか」
スマホポチポチ　「0から　衛星」
私「お、よさそうやん？これやってみよ」
https://sorabatake.jp/531/

#やってみた
##ソフト"EISEI" を導入する
.NET Framework 2.0 を使うため、有効化
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/f31684b1-ddeb-ab8f-4730-0b2c28628c7c.png)

必要なファイルをダウンロードする
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/c39e7fea-5e60-acf5-12df-8a2a542a6d1a.png)

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/8ae8c21f-b9b2-978f-c160-f84995553a9b.png)


ソフトのダウンロード
※下の利用規約を確認してね、自己責任だよ
http://www.yac-j.com/hq/info/eisei_kiyaku171226.pdf

下をダウンロード
http://www.yac-j.com/hq/info/EISEI0_8_0.zip

解凍して、実行
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/e5742dda-f6cb-86cd-660f-aefc2a045a6f.png)

後は、デフォルト設定でインストールを実行
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/98cc659b-59f4-946f-02dd-3b238f9318f9.png)

![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/f22eb2cb-d559-100d-4e97-d4d39441ebe2.png)

![キャプチャ7.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/3cf611d5-2e6a-9ede-87aa-4a712c5ca123.png)
![キャプチャ8.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/db325c5e-3adb-1756-3924-088d42fe58de.png)
![キャプチャ9.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/a142fe7d-8df4-7874-2c9c-845ab34d55cc.png)
![キャプチャ10.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/fe7162a5-0da1-3c29-1518-4d57fc821dbf.png)

ソフトを起動する
![キャプチャ11.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/6184315d-61c0-238e-d3fd-cf4c0b3eb9bc.png)

![キャプチャ12.PNG](https://qiita-image-store.s3.amazonaws.com/0/184724/65abe6e5-f431-db6b-456f-2e95165e88a2.png)

上の画面が出たら完了
FWX120（ヤマハFW）＋Windows10でVPN接続

FWX120でVPN機能を有効にして、さらにWindows10クライアントから接続する際の設定についての備忘録。

##ルータ側の設定（FWX120）

管理画面にログイン。

#####トップ→詳細設定と情報
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/eb2e5ba5-d859-d6ed-7666-c3399acb9363.png)|
|:-:|

#####VPN接続の設定
VPN設定で追加

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/a0f26424-a4c3-f349-24ef-407593c5f20e.png)|
|:-:|

L2TP/IPsecを使用したリモートアクセスVPNサーバ（Anonymous）

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/57bf2933-1264-741d-cf6c-700b2a60c02e.png)|
|:-:|

接続ユーザとパスワードを設定

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/532abac4-c470-a3fe-1fc8-90d41aa3133d.png)|
|:-:|

VPN Anonymous 接続 共通設定の設定

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/51378f4a-e3e5-6919-5aa0-a9038a4c5b03.png)|
|:-:|

基本事項を以下のように設定する。IPアドレスを固定にするか、DHCPにするかは環境に合わせて。

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/f458a39a-2183-af7b-2c8e-ab330b98c36a.png)|
|:-:|

以上でFW側の設定は終わり。


##クライアント側の設定（Windows10）
設定→ネットワークとインターネット
VPNでVPN接続を追加する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/e772c740-d3b1-dcc3-6252-370315bc393e.png)

画面で以下に習い設定する。IPアドレスはFWのグローバルアドレス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/fda3f25f-dcaa-d98e-dc54-31bf152fe86b.png)

VPNの設定画面に戻り、「アダプターのオプションを変更する」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/1c6499c6-be6c-46e0-614b-86823cc7b8fb.png)

アダプタ一覧でVPNのアダプタ選択して右クリック→プロパティ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/b2c5a9f0-a0ca-850c-9cd9-2e7d170b9c87.png)

セキュリティタブで次のプロトコルを許可するで、上２つにチェック入れる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/bced84ea-15fc-14c3-2f27-1cf996d95545.png)

ネットワークタブでIPv6のチェックを外す。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83103/36081706-c8a0-9f44-3c97-9135f3c6bdce.png)

以上です。
VPN設定画面に戻って接続するとできる（ハズ）
CakePHP2でBakeでFixtureをディレクトリ分けする方法

#CakePHP2でBakeでFixtureをディレクトリ分けする方法
 BakeでFixtureを実行すると`app/Test/Fixture`に出力される。テストごとに分けたい場合にデフォルトではできないので、bakeを変更し、fixuteの指定を変更することで対応可能であった。

# Bakeでの出力のしかた

###ファイルのコピー
/lib/Cake/Console/Command/Task/FixtureTask.php
↓
/app/Console/Command/Task/FixtureTask.php


###以下のメソッドにオプションを追加しパラメータを追加する
-d で入力を受け付けるようになる

```
public function getOptionParser() {
		$parser = parent::getOptionParser();

		$parser->description(
			__d('cake_console', 'Generate fixtures for use with the test suite. You can use `bake fixture all` to bake all fixtures.')
		)->addArgument('name', array(
			'help' => __d('cake_console', 'Name of the fixture to bake. Can use Plugin.name to bake plugin fixtures.')
		))->addOption('count', array(
			'help' => __d('cake_console', 'When using generated data, the number of records to include in the fixture(s).'),
			'short' => 'n',
			'default' => 1
		))->addOption('connection', array(
			'help' => __d('cake_console', 'Which database configuration to use for baking.'),
			'short' => 'c',
			'default' => 'default'
		))->addOption('plugin', array(
			'help' => __d('cake_console', 'CamelCased name of the plugin to bake fixtures for.'),
			'short' => 'p'
		))->addOption('schema', array(
			'help' => __d('cake_console', 'Importing schema for fixtures rather than hardcoding it.'),
			'short' => 's',
			'boolean' => true
		))->addOption('theme', array(
			'short' => 't',
			'help' => __d('cake_console', 'Theme to use when baking code.')
		))->addOption('force', array(
			'short' => 'f',
			'help' => __d('cake_console', 'Force overwriting existing files without prompting.')
　　　　// 追加
		))->addOption('records', array(
			'help' => __d('cake_console', 'Used with --count and <name>/all commands to pull [n] records from the live tables, ' .
				'where [n] is either --count or the default of 10.'),
			'short' => 'r',
			'boolean' => true
		))->epilog(
			__d('cake_console', 'Omitting all arguments and options will enter into an interactive mode.')
		);

		return $parser;
	}


```


###オプション値を利用できるようにする
`public function getPath() {`

```
	public function getPath() {
		$path = $this->path;
		if (isset($this->plugin)) {
			$path = $this->_pluginPath($this->plugin) . 'Test' . DS . 'Fixture' . DS;
		}
                
     　　// 追加
		if(isset($this->params["dir"])){
			$path .=  $this->params["dir"]. DS;
		}

		return $path;
	}

```

##コマンドの実行
```cake.php bake fixture modelname -d Test01;```

以下にFixtureができる
`/app/Test/Fixture/Test01/ModelnameFixture.php`


#利用方法
```
class ModelnameControllerTest extends CakeFixtureManager{

	public $fixtures = array(
		'/Test01/modelname',
          )l
}
```
ターミナルをiTerm2からAlacrittyに乗り換えてみた

## やったこと
Macを使っていると自然とターミナルはiTermを使っていた。

しかし、最速をアピールした [Alacritty](https://github.com/jwilm/alacritty)なるものがあることを知り、試しにと導入してみた。
※ `A cross-platform, GPU-accelerated terminal emulator` とのこと。

導入した結果、速くて使いやすいのでこのまま使おうと思う。
※ [changelog](https://github.com/jwilm/alacritty/releases)より このときの最新の`Alacritty Version 0.3.0` を使いました。
※ [homebrewのこのときのバージョン](https://github.com/Homebrew/homebrew-cask/pull/61581)

### お手軽
`iTerm2` + `tmux` + `zsh` の環境なのだが、このiTerm2のところを変更するだけでほぼいけた。
よって
`Alacritty` + `tmux` + `zsh` の環境にすぐのりかえることができた。

### インストールの流れ
1. `brew cask install alacritty`
2. Alacritty を起動する
3. このとき、日本語表示対応のために `~/.bash_profile` に `export LANG=ja_JP.UTF-8` を追加しておく
4. デフォルトの設定でよいならこのままOK。これだけ。tmuxを使っている場合はそのまま起動もする

### 変更したこと
`$XDG_CONFIG_HOME/alacritty/alacritty.yml` を設定する。
メインの設定はここ。

#### フォントの変更
好きなフォントでよいと思います。

```yaml:$XDG_CONFIG_HOME/alacritty/alacritty.yml
# Font configuration (changes require restart)
font:
  # Normal (roman) font face
  normal:
    # Font family
    #
    # Default:
    #   - (macOS) Menlo
    #   - (Linux) monospace
    #   - (Windows) Consolas
    family: "Ricty Diminished"
```

※ このフォントは入手しないといけないタイプのフォントです。
他のboldやitalicも同様に変更。

#### 文字のサイズ
```yaml:$XDG_CONFIG_HOME/alacritty/alacritty.yml
  # Point size
  size: 14.0
```

これもお好み。

#### その他変更
あとは、historyやterminalのpaddingなど。
細かいところだと透過の設定。

```yaml:$XDG_CONFIG_HOME/alacritty/alacritty.yml
# Background opacity
#
# Window opacity as a floating point number from `0.0` to `1.0`.
# The value `0.0` is completely transparent and `1.0` is opaque.
background_opacity: 0.7
```


こんな感じですぐに使えるようになります。

## 参考
https://qiita.com/hisawa/items/5d0ee41be1f628811e6e
ABC117 C - Streamline(300点)

#問題概要
[問題へのリンク](https://atcoder.jp/contests/abc117/tasks/abc117_c)

数直線上に座標 $X_1,X_2,...,X_M$ の $M$ 個の地点がある。$N$個のこまを使って、以下の操作を行う。

**移動** : コマを $1$ つ選び、そのコマの座標を $x$ とする。そのコマを座標 $x+1$ もしくは座標 $x−1$ に移動する。

$M$個の地点を全て訪れるように移動する時、最小の移動回数を求めよ。

なお最初にコマを置いた座標はその時点で訪れたことにする。

#制約条件
- 入力はすべて整数である。
- $1≤N≤10^5$
- $1≤M≤10^5$
- $−10^5≤X_i≤10^5$
- $X_1,X_2,...,X_M$ は全て異なる。

#考えたこと
任意の二点間の差が移動距離となる。コマが複数個ある場合、当然移動距離が長い部分は移動したくない。

例えば入力例1だと移動距離は以下の図のようになる。
>入力例1
2 5
10 12 1 2 14

![image.png](https://qiita-image-store.s3.amazonaws.com/0/326440/d4d69668-65c2-ab8d-ebe2-772fb31bd992.png)

このときコマが二つあるので、移動距離が最も大きい2と10の間は移動するコマを変えることでショートカットできる。そうすれば移動回数は最小となる。

よって移動距離が長い二点間の移動は移動させるコマを変えることでショートカットする。
ショートカットできる回数はコマ数$-1$ つまり $N-1$ となる。

なので、二点間の差をとって配列につめていき、大きい数から$N-1$個消していけばよい。

「コマ数が地点の数より少ない」と「地点が一つしかない」ケースを想定すると少し実装がめんどうだが、そこまで難しくないのでわからなければ以下のコードを参考にしてほしい。

#解答
```c.cs
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args) {
        int[] s = Console.ReadLine().Split().Select(int.Parse).ToArray();
        List<int> x = Console.ReadLine().Split().Select(int.Parse).ToList();
        x.Add(x.Min());
        x.Sort();
        Console.WriteLine(solve(s[0], s[1], x));
    }
    static int solve(int n, int m, List<int> x) {
        int[] l = new int[m];
        for(int i = 0; i < m; i ++) {
            l[i] = Math.Abs(x[i+1]-x[i]);
        }
        Array.Sort(l);
        Array.Reverse(l);
        for(int i = 0; i < n-1; i ++) {
            l[i] = 0;
            if(i == m-1) break;
        }
        return l.Sum();
    }
}
```
.Hugo.Generator は廃止されるので hugo.Generator を使おう

![hugo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285675/f88e24ab-9701-78ea-d815-d15313df1f1f.jpeg)


[Hugo 0.55.0](https://gohugo.io/news/0.55.0-relnotes/) がリリースされましたが、`{{ .Hugo.Generator }}` に対して以下のように警告が表示されるようになりました。

```
$ hugo server
Building sites … WARN 2019/04/09 14:39:55 Page's .Hugo is deprecated and will be removed in a future release. Use the global hugo function.
```

将来的に `{{ .Hugo.Generator }}` は廃止が決まっているため、最新バージョンの Hugo を利用し続けるのであれば早めの対応をした方が良いです。

これは `.Hugo.Generator` に限った話ではなく、これまで [Hugo-specific Variables](https://gohugo.io/variables/hugo/) は `.Hugo.` で始まる値でしたが、今後は関数 `hugo.` で参照するようになります。

この警告を解消するためには `{{ .Hugo.Generator }}` を `{{ hugo.Generator }}` に書き換えます。

```diff
- {{ .Hugo.Generator }} <!-- 廃止予定 -->
+ {{ hugo.Generator }}  <!-- ok -->
```

これで次が警告無しに生成されるようになります。

```html
<meta name="generator" content="Hugo 0.55.0" />
```

- [Page's .Hugo is deprecated as of 0.55.0 - support - Hugo Discussion](https://discourse.gohugo.io/t/pages-hugo-is-deprecated-as-of-0-55-0/17991)
discordでBOT作成！

皆さんゲームしてますか！？

僕はソシャゲでディスコ導入して楽しんでます。


discord側の設定はググるとたくさん出てきますのでそちらをご参考に...

今回使うgemはこちら
[discordrb](https://github.com/meew0/discordrb)

使い方は本当に簡単です。

```ruby
require 'discordrb'

bot = Discordrb::Commands::CommandBot.new(
  token: 'token',
  client_id: 'client_id',
  prefix: '!'
)

bot.command :grbl do |event|
  event.send_message('ビィくん')
end
```

ディスコで `!grbl` って発信すると `ビィくん` って返してくれます。


発信者の名前を取得するには

```ruby
bot.command :name do |event|
  event.send_message("あなたの名前は#{event.user.name}ですね")
end
```
こんな感じで取れます。

楽しいディスコライフをお過ごしください！

次は定期的にポストする機能でも書こうと思います〜
Gitを使ってみよう！

Gitはバージョン管理システムです。

ただ、初めての方は、「？」だと思います。


#Gitを利用するメリット
例えば、以下のようなファイルがあるとします。

```HTML:new.html.erb

<h1>New Task1</h1>

```

それをこのように変更します。

```HTML:new.html.erb

<h1>New Task１</h1>
<h2>New Task2</h2>

```

この変更を元に戻すなら、ただ変更箇所を消すだけで良いです。
ちなみに変更前→ファイル①、変更後→ファイル②としますね。

それでは、ファイル①とファイル②の間に、尋常ではない量の変更点や、後戻りのできない変更点があった場合はどうしましょう？
プログラミングでは、そういったことが起きる可能性が割と高いです。
そこで、活躍するのが「Git」です。


#Gitのインデックス登録、コミット
Gitが小説だとしたら、書かれる物語はインデックス登録しなければ誰にも読まれることはありません。
さらに言うと、インデックス登録するということは、章や節に分けることと同義です。


よく付箋などで書類を色分けしますよね。
これは◯◯、これは●●、...という具合に。
つまり、インデックス作業は付箋を貼る行為、コミットというのはその付箋に名前をつける行為なのです。


###インデックス登録

```Ruby:terminal

git add ファイル名

```


###コミット

```Ruby:terminal

git commit -m "付箋に付ける名前（日本語でOK）"

```


#もしも、コミットを修正したくなったら...
Gitには様々なコマンドがあります。
例えば、たった今、ファイルを変更したとします。
ついでに付箋も貼ったし、付箋に名前も書きました。


ただ、そこまでやって、その修正が必要でないことが判明します。
しかし、慌てないでください。
すぐに修正が可能です。


ファイル①とファイル②を例にしますね。


ファイル②の状態で、慌てずに以下のコマンドをターミナルで打ちましょう。


```Ruby:terminal

git reset --hard HEAD^

```

これで、付箋に書いた名前はもちろん、付箋を貼ったこと、さらにファイルを修正した事実まで消し去り、ファイル①に戻すことができます。


ただし、次のインデックスを行ってしまうと効きませんのでご注意ください。


また、逆を言うと、Gitの世界ではその世界のルールに応じたコマンドを打たなければ、あなたの思ったように動いてはくれません。


どんどんGitでバージョン管理をして、慣れていきましょう。


次回は、コンフリクトについてです。
SSMのススメ〜運用自動化への一歩〜

# 1.はじめに
みなさん、運用業務の自動化は進んでいますか？
クラウドが一般的になってきてから運用の自動化がすごい勢いで進んできていますね。
先日私も運用自動化するために色々と試行錯誤をしているところ、「AWS Systems Manager(以下SSMと呼ぶ)」に出会いました。
AWSを使っている方へおすすめしたいので、今回はSSMについて書いていきます。

#2.SSMとは？
SSMとは、オンプレ環境にも適応可能なインフラ管理ツールです。
AWS公式ドキュメントでは、SSMを以下のように紹介しています。

>"AWS Systems Manager は、Amazon EC2 インスタンス、オンプレミスサーバーと仮想マシンや他の AWS リソースを大規模に設定および管理する機能のコレクションです。Systems Manager には、AWS リソース間で運用データを簡単に一元化し、タスクを自動化できる統一されたインターフェイスが含まれています。Systems Manager はインフラストラクチャで運用上の問題を検出して解決するための時間を短縮します。Systems Manager は、インフラストラクチャのパフォーマンスと設定についての詳細を提供し、リソースとアプリケーションの管理を簡素化することで大規模なインフラストラクチャの運用と管理を簡単にします。"
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/what-is-systems-manager.html

つまり、「運用タスクの自動化用サービス」ということです！さらに、料金も安い。
オンプレ環境と非AWSパッケージの管理、[SSM Automation](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-automation.html)の使用に料金がかかります。
システム規模にもよりますが、スモールスタートで導入していく場合、大体無料枠内で収まります。
https://aws.amazon.com/jp/systems-manager/pricing/

使用するためにエージェントを入れたりなんなりありますが、使用条件は以下の公式ドキュメントをご参照ください。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-setting-up.html

#3.SSMの使用例
じゃあSSMってどんなことに使うのがいいの？という視点で使用例を書いてみます。

####▪️バックアップの取得(AMIの取得)
私がSSMに最も注目した理由はこれです。
[lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html)で実行するのと何が違うの？って思う方もいるかもしれません。


一般的にAMIの取得は、インスタンスを停止させて行うことが推奨されています。
この推奨の通りにlambdaを使用すると
"インスタンスの停止→AMIの取得開始"
までは容易にできますが、
"AMI取得完了→インスタンスの起動"
の実行をするために諸々と考えなければならなくなります。
しかし、SSMなら
"インスタンスの停止→AMIの取得開始→AMI取得完了→インスタンスの起動"
が簡単に自動化できます。

![pasted image 0.jpeg](https://qiita-image-store.s3.amazonaws.com/0/329544/237cf716-1b17-cea8-ed88-2bbd340f0a19.jpeg)
図3.1.バックアップ自動化イメージ

####▪️パッチ適用の自動化
意外と時間を取られるパッチの適用作業ですが、SSMでは、[Patch Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-patch.html)というものや、Windows Update をAutomationで実行できる"AWS-InstallWindowsUpdates"というものが用意されていたりします。"自動化してね"と言わんばかりのサービスです。

私の場合は、管理系サーバに対して、先ほどのバックアップ取得と"AWS-InstallWindowsUpdates"を掛け合わせて、以下フローの自動実行を実現しています。
"インスタンス停止→バックアップを取得→インスタンス起動→Windows Update→インスタンス停止→バックアップを取得→インスタンス起動"

![pasted image 0-2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/329544/52b92eb7-eab6-0491-04a0-9551b3662c46.jpeg)
図3.2.バックアップ自動化＋Windows Update自動化イメージ

設定方法については、以下をご参照ください。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-setting-up.html

#4.まとめ
使用例を交えながらSSMについての紹介をしました。
サービスを一番支えているのが運用であり、最も時間を割くのも運用だと思います。
その運用を少しでも自動化させることによって、運用担当者の負荷を下げ、創造的なタスクができるようになっていけばいいなと勝手に目論んでいます。
運用自動化の波に乗るためにも、是非SSM使ってみてください（まとめ方がSSMの回し者みたいw）。
【LINEBOT】友達追加時にユーザIDをファイルに保存する【php】


LINEBOTを作って、APIで通知を送ったりする際にユーザIDが必要になるが、こちらからチャンネルID等をキーにフォロワーのユーザIDを取得するAPIは用意してくれていないもよう… 

というわけで、webhookでfollowイベント発生時にファイルにユーザIDを追加、unfollowイベント時に削除するサンプルプログラムです。サンプルなのでファイルの排他制御や保存場所のセキュリティとか適当です。


LINE Developerで登録したコールバックURLのエンドポイントがcallback.phpの場合

```callback.php

// LINEからのコールバックデータ取得
$json_string = file_get_contents('php://input');
$json_obj = json_decode($json_string);

// webhookイベントタイプ
$type = $json_obj->events[0]->type;
// ユーザID
$user_id = $json_obj->events[0]->source->userId . "\n";

if ($type == 'follow') {
        // ユーザIDをuser.lstに保存
        file_put_contents("user.lst",$user_id,FILE_APPEND);
} else if ($type == 'unfollow') {
        $buf = "";
        $users = file('user.lst');

        foreach($users as $user) {
                if ($user != $user_id) {
                        $buf .= $user;
                }
        }
        // user.lst.wkに保存
        file_put_contents('user.lst.wk',$buf);
        // user.lst.wk を user.lst にリネーム
        exec('mv -f user.lst.wk user.lst');
} else {
        // noop        
}
```

補足
followイベント時はLINEからこんな情報がバックされます。(eventsという名前のセット)

```json
// object->events[0]

{
      "replyToken": "ae93388a182e4f9faa28ff26377bf3f6",
      "type": "follow", 
      "timestamp": 1554793525328,
      "source": {
        "type": "user",
        "userId": "Uxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
```
Linuxコマンド

#ターミナル操作で使用するLinuxコマンド
##はじめに
サーバーサイド言語を扱う上で必須の知識になってくるLinuxコマンドです。
まずは、Macでターミナルを起動しましょう。
##入力したコマンドを遡る

```
↑ キー
```
##ディレクトリを移動する
移動する
cd

```
$ cd desktop
```
ディレクトリを一階層戻る
cd ..

```
$ cd ..
```
ホームディレクトリに戻る ※cdのみでも可

```
$ cd ~
```
##新規ディレクトリを作成する
mkdir

```
$ mkdir sample
```
##新規ファイルを作成する
touch

```
$ touch index.html
```
##現在いるディレクトリのファイルを表示する
ls

```
$ ls
```
##操作対象になっているディレクトリの位置を表示する

```
$ pwd
```
##Atomエディタを開く
```
$ atom .
```
ボックスを横に並べる

今回は、図のような変化を目指す。
###before
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/380575/45bdc581-d9d3-34af-a061-939c15881fe3.png)
###after
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/380575/4ceab750-95e6-b3b6-e2cd-e65e97d15762.png)

###与えられたコード
###html
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/380575/bd66a9c9-b0f7-ab70-514c-0ebb683d7fcd.png)
###css
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/380575/0881e9fd-7ede-f9aa-bdac-2c93d329b366.png)


#パターンA
##step1
box1,2のfloatにleftを指定。
すると、問題発生。回り込みが起きる。原因は、「フローティングボックス」という特殊なボックスになり、他のボックスからは浮いた存在になる（変なやつ）。
##step2
box1,2をboxAにグループ化（結成）。
##step3
boxA::afterに
・content: ""; 
（boxA直後になにか入れる）  を指定。
文字を入れるとわかるが、まだ横並びになる。原因は、displayはinlineだし、floatでleftになってるしで。
##step4
boxA::afterに
・display: block;
・clear  :  both;　を指定。
（clearとは、floatプロパティで左寄せ、 または右寄せを指定された要素に対する回り込みを解除する際に使用します。）

すると、完成！

###コード
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/380575/2dce50ff-aa85-0d3d-2343-858b2fce1967.png)


#パターンB
##step1
box1,2のfloatにleft指定。
##step2
box1,2をboxAにグループ化。
##step3
boxAに
・overflow: hidden; 　　　　を指定。
このボックスは、CSSのBlock formatting contextになり、ボックス内にフローティングボックスを収めて表示するきまりになっている。
⚠注意：ボックスからはみ出した子要素は、隠れる。
###コード
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/380575/00f64d62-da48-13c2-0c63-5ea1b1ea9f87.png)
rails テーブル削除する

# テーブル削除する

change_attendancesというテーブルを削除する

まずモデル削除

```
$ rails destroy model 削除するモデル名
```

テーブル削除のためのマイグレーションファイル作成

```
rails g migration ファイル名（仮にDropTableChangeAttendancesとする)
```

マイグレーションファイルのchangeメソッド内に以下を記述。

```
drop_table 削除するテーブル名（:change_attendancesとする)
```

その後

```
rails db:migrate
```

で削除完了。

https://qiita.com/Kuragasaki/items/7d98cf29341611fb189a

redoしようとすると、存在しないテーブルをrollbackしようとするためエラーになる。

以下の記事を参考にすると対処出来そうです。

https://qiita.com/YumaInaura/items/05949d99b42516716685
【mod_rewrite】httpsとhttpd.confと.htaccessでハマった話

今まで無料のドメインを使っていたのですが、あることを契機に有料ドメインに変更するにあたって、ハマった話とその解決方法についてお話します。

# mod_rewriteとは
mod_rewriteとは、Apache上で利用できる機能の1つです。
一言で言えば、リダイレクト機能になります。

htmlやJavaScriptでもリダイレクト機能は実装することができますが、一般的かつGoogleにも推奨されている方法がWebサーバによるリダイレクトです。mod_rewriteはサーバによるリダイレクト手法のうちの1つになります。
― [【unitopi】Webページをリダイレクトする3つの方法とベストプラクティス](http://unitopi.com/web-redirect/)

よくあるのは強制https化だったり、URLの正規化（www有無など）だったりします。
かくいう私も強制https化でmod_rewriteを使っています。

しかし、同じ要領でドメインの変更も大したことないだろうと思っていたら、痛い目を見ました。



# httpd.confと.htaccessの罠
基本的にmod_writeを記述するのは`httpd.conf`または`.htaccess`のどちらかになります。
人によってはmod_write.confを作成したりする例もあるみたいです。

`httpd.conf`と`.htaccess`の違いはRewriteが行われる順番と処理速度です。
簡単にいうと、`httpd.conf`でRewriteされたあと、`.htaccess`でRewriteが行われます。

また、それぞれのRewiteの処理速度を比較すると、`httpd.conf` > `.htaccess`
となり、`httpd.conf`の方が早いです。
理由は`.htaccess`が再度リクエストをサーバに投げるからなのですが、詳しくはこちらを見てください。
― [【ブログ】「.htaccess」と「httpd.conf」での設定による違い](http://ysklog.net/mod-rewrite/related05.html)

私の場合、この関係を理解していなかった上に、`.htaccess`ファイルにmod_writeを記述していたのを忘れていて、`httpd.conf`を見ながら小一時間唸っていました。

やっぱり、**備忘録は必要**なんだなぁ、と実感

# httpsの罠
タイトルどおり、https周りでつまづきました。

## 失敗例
まず、失敗した`httpd.conf`を載せます。

```title:httpd.conf
<IfModule mod_rewrite.c>
RewriteEngine On

# (1) sample.tk -> sample.com:443
RewriteCond %{HTTP_HOST} ^sample.tk
RewriteRule ^(.*)$ https://sample.com%{REQUEST_URI} [R=301,L]

# (2) *:80 -> *:443
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

</IfModule>
```

ドメインを`tk`から`com`に変えるための`RewriteRule`と、
強制的にhttpsにアクセスさせるための`RewriteRuleの2つがあります。

(1)で、ホスト名が旧ドメインだった場合は新ドメインのhttpsにアクセスします。
(2)で、ドメインが新旧に関わらず、httpでのリクエストはすべてhttpsにリダイレクトします。

上手くいきそうに見えます。
しかし、実際にアクセスしてみると…
http\://sample.tk -> **https**\://sample.com （成功）
**https**\://sample.tk -> **https**\://sample.tk （失敗）
http\://sample.com -> **https**\://sample.com （成功）

なぜか、httpsのときだけ、リダイレクトされない？？

## 原因と対処法
原因はずばり、`httpd.conf`にあります。
`httpd.conf`の上の方、40行目あたりに気になる記述があります。

```title:httpd.conf
...
Listen 80
...
```
はい、もうお分かりですね。
`httpd.conf`は基本的に80ポート、つまりhttp通信にしか適用されません（そりゃそうだ）。

つまり、`httpd.conf`にいくらhttpsに関する記述をしたところで意味がないわけです。
というわけで、別ファイルにRewrite内容を書きましょう。

```title:rewrite.conf
<VirtualHost *:443>
  ServerName tkl-craft.tk:443
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^tkl-craft.tk
  RewriteRule ^(.*)$ https://tkl-craft.com%{REQUEST_URI} [R=301,L]
</VirtualHost>
```
VirtualHostについては省略します。
内容は失敗例の`httpd.conf`で書いたものと全く同じです。
ホスト名が旧ドメインだったら新ドメインにRewriteするというものです。

これでようやく、httpsに対してもRewriteを行うことができました。


# 参考リンク
- [【unitopi】Webページをリダイレクトする3つの方法とベストプラクティス](http://unitopi.com/web-redirect/)
- [【ブログ】「.htaccess」と「httpd.conf」での設定による違い](http://ysklog.net/mod-rewrite/related05.html)
- [【Qiita】Apacheでhttpをhttpsに強制リダイレクト](https://qiita.com/yoshizaki_kkgk/items/123e766229fd3910530e)
- [【WEB ARCH LABO】Apache RewriteCond の基礎知識](https://weblabo.oscasierra.net/apache-rewritecond-base/)
いまさらWorkManager〜概要編〜

# はじめに
Android Jetpackで追加されたWorkManagerを学習してみます。
今更感がありますが、改めて確認してみると、かなり便利な機能です。
似たような機能として[JobScheduler](https://developer.android.com/reference/android/app/job/JobScheduler)もあります。JobSchedulerについてはこちらの[記事](https://qiita.com/naoi/items/f1d00a79196d3d2d3a81)を確認してください。
[公式サイト](https://developer.android.com/topic/libraries/architecture/workmanager)を見ながら必要となる技術を説明していきます。下記の表は記事を掲載するたびに更新していきます。


|タイトル| 内容|リンク|
|---|---|----|
|いまさらWorkManager〜基本編①（必要最小限で実装：１回のみの実行）〜|一度だけのバックグラウンド処理の実装方法|https://qiita.com/naoi/items/283f522d3f49c998d36d|
|いまさらWorkManager〜基本編②（処理の起動条件を設定する）〜|実行条件の実装方法|https://qiita.com/naoi/items/e27c7b70c6401ce2c39c|
|いまさらWorkManager〜基本編③（繰り返し処理を実行する）〜|定期的に処理を実行する設定方法|https://qiita.com/naoi/items/5ca4ee0b4b8520649365|
|いまさらWorkManager〜基本編④（状態の確認とキャンセル）〜|WorkManagerに登録されているWorkの取得やWorkの状態、キャンセル方法|https://qiita.com/naoi/items/59775846b8a3702c52a1|
|いまさらWorkManager〜基本編⑤（Workerクラスにデータを渡す）〜|Workerに任意のデータをを渡したいときのやり方|https://qiita.com/naoi/items/74411259815aabfdaaf8|
|いまさらWorkManager〜基本編⑥（唯一無二のWorker）〜|Workerをユ一意に、１つしかない状態にする方法|https://qiita.com/naoi/items/df1ea9bd89239ce041f5|

上記の記事で「いまさらWorkManager」を説明していきます。

# WorkManagerの概要
WokrManagerは以下の状況下で、定期的に非同期的なタスクをスケジュールできます。

* アプリが終了している
* デバイスが再起動した

図で表すとこのようになります。

![概要図.png](https://qiita-image-store.s3.amazonaws.com/0/99960/f493d150-7b78-c258-3562-83fef7587e9c.png)


## WorkManagerが提供している機能
WorkManagerは以下の機能を提供しています。

* APIレベル14以降の下位互換とAPIレベル23以降の互換
    * APIレベル23以降では[JobScheduler](https://qiita.com/naoi/items/f1d00a79196d3d2d3a81)が同等の機能を提供しています。
    * APIレベル14〜22までは、BroadcastReceiver と AlarmManagerの組み合わせで同等の機能を提供しています。
* ネットワークやバッテリーといった端末の状態に併せて、スケジューリングしたタスクの実行の要否を判断できます。
* 1回限りの非同期タスクを設定できます。
* スケジューリングしたタスクのモニタリングや制御をできます。
* タスクをチェーンできます。
* アプリやデバイスが再起動してもスケジューリングしたタスクは実行されることが保証されています。

## 使い所
公式では以下のようなケースを想定しているようです。

* 定期的にサーバへ接続する
* ログまたは分析結果をバックエンドサービスに送信する

## 使っていは行けないケース
公式では以下のようなケースは使うべきでないと言っています。

* アプリ終了時の終了処理
* 即時実行が必要なタスク

# まとめ
古い端末や新しい端末まで幅広く対応している事がわかります。
特に、「BroadcastReceiver と AlarmManager」の組み合わせは懐かしさすら感じさせます。
だからといって、JobSchedulerにしてしまうと、APIレベル23以降が対象になってしまうといった悩みも解消してくれるようです。
昨今の端末に対応するにはWorkManagerが有効そうですね。
次回の記事では、実際の使い方について説明していきます。
適当にVagrant上にDjangoの環境を作る

Djangoの環境作るのにめちゃくちゃ迷走してたからメモ

#環境とか
hostOS：Windows10
gestOS：ubuntu

Vagrant
python3.7
Django2.2

#VMを作っていく
[Vagrant](https://www.vagrantup.com/downloads.html)をDLして実行おく。(もとから入ってたから入れ方わからぬ)
[VirtualBox](https://www.virtualbox.org/wiki/Downloads)をDLして実行。(これも入ってたからわからぬ)
それと[Box](https://app.vagrantup.com/boxes/search)も公式から探す。(今回はubuntu/trusty64を使う)

とりあえずC:\HashiCorp\Vagrantに新しくDjangoフォルダを作成(名前は何でもいい)

この後のやつで権限エラーっぽいのが出てたんで、vagrantフォルダのプロパティの「セキュリティ」タブからsystemのアクセス権限を全部許可する。


```ruby:コマンドプロンプト
cd \HashiCorp\Vagrant\Django
vagrant box add ubuntu/trusty64 https://app.vagrantup.com/ubuntu/boxes/trusty64
vagrant init ubuntu/trusty64
```
アクセス権限変えないとここでエラー出るかも。
古いVirtualBox使ってるとエラーが出るかも。(後輩は出てた)
これが通ったら、Djangoフォルダにvagrantfileが出来てる。

#仮想環境とのファイル共有とかポート設定とか
vagrantfileに下記を追加しておく。(追記場所は適当。end後とか最初以外ならいいのかな)

```ruby:vagrantfile
config.vm.synced_folder "C:/Users/admin/Documents/work", "/home/vagrant/work" 
config.vm.synced_folder ".", "/vagrant",disabled: true 
config.vm.network "forwarded_port", guest: 8000, host: 8000 
config.vm.synced_folder ".", "/vagrant", type:nil
```
#Vagrantの起動とか

ちなみにこっから先はPyCharmのterminal使ったけどプロンプトでもできるんじゃないかな。

```ruby:コマンドプロンプト
vagrant up
```
これで起動する。

```ruby:コマンドプロンプト
vagrant ssh
```
これで中に入る。

ちなみに

```ruby:コマンドプロンプト
vagrant halt
```
これで終了できる。

#Djangoの設定していく
まずanacondaを入れていく。

```ruby:コマンドプロンプト
sudo wget https://repo.continuum.io/archive/Anaconda3-2018.12-Linux-x86_64.sh 
sudo bash Anaconda3-2018.12-Linux-x86_64.sh
```

次にDjango用にpythonをDLする。(自分の環境だとpathが通らないのでフルパスでごり押し)

```ruby:コマンドプロンプト
source /home/vagrant/anaconda3/etc/profile.d/conda.sh 
conda create -n django python=3.7
```

そんでもってDjangoをインスコする。

```ruby:コマンドプロンプト
source /home/vagrant/anaconda3/bin/activate django 
sudo pip install django
```

ここまで終わったら実行確認。
`source /home/vagrant/anaconda3/bin/activate django `はDjango環境に入っているならいらないよ。

```ruby:コマンドプロンプト
source /home/vagrant/anaconda3/bin/activate django 
django-admin startproject mysite
cd mysite
python manage.py migrate
python manage.py runserver 0:8000
```
そしたら[localhost:8000](localhost:8000)にロケットの画面が出るはず。

#迷走した道
解決できてないけどいつかできることを祈って覚えてる限り羅列してみる。

python3.4でしか動かない…
>pipがダウンロードできない(opensslエラーだったかな)
>どうやらopensslのversionが低いのが問題ぽい？
>最新版をDLするもふるいversionが居座る
>アンインスコしようとするもprotectエラー(保護されてるっぽい)ここで断念

pathが通ってないっぽいし.bashrcをいじるかぁ→エラー
>EOFの形式がwinに引っ張られてエラー？
>どうやら.bash_profileないぽい？

環境動いたけどファイル共有できてない…
>VertualBoxのファイル共有機能使えば行けるんじゃね→だめー
>ファイルパス絶対にしたら…だめぇ？→だめ。

#まとめ
まあ動いたからよかったけどなんで動かなかったのかさっぱりだよ。。。
[Ubuntu]CUDAを入れたら画面が真っ黒になった話

#備忘録
CUDAを入れた時にどうやらnvidiaのドライバーが上書きされたらしく，そのせいでGUIがおじゃんになって画面が真っ黒になりました．その解決法があまり乗っていなかったので自分の備忘録も兼ねてここにのっけていきたいと思います．

##1.再起動する

ともかくまず，再起動です．

##2.選択
そうすると，

```
・ubuntu
・Advanced options for ubuntu
```
などと書いてあると思います．
そこで迷わず"Advanced options for ubuntu"を選択して，

```
・Ubuntu, with Linux 4.4.0-142-generic
・Ubuntu, with Linux 4.4.0-142-generic (recovery mode)
```
の画面に行き，複数ある場合は一番上の(recovery mode)にカーソルを合わせて"e"を押します．

##3.書き換え
そうすると，画面が切り替わるので，そこの"linux"と書いてある行で"ro"の文字があるのですが，それを"rw"に書き換えます．改行の関係で"r\o"みたいに見えていることもあるので，そこは適宜対応してください．

終わったら"F10キー"を押して，新しい画面に行くので，そこの"root"というところを選択します．

##4.パージ
すると，rootのCUIがきどうするので以下のコマンドでドライバーとCUDAをパージしましょう．

```
$ sudo apt-get --purge remove nvidia-*
$ sudo apt-get --purge remove cuda-*
```

```
exit
```
コマンドで抜けて方向右キーでOKをしたら，おそらく真っ黒な画面があら不思議！起動できるはずです．

そのあとは以下のサイトを参考に適切なドライバーを入れましょう．
https://qiita.com/hnw/items/fd84602b110a395091f4

それではお疲れ様でした！



###参考サイト
https://qiita.com/proton_lattice/items/82abbd7b9c31df6570f6



###P.S.
機械学習，自動運転などをメインに（たまにそれ以外も）発信しているのでぜひ [twitterのフォロー](https://twitter.com/ryosanworld)おねがいします．
Windowsでjupyter notebookする

## 背景

TAとして研究室のB4の課題を手伝う事になったが, 課題に取り組む前の環境構築につまずいてしまって課題どころじゃなくなる...みたいな状況を避ける為に, Windowsで`jupyter notebook`するところまでを手伝ってあげた.

## 内容

### Pythonをインストール

まず, [Python](https://www.python.org/downloads/)をインストールしてもらう.

いろいろな設定をするように言われるが, すべてデフォルトの設定にする. これは, あとでPythonの設定を変更するときに, どんな設定にしたかを忘れないようにするために有効である. 

#### 注意点

- Pathを通すことを忘れないように. 忘れていた場合, もう一度インストーラーを起動して設定を変更できる. 
- adminの実行権限が必要である. これは, Pythonがwindowsのシステムに関わる部分を触るためだとおもわれる.

これは, Pythonのコマンドを`python`と打つだけで実行できるようにショートカットを作るイメージである. `cd`だったり, `ls`のコマンドはデフォルトで実行できるようになっているが, `python`は設定しなければいけない.

### git bashをインストール

次に, [git bash](https://gitforwindows.org/)をインストールしてもらう. 


本来, windowsのコマンドプロンプトを使ってもいろいろ実行できるのだが, linuxのコマンドの方が圧倒的に使用者が多いので, Linuxコマンドをwindows上で使えるようにする.

#### 注意点

git bashの起動と同時にPathの情報が読み込まれる. Pathの設定を変更したならば, git bashを再起動する必要がある.

### jupyter notebookをインストール

git bash上で以下のコマンドを実行する. `command not found`となればPathが通っていない可能性が高い.

```sh:jupyterのインストール
pip install -U pip
pip install jupyter
```

#### 余談

このコマンドでPythonのいろんなパッケージをインストールできる.

#### jupyter notebookを実行する

以下のコマンド実行する. カレントディレクトリ以下に`.ipynb`のファイルがあることを確認する.

```sh
jupyter notebook
```
これで, ブラウザ上で`.ipynb`ファイルをいじることができる.

## まとめ

pathで詰まっただけで1時間弱くらいで4人とも実行することができた.
Ruby on rails を使ってCRUDを実装するまで(記事作成、詳細表示、編集、削除)

<a href = "https://qiita.com/tnatsume00/items/27b851fc1c90ec179f48">Ruby on rails を使ってCRUDを実装するまで(プロジェクト作成~一覧表示)</a>の続き

#前回までのおさらい
新規プロジェクトを作成
ページの表示

今回の範囲
scaffoldを使用する
ページの表示



##今回作るWebアプリケーションの足場を作る

今回作るMemoの足場を作る
Railsには足場を作るためのScaffoldという仕組みが用意されているのでこれを利用します。

```
$cd blog
$rails g scaffold Memo title:string body:text
```

以下が出力されればOKです。

```
Running via Spring preloader in process 13466
      invoke  active_record
      create    db/migrate/20190409064133_create_memos.rb
      create    app/models/memo.rb
      invoke    test_unit
      create      test/models/memo_test.rb
      create      test/fixtures/memos.yml
      invoke  resource_route
       route    resources :memos
      invoke  scaffold_controller
      create    app/controllers/memos_controller.rb
      invoke    erb
      create      app/views/memos
      create      app/views/memos/index.html.erb
      create      app/views/memos/edit.html.erb
      create      app/views/memos/show.html.erb
      create      app/views/memos/new.html.erb
      create      app/views/memos/_form.html.erb
      invoke    test_unit
      create      test/controllers/memos_controller_test.rb
      create      test/system/memos_test.rb
      invoke    helper
      create      app/helpers/memos_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/memos/index.json.jbuilder
      create      app/views/memos/show.json.jbuilder
      create      app/views/memos/_memo.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/memos.coffee
      invoke    scss
      create      app/assets/stylesheets/memos.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss
```

これでmigrationファイル

```db/migrate/YYYYMMDDHHMMSS_create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.string :title
      t.text :body

      t.timestamps
    end
  end
end
```

も作成されたので、

```
$rails db:migrate
```

以下のように出力されればOKです。

```
== 20190409064133 CreateMemos: migrating ======================================
-- create_table(:memos)
   -> 0.0015s
== 20190409064133 CreateMemos: migrated (0.0016s) =============================

```
これでアプリケーションを作成するための土台ができたので確認します
<a href="http://localhost:3000/memos">http://localhost:3000/memos</a>
にアクセスすると
![スクリーンショット 2019-04-09 15.46.48.png](https://qiita-image-store.s3.amazonaws.com/0/343721/bb3a4a20-1a83-225c-d162-dddfe8a37545.png)
このような画面が表示されていればOKです。

もう、この時点でWebアプリケーションとしては完成になります。
#python で  英語月表記・タイムゾーン尽きの日付文字列を parse して datetime オブジェクトに変換し、さらに unixtimestamp に変換する例 ( UTC VS JST )

- 特定のフォーマットで文字列を与えて datetime オブジェクトに変換する
- datetime オブジェクトから unixtimestamp に変換する

# UTC

UTC の場合

```py
from datetime import datetime

datetime_str_utc = 'Mon Apr 08 05:00:25 +0000 2019'

datetime_obj_utc = datetime.strptime(datetime_str_utc,'%a %b %d %H:%M:%S %z %Y')
# datetime.datetime(2019, 4, 8, 5, 0, 25, tzinfo=datetime.timezone.utc)

timestamp_utc = datetime.timestamp(datetime_obj_utc)
# 1554699625.0
```

# JST ( Localtime )

同じ時刻を JST 基準で与えると、UTC的にはそれよりも9時間前なので、timestamp は9時間分 ( 60*60*9 = 32400秒 ) 小さくなる

```py
from datetime import datetime

datetime_str_jst = 'Mon Apr 08 05:00:25 +0900 2019'

datetime_obj_jst = datetime.strptime(datetime_str_jst,'%a %b %d %H:%M:%S %z %Y')
# datetime.datetime(2019, 4, 8, 5, 0, 25, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400)))

timestamp_jst = datetime.timestamp(datetime_obj_jst)
# 1554667225.0
```

# Compair

- 同じ時刻表記に対して、UTC基準で算出した timestamp の方が 9時間進んでいる
- よってUTC基準のtimestmapからJST基準のtimestmapを差し引くと `60*60*9 = 32400秒` の違いが出る

```py
timestamp_utc - timestamp_jst
# 32400.0
```

# ちなみに

タイムゾーンを考える時は何百回だって頭がパズルになります

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->