OmniAICreator/Qiita-1.07M huggingface dataset:
Go言語紹介

この記事は社内にてGo言語のプレゼンを行うために作成した資料です。

ちなみに、自分はUDPで通信するデバイスのエミュレーションをするのにGo言語を使っていました。

# Go言語とは？

[The Go Programming Language](https://golang.org/)

- Googleによって開発されている
- Go、Go言語、golangなどと呼ばれる
- 発表されたのは2009年であり、かなり"若い"言語である
- マスコットはGopher君

# Go言語のすごいところ

- 静的型付け
- コンパイル速度が速い

## 生産性が高くシンプルな文法

```go
package main

import "fmt"

func main() {
    var m string = "Hello, world"
    fmt.Println(m)
}
```

- セミコロンなし
- 型は後置
- 多値返却できる
- 型推論
  - 上記の`var m string = "Hello, world"`は`m := "Hello, world"`とも書ける

## 標準のパッケージや言語仕様による機能が便利

- HTTP、TCP、UDP、正規表現等を扱うパッケージが標準で用意されている
  - [Packages - The Go Programming Language](https://golang.org/pkg/)
- goルーチンと呼ばれる軽量スレッド実行機能により並行処理が簡単に行える

```go
package main

import (
    "fmt"
    "time"
)

func readword(ch chan string) {
    fmt.Println("Type a word, then hit Enter.")
    var word string
    fmt.Scanf("%s", &word)
    ch <- word
}

func timeout(t chan bool) {
    time.Sleep(5 * time.Second)
    t <- true
}

func main() {
    t := make(chan bool)
    go timeout(t)

    ch := make(chan string)
    go readword(ch)

    select {
    case word := <-ch:
        fmt.Println("Received", word)
    case <-t:
        fmt.Println("Timeout.")
    }
}
```

- `go`をつけて実行された関数は非同期で実行され、結果は`channel`を介して受け取る
  - C#などの`async/await`と異なるMessage passing型の並行処理モデル

## 標準のツールが便利

- `go fmt`
  - コード整形
- `go vet`
  - 静的解析

サードパーティ製の開発用ツールも豊富。

## クロスコンパイル/ワンバイナリ

- ビルドするとひとつのバイナリファイルになり、他のランタイムライブラリ等は不要
- Windows/Linux/macOS向けのクロスコンパイルが可能

# いまいちなところ

- 文法に癖がある
  - 例外がない(推奨されない)
  - クラスがない
  - 継承がない
  - オーバーロードがないなど
  - ジェネリクスがない
- バイナリサイズが大きい
- 依存関係周り
  - `vgo`で解決されるようになるらしい → 1.12 (2019年2月予定)
  - [Go & Versioning(vgo)を読んで大きな変更が入ったなと思った - Qiita](https://qiita.com/lufia/items/67701e2f927c77a75d6e)

# Go言語の採用例

参考: [Go言語を採用している有名なオープンソースのプロダクト - write.kogu](https://write.kogus.org/articles/j5oYbI)

- CLIツール
  - [peco](https://github.com/peco/peco)
  - [fzf](https://github.com/junegunn/fzf)
- コンテナ、インフラ管理など
  - [Docker](https://github.com/docker)
  - [kubernetes/](https://github.com/kubernetes/kubernetes)
  - [HashiCorp社製品](https://github.com/hashicorp)

# 始めるには？

- [公式サイト](https://golang.org/)に従ってインストール
- [A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)で文法を学習
- 困ったらドキュメントを参照
  - [言語仕様](https://golang.org/ref/spec)
  - [標準パッケージ](https://golang.org/pkg/)
TypeORMのmigrationで.tsファイルを直接参照したい

- TypeORM v0.2.6
- Node.js v10.11.0

TypeORMのmigrationを使うため、公式ドキュメントを参考にrootにormconfig.jsを置いてDB情報を設定

```js:ormconfig.js
module.exports = {
	type: 'postgres',
	host: 'localhost',
	port: 5432,
	database: 'hogehoge',
	username: 'hogehoge',
	password: 'hogehoge',
	entities: ["build/server/database/entities/*.js"], // <- ビルドされたJSファイルを参照している
	subscribers: [],
	migrations: ['migrations/*'],
	cli: {
		migrationsDir: 'migrations',
	},
};
```

以下のコマンドを実行してmigrationファイルを生成

```
yarn typeorm migration:generate -n hogehoge
```

問題なくmigrationファイルが生成された。

ただこれだと、TypeScriptで書いている場合必ずビルドしてから実行しないと定義にずれが生じる可能性があるのでこうしてみた

```js
// ...
entities: ["src/server/database/entities/*.ts"],
// ...
```

エラーが起きる

```
(function (exports, require, module, __filename, __dirname) { import {Entity, PrimaryGeneratedColumn} from 'typeorm';
                                                                     ^

SyntaxError: Unexpected token {
    at new Script (vm.js:79:7)
    at createScript (vm.js:251:10)
    at Object.runInThisContext (vm.js:303:10)
    at Module._compile (internal/modules/cjs/loader.js:657:28)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:20:18)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

＼(^o^)／

# 解決策

https://github.com/typeorm/typeorm/issues/371#issuecomment-289829588

> you node environment tries to load src/entity/User.ts, but it should load .js. So you either need to run app with ts-node, or set proper configuration for JS FILES in your ormconfig cli section, e.g. dist/migrations/.*js

コマンドをこう治すと問題なく動くようになる

```
ts-node ./node_modules/.bin/typeorm migration:generate -n hogehoge
```

まあTSファイルはTS実行環境じゃないとだめだよね・・・
SXSSFSheet.getRow で NULLが返ってきてハマった話

# 1. はじめに
私がscalaで実装したとある機能で、
ストリーミングで数百MBのエクセルファイルを作成しているのですが、
CSVも作って下さいとの事で、サクッと作ろうとしたら少しハマった話です。

### 1-1. 使っているライブラリ
org.apache.poi.xssf.streamingです。
メモリを喰わず高速でexcelファイルをアウトプットしてくれます。

# 2. ハマった内容

### 2-1. こんな関数を作りました。

```scala:

  def convertToCsvStr(sheet: SXSSFSheet): String = {
    var csvStr: String = ""
    for (ri <- 0 to sheet.getLastRowNum()) {
      val row = sheet.getRow(ri)
      if (row != null) {
        for (ci <- 0 to row.getLastCellNum()) {
          val cellStr = if (row.getCell(ci) != null) {
            row.getCell(ci).toString()
          } else {
            ""
          }
          csvStr = csvStr + "\"" + cellStr + "\","
        }
      }
      csvStr = csvStr + "\r"
    }
    return csvStr
  }
```
作成したbookのオブジェクトからsheetオブジェクトを引っ張りだして、
その内容をこの関数にお渡しし、
csv用のstringオブジェクトを作るというもくろみです。
### 2-2. 発生した現象
80行分データがあるシートのからCSVを作る場合は特に問題なかったのですが、
158行データがあるシートだと、CSVの0-58行目が空っぽになってしまいました。
上記の関数を見ての通り、`row`がnullの場合は改行しかしないので、
rowがnullになってやがるな！とデバッグを開始。

# 3. 原因
我がコードを疑い、ステップ実行してゴニョゴニョデバッグしたのですが、
ちゃんとcreateRow(0)している、nullになるはずのない、0行目のrowが、シートの作成が終わったあと参照してみるとnullになっている。なんでだよ。

それは仕様でした。。。

[公式Document](https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html) に記載されとりました。

> SXSSFSheet.createRow でRowを作る際にフラッシュされていないレコードの総数が指定された値を超えると、インデックス値が最​​も低い行がフラッシュされ、SXSSFSheet.getRowでアクセスできなくなります。

> When a new node is created via SXSSFSheet.createRow(int) and the total number of unflushed records would exceed the specified value, then the row with the lowest index value is flushed and cannot be accessed via SXSSFSheet.getRow(int) anymore.

flushする閾値は指定できる様ですが、
おとなしくデフォのまま、createRow,setCellValueした直後に、
csv用のstringにカンマ区切りで値をセットしようと思います。

メモリ節約のためにstreamingでファイル作成するライブラリなので、一定の行数になると変数の中をflushしてtmpファイルにそのデータを吐き出すんですねきっと。
rails + heroku で ckeditor を導入する

※事前にrailsやckeditorなどをダウンロードした時点の状態でherokuにアップロードしていきます。ckeditorの導入などは
>[ruby on railsのckeditor gemの使い方をscaffoldを用いて解説する]( https://joppot.info/2014/09/01/1958)


などを参照。
##環境
rails 5.0.7
ckeditor 4.2.4


## lib/tasksフォルダ―にckeditor.rake fileを作る
以下のコードを作成しておく。

```ruby:ckeditor.rb
require 'fileutils'

desc "Create nondigest versions of all ckeditor digest assets"
task "assets:precompile" do
  fingerprint = /\-[0-9a-f]{32}\./
  for file in Dir["public/assets/ckeditor/**/*"]
    next unless file =~ fingerprint
    nondigest = file.sub fingerprint, '.'
    FileUtils.cp file, nondigest, verbose: true
  end
end
```
[参考文献]https://github.com/galetahub/ckeditor/issues/307#issuecomment-22186377
## config/application.rbでのconfig設定を追加する

```ruby:application.rb
config.autoload_paths += %W(#{config.root}/app/models/ckeditor)
config.assets.precompile += Ckeditor.assets
config.assets.precompile += %w(ckeditor/*)
```
[参考文献]https://github.com/galetahub/ckeditor/issues/307#issuecomment-22186377

次のコマンドを実行し、herokuにpushする。

```
rake assets:precompile
rake ckeditor
git push heroku master
```

僕の場合、これでherokuに反映されました。
### 終わりに
　オリジナルサイトを作成するうえで投稿機能を付けるためにckeditorを導入しましたがherokuにアップロードするとckeditorが正しく表示されないことでハマりました。rails 自体自分で勉強して4か月ほどで上記の記事は理解できませんでした。誰かの参考になればと思います。
テックスコアのデザインパターンをSwiftで書く　(Adapterパターン)

#はじめに

[TECHSCOREのデザインパターン](http://www.techscore.com/tech/DesignPattern/index.html/)を同期と勉強会することになったので、それをSwiftで書いてみることにした

詳細はリンク先の記事をみてください

# Adapterパターン(継承)
[Adapter パターン 1](http://www.techscore.com/tech/DesignPattern/Adapter/Adapter1.html/)

この場合だと`Taro`クラスは変更したくないが、新しい関数`organizeClass()`を実装したい時に使える

```Swift
protocol Chairperson {
    func organizeClass()
}

class Taro {
    func enjoyWithAllClassmate() {
        print("みんなで楽しむ")
    }
}

class NewTaro: Taro, Chairperson {
    func organizeClass() {
        super.enjoyWithAllClassmate()
    }
}

```

# Adapterパターン(委譲)

```Swift
protocol Chairperson {
    func organizeClass()
}

class Taro {
    func enjoyWithAllClassmate() {
        print("みんなで楽しむ")
    }
}

class Hanako: Chairperson {
    let taro = Taro()
    
    func organizeClass() {
        taro.enjoyWithAllClassmate()
    }
}
```

# エクステンションを使うパターン

```Swift
protocol Chairperson {
    func organizeClass()
}

class Taro {
    func enjoyWithAllClassmate() {
        print("みんなで楽しむ")
    }
}

extension Taro: Chairperson {
    func organizeClass() {
        enjoyWithAllClassmate()
    }
}

```

#参考文献

[しめ鯖日記 Swiftで学ぶデザインパターン9 (Adapterパターン)](http://www.cl9.info/entry/2015/07/11/235101)
これだけはやめて！個人的に感じたコードを読む時にちょっと嫌なコード

#前書き
たぶんそこらかしこにこの手の話題がありますが、俄然として、こうする方がいいよ。っていうのはこうすべきだとかってありますが
それが、実務にかなっていない環境だったり、そもそも言語仕様的に、設計的に、様々な理由がありますが
その中で、今私がいる環境の中で個人的に感じたこれは、ちょっと、、、っていう感じのものを5選で記述しようと思います。
まぁ、そう感じたときもあったなぁくらいのネタにでもなれば、、、


#環境経緯
すでにあるプロジェクトに入った。すでに完成しており、運用状態のものに入った時の経験に基づいています。
ゲーム関係のものです。

#得られる知見
こういう感じる人がいるんだ
何かネタが欲しい人

#つらいコードランキング
##　参照や、重要な計算にも直値にも関わらず、それに対して、コメント等が存在しない

例えば、キャラクターの移動速度の計算などで以下のような式

``` 移動速度.cs

//クラス内
private float speed;

///移動速度の取得
public int MoveSpeed
{
    get
    {
        return speed * 1.1f;//<-この部分
    }
}

```
何故1.1fなのか？このサンプルでは、この部分だけなのでいいですが
例えば、この掛け合わせている、speedの変数に対して
・武器の種類によってそもそものスピードが変わる。
・バフ等で、追加される。

等があった際に、この１．１ｆというのが、そもそもこれまでの単純なスピードしかない状態だから、１．１でスピード解決しようと
した類なのか、それとも、一律して１．１をするルールがあるのか？などなど
直値が使われている場所によっては困ることになります。


##　書き方が統一されていない。

例えば以下のようなコード

``` 統一されていないコード.cs

public void hoge_method()
{
    int _cnt = 10;

    for(int a = 0; a < _cnt;a++){
        if(a == 2)
        {
            a++ 
        }
    }
}

```

今回の例では、中かっこの位置　と　変数の定義のされかたです。
チーム環境にもよるのかもしれませんが、コード規約などが存在しない状態で長期になるとどうしても、起こりうることです。


##　何かのキーなどに使うのだが、変数名が汎用的

例えば以下のようなコード

```　汎用的な変数名　.cs

private int level; //実際は、スキルのレベル
private int id;    //実際は、スキルのIDだったり、アイテムIDだったりする

```
この汎用的なidといった変数も、特定の決まったものに対して使われているidならまだわかる。
例えばSkillクラスの中にIdがひとつあるならば、それは、ほぼほぼスキル関係のidに違いないであろうと推測することができる。

しかし、ゲームを作っていく中で、スキルとか攻撃とか、ユニークのIDとかが一同に介する
<b>バトル関係</b>のものであるとか、<b>ゲームマネージャ</b>とかであるとか
そういったIDとか、レベルが集約するような箇所などでは
<b>id　</b>とかではなく　<b>skill_id</b> とか　<b>player_lv</b>とかなどの工夫がないと
複数のクラスや、関数をまたいだ際に、他の意味のidなどが絡んできてわからなくなることがある。
経験ない？それはなんともうらやましい。





#あとがき
個人的に、感じたちょっと嫌なコードです。
もちろん、この程度なら余裕だぜってくらい読めるくらいの実力備えるのがプログラマになれっておっしゃるかもしれませんが、
楽して読めるに越した事はないとは思いますので、どうぞ、寛容な心にてよろしくお願いいたします。
8bit PIC の XC8 v2.* ビルドは C90で

この記事は、2018/5/27以降 8bit PICのファームウェアがビルドできなくなっちゃった人のためのものです。 ビルドができる人は読まなくて大丈夫。

Microchip社から出ている 8bit PICのコンパイラ XC8は、 [2018/5/27に v2版](http://ww1.microchip.com/downloads/en/DeviceDoc/Readme_XC8_v200_for_PIC.htm#TOC_Documentation)が出ています。　v2は v1と違って、 gccぽいオプションになったり、大きな変更が入っています。

問題は、新しいコンパイラを嬉々としてインストールし、使おうとすると以前使っていた[Microchip mla](http://www.microchip.com/mplab/microchip-libraries-for-applications) と呼ばれるサンプルコードやライブラリのビルドができなくなってしまうこと。（そしてv1.*のコンパイラはすでにweb上には見つからないので戻して何がわるいのか確認することもできない）

結論としては `MPLAB X IDEから、プロジェクトの　property->XC8 Global Option -> C StandardをディフォルトのC99になっているところから C90に直すだけ`でビルドが通るようになります。　　（仕事用に使っている場合は、XC8 v1.*は自分で保存しておかないとだめですね）

ほかに色々書いてある情報も多く、たった一つこの設定を変更すればよいと気がつくまでに数時間かかってしまい、また、ほとんど"PICは死んだのか"と思っていたところでこの情報に目が止まり、部品を無駄にしないで済んだので書きとめておきます。

[PIC18F14K50は 8bitで1000円ほど](http://akizukidenshi.com/catalog/g/gM-05131/)なのだけど、 USB HIDや USB CDC経由でGPIOなどが使えちゃう便利な石です。　よかった。よかった。

---

ちなみに、　properties->Conf->PICkit3->(category=power)->Power target circuit from PICkit3 のチェックが外れてると（これがディフォルトらしい）PICkitからターゲットに電源がいかず、ターゲットがないと言われてプログラムができません。USBを繋いでないときは要注意。 これも一時間ほどはまりました。前に使っていたIDEにこんなオプションあったかな？
C#erがマイクロサービスを考える

## はじめに

最近マイクロサービスに関して考える機会があったのでまとめます。
業務で実績があるようなものではありません、ポエムです。

## マイクロサービスってなんぞ？

いわゆるバズワードと考えてもいいです。
具体的に何を満たせばマイクロサービスです、ってものではないですし、正解があるわけでもありません。
それぞれの会社/チームごとに異なるのが自然ですが、実際に業務として行う場合は明確な定義を決めた方がいいでしょう。
上司に説明するときは、小さいサービスを作ってそれを組み合わせてアプリケーションを作ります、ぐらいでごまかしましょう。

マイクロサービスにすることでのメリットやらなんならはググればいくらでもでてくるので触れません。
と言いつつちょっと変わった観点個人的にうれしいポイントはこんな感じでしょうか。

* サービス単位で異なる技術が利用できるため技術検証目的で好きな技術が選択しやすい
* 単一のサービスとしてみたときに規模が小さいため、別のチームにxxxな人員がいても足を引っ張られない

## サービスの単位はどう決める？

マイクロサービスの場合、ドメイン駆動設計 (DDD) で進めることを必須と考えていいでしょう。
最終的に巨大なシステムを作ることを目標とした場合、それぞれのサービスを境界付けられたコンテキストとすると説明がしやすいです。
技術者以外 (上司や顧客) に説明する場合はこれでいいと思いますが、技術者的にはもっと細かいことが気になるのでこのあと掘り下げます。
境界付けられたコンテキストをマイクロサービスとした場合、これは論理的なサービスであり実装に落とし込む際にはもっと細かい定義が必要です。

## レイヤー

ドメイン駆動設計でのレイヤーは以下のようになります。

* UI層
* アプリケーション層
* ドメイン層
* インフラストラクチャー層

物理的なサービスとしてはレイヤーごとに別のサービスとして定義するとわかりやすいです。
が、この時点で非技術者が考えるマイクロサービス (境界付けられたコンテキスト) と技術者が考えるマイクロサービス (各レイヤー) で異なってしまうんですが、どう表現すればいいんでしょう？ 誰か教えてください。

### UI層

エンドユーザーが実際に触る箇所です。
webアプリの場合はhtmlとJavaScriptと考えれば良いです。
技術者以外 (上司や顧客) が見たときに一番わかりやすい箇所なので、頻繁に仕様変更が発生します。
仕様変更を抑えることは無理なので、UI層はあきらめて仕様変更を受け入れられるようにした方が良いです。

### アプリケーション層

UI層から直接呼び出される箇所です。
webアプリの場合はRESTなAPIサーバーが多いでしょう。
ビジネスロジックは含めません。

### ドメイン層

ビジネスロジックです、アプリケーション層から呼び出されることもあればドメイン層の別のサービスから呼び出されることもありますがUI層からは呼び出されません。
Webアプリの場合でもJavascriptから呼び出されることを考慮する必要がないため、RESTなAPIよりパフォーマンスを考慮した方がいいでしょう。
C#er的にはgRPC、具体的なライブラリとして[MagicOnion](https://github.com/neuecc/MagicOnion)を検証したいところです。

### インフラストラクチャー層

永続ストアとのやりとりを行う箇所です、ドメイン層からのみ呼び出されます。
DBだったりファイルだったり別の外部サービスだったりを対象に、ビジネスロジックは含めず純粋にCRUD操作のみを行うサービスとします。

## リポジトリはどうわける？

技術者的に非常に悩ましいです。
できる限り細かくレイヤーごとにリポジトリを分けましょう、としたいところですが、実装レベルで考えるとレイヤー間で共有コードがでてきます。
具体的にはアプリケーション層とドメイン層でMagicOnionを利用したgRPCで通信した場合でも、intarfaceと送受信するデータ (DTO) を共有する必要があり、それをどこに置くかが問題です。
アプリケーション層のプロジェクトからドメイン層のプロジェクトを参照するのはイケてないので、intarfaceとDTOのみを定義したプロジェクトを作成しそれぞれのプロジェクトから参照させる、とするのが無難かと思いますがレイヤーごとにリポジトリを分けた場合はどこに置きましょう？

また、現実的に一から新しいシステムを作る場合は1つの機能を作る場合、単一のレイヤーのみの実装をすることは少ないかと思います。
一連の作業タスクの中でアプリケーション層とドメイン層を同時に修正する場合、リポジトリが分かれていると純粋に手間が増えます。

ということを考えると境界付けられたコンテキスト単位でリポジトリを作りたくなりますが、その場合でもデメリットはあるわけで。。
マイクロサービスではCI/CDを行うことが前提です、PullRequestを作成したときにCIすることを考えた場合、リポジトリが分割されていないとソースコードのpullに余計な時間がかかるようになりますし、修正対象でないプロジェクトをビルドするのは無駄でしかありません。
CI/CDツールをうまいこと構成してPullRequestの修正対象ごとに適切な処理を行うことができれば解決する範囲ではありますが。

正解はないのでそれぞれの会社/チームごとに検討するのがよさそうです。
個人的にはあとで分割するのは大変なので、最初に細かい単位でリポジトリを分割、リポジトリ間の参照はサブモジュールを利用するのがいいんじゃないかと。

## TODO

* 技術選定
* 具体的な実装例
KindleがついにMathMLに対応したけどレンダリングが若干おかしい件

## KindleがMathMLに対応した！

Google（Chromeブラウザ）とAmazonにMathMLは見放されていたと思っていましたが，今年の7月にKindleがMathMLに対応したらしく，個人的に凄い躍進だと思いました．しかし，そのことについて言及している個人のブログは確認した中では[僅かに一件](https://99nyorituryo.hatenablog.com/entry/2018/07/27/235051)で，なんとも寂しいものがあります．

さて，適当なMathML入りのepubファイルを最新のKindle Previewer 3で表示してみて，どんなものかを確認してみました．

![kindle_mathml_preview.png](https://qiita-image-store.s3.amazonaws.com/0/191414/dd3f30be-1af6-8ed6-5ce7-fee47bfae6fe.png)

いかがでしょうか．なんとこのクオリティの数学的文書（文書の内容が間違ってたらごめんなさい）が，リフロー型の電子書籍として発信できる時代にやってきました（厳密にはMathMLに対応している楽天KoboやiBooksでは昔からできたことですが，流石にシェアがKindleと違いすぎます）．

しかし残念なことに，数式そのもののレンダリングに申し分はない（Readiumと同じレンダリングエンジン？）のですが，数式の配置が若干おかしいです．

## 問題点

以下のPreviewerの画像をご覧下さい．

<img width="720" alt="スクリーンショット 2018-10-03 23.28.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/191414/95b80fba-4e83-28f5-9ef7-5b076c5c5d8c.png">

残念なのは以下の2点です．

1. 数式とテキストの間隔が狭い
1. 数式が上よりに配置される

問題点1に関しては，普通のhtml+mathmlであれば

```css
math[display="inline"]{
    margin-left: .2em;
    margin-right: .2em;
}
```

といったCSSで，`math`要素の左右に余白を与えることができるのですが，Previewerで確認する限りでは，Kindleにおいてmath要素をCSSで制御するのはできないようなので厄介です．例えば

```css
math{
    color: red;
}
```

とすれば，普通のウェブブラウザであれば数式は赤く表示されますが，Kindleではそうなりませんでした．左右の余白は苦肉の策ですが，次のように，`math`要素を`span`要素でラッピングし，`:before`と`:after`などの擬似要素で無理矢理空白を作るというまったくもってセマンティックではない方法があります（他にもう少しスマートな方法があると思いますが…）．

```html
<span class="inline-math"><math>...</math></span>
```

```css
span.inline-math:before{
    content: ' ';
    font-size: .5em;
}
span.inline-math:after{
    content: ' ';
    font-size: .5em;
}
```

また，問題点2の数式が上に配置される点は，私の能力ではどうやっても改善されませんでした．小文字のアルファベットだったらちょうど良い位置にあるみたいですが，大文字のアルファベットは上に突き出ているし，$A$と$A(x)$を見比べれば分かりますが，括弧などの記号が加わると更に上に配置されるという謎仕様です．

## 今後のアップデートに期待

今回，KindleはMathMLに対応するという（多くの人はそう思ってないかもしれないけど）大きな一歩を踏み出しました．今後のアップデートで，よりよいレンダリングがなされることを期待したいです．それと，`ol`のリストマーカーで(1)や(ii)などを用いたいので，CSSの`counter-increment`プロパティが使えるようにもしてほしいです．機会があれば私自身もサポートに要望してみたいです．

私の願望は以下です．

+ `math`要素をCSSで制御できるようにしてほしい
+ `math`要素の垂直方向に対する配置を見直してほしい
+ cssの`counter-increment`プロパティか，`@counter-style`規則を取り入れてほしい．
React Lifecycle

# 前置き

かなり間が空いてしまったんですが、最近はReactばっかり書いてます。
書いてるといつもライフサイクルメソッドを忘れてしまうのでまとめてみます。

（v16.3から非同期レンダリングのサポート等でライフサイクルイベントが変更されている）

# マウントに関するライフサイクルメソッド

## constructor
* 最初に実行
* `constructor(props)`
* 初期処理等に使用

## componentWillMount(今後のバージョンアップで削除予定)
* コンポーネントがマウントされる直前に実行(renderメソッドよりも前)
* 通常はコンストラクターで実行するので必要なし
* UNSAFE_componentWillMount

## componentDidMount
* コンポーネントがマウントされた直後に実行
* レンダリング後なのでDOMにアクセス可能
* ここでsetStateを実行するとrenderが2度実行されるので注意

## componentWillUnmount
* コンポーネントがアンマウントされる直前に実行
* 各種コンポーネントに紐づいた処理のクリア等に使用

# データのアップデートに関するライフサイクルメソッド

## componentWillReceiveProps(今後のバージョンアップで削除予定)
* 引数に受け取る予定のpropsを取得
* `componentWillReceiveProps(nextProps)`
* 新しいpropsは取得していないので、引数の`nextProps`と`this.props`とで比較可能
* setStateも実行可能なのでpropsの比較結果をstateとして扱う場合はこのメソッドで行う
* propsが更新される時のみ実行(`nextProps`と`this.props`が同じでも実行)
* UNSAFE_componentWillReceiveProps

## getDerivedStateFromProps
* componentWillReceivePropsと同じタイミングで呼ばれる
* componentWillReceivePropsと違い、更新時だけでなくマウント時にも呼ばれる
* `static getDerivedStateFromProps(nextProps, prevState)`
* 現在のState値とマージされるのでPropsを元にStateの値を更新したいような場面で使う
* Stateを更新する必要がない時は、nullを返す

## shouldComponentUpdate
* 引数に次のpropsとstateを取得
* `shouldComponentUpdate(nextProps, nextState)`
* 返り値として真偽値(true/false)を返す必要あり
* propsやstateに変更があった際に実行され、返り値によってrenderを実行するか判断
* デフォルトはtrueで常にrenderを実行する
* 主にパフォーマンスチューニングに使用
* 通常はReact.PureComponentを継承して使用する

## componentWillUpdate(今後のバージョンアップで削除予定)
* 引数に次のpropsとstateを取得
* `componentWillUpdate(nextProps, nextState)`
* render前に呼ばれる最後のライフサイクルメソッド
* ここでsetStateなどの再レンダリングを促す処理は行わない
* shouldComponentUpdateでfalseを返した場合は実行されない
* UNSAFE_ componentWillUpdate

## getDerivedStateFromProps
* componentWillUpdateと違い、更新前に必ず一度だけ呼ばれる
* `static getDerivedStateFromProps(nextProps, prevState)`
* DOMの更新前後の値を比較して何かしたい場合に使う

## componentDidUpdate
* 引数に前のpropsとstateを取得
* `componentDidUpdate(prevProps, prevState, snapshot)`
* render直後に実行される
* アップデート後のDOMにアクセスするタイミングとして最適
* APIへの変更完了通知にも利用可能
* shouldComponentUpdateでfalseを返した場合は実行されない

# エラーハンドリングに関するライフサイクルメソッド

## componentDidCatch
* React v16から実装
* 引数にスタックトレースが入ったerrorとその他の情報が入ったinfoを取得
* `componentDidCatch(error, info)`
* 記述したコンポーネントのエラーは検知できないため、子コンポーネントで発生したエラーを検知するためのメソッド

# 公式ドキュメント
https://reactjs.org/docs/react-component.html#the-component-lifecycle
Goでpanicになる処理をテストする

panicが発生するコードをテストする際に、どのように書けばいいのか分からなかった。
deferで指定した関数はpanic発生後も実行されるので、その関数内で`recover()`する事でテスト出来る事を知ったので記録しておく。
`recover()`の戻り値には`panic`が発生した時に渡された文字列が返るためその値をチェックする事で判別ができる。

```panic.go
package panic

func SuccessOrPanic(isSuccess bool) bool {
	// 何かしらの判定
	if isSuccess {
		return true
	}

	panic("illegal processing")
}
```

```panic_test.go
package panic_test

import "testing"

func TestSuccessOrPanic(t *testing.T) {
	defer func() {
		err := recover()
		if err != "illegal processing" {
			t.Errorf("got %v\nwant %v", err, "illegal processing")
		}
	}()

	SuccessOrPanic(false)
}
```
rails routes で特定のリソースだけを確認する方法 - Ruby on Rails Tutorialの演習の忘備録

#rails routesで特定のリソースだけを確認する方法

[Ruby on Rails 8章の演習](https://railstutorial.jp/chapters/basic_login?version=5.1#cha-basic_login)でrails routesで特定のリソースだけを確認する方法があったので
忘れないために忘備録として。

##現在のリソース一覧を調べる

> rails routes 

##特定のリソースのみの一覧を調べる

> rails routes | grep *特定リソース*

---
> GET    /login(.:format)          sessions#new
         POST   /login(.:format)          sessions#create
   DELETE /logout(.:format)         sessions#destroy
ジオシティーズのデータを保存する方法

（この記事は [地平線に行く](http://d.hatena.ne.jp/chiheisen/20181003/1538578299) とのマルチポストです）

2019年3月末で、ジオシティーズが閉鎖されることが決まりました。

これはつまり、過去のいろんな歴史的サイトも消えてしまうということ。
そうなる前に、ジオシティーズのデータを保存して置く方法をまとめました。

# サイト全体をローカルに保存する

まず、[Wget for Windows](https://sourceforge.net/projects/gnuwin32/files/wget/1.11.4-1/wget-1.11.4-1-setup.exe/download?use_mirror=jaist) をインストールします。
その上で、スタートメニューから「コマンドプロンプト」を起動して、以下のコマンドを実行します。

```
"C:\Program Files (x86)\GnuWin32\bin\wget" --convert-links --mirror <トップページのURL>
```

これで、ページや画像、Java Script などが全部ダウンロードされます。
もし対象のページが更新されたときは、再度このコマンドを実行すれば差分だけダウンロードされます。

CSS で指定されている画像（背景とか）はダウンロードできないという弱点がありますが、おおむね実用には耐えられると思います。

# Internet Archive に保存する

インターネット上に永久保存したい場合は、Internet Archive (Wayback Machine) へ。
https://archive.org/web/

1. **"Save Page Now"** のところに URL を入れる
2. **"SAVE PAGE"** をクリック<br>
![SavePageNow.png](https://qiita-image-store.s3.amazonaws.com/0/205989/f723902b-dac9-39da-153d-89f458a972d8.png)

今後、このサイトを見たくなったときは、URLで検索すれば見れるようになります。

# 注意点

ファイルをダウンロードすること、およびダウンロードしたファイルを個人で楽しむことは、法律上問題ありません。
著作権法第30条で、私的利用のための複製は認められているためです。

しかし、著作権者の許可無くインターネット上に再公開することは著作権法違反に当たります。
それは行わないようにしてください。

この記事は、違法行為を助長する意図はありません。
依存関係をコントロールするぜ

# はじめに
勉強会用に資料を作ったので、せっかくなのでQiitaにも投稿してみました。
この記事は**依存関係の制御**についてまとめたものです。
※あえて補足の文章などは入れずに資料のみ張っています。わかりにくい箇所があればご指摘ください。

![依存関係をコントロール.004.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/f9438078-dd33-41a9-3c8d-29fd856aa7e7.jpeg)
![依存関係をコントロール.005.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/ddedb5fa-2ca7-2783-230d-4b05ae68a090.jpeg)
![依存関係をコントロール.006.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/e2e7bb48-aacd-65dd-4395-189e2325f158.jpeg)
![依存関係をコントロール.007.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/829efa65-178c-00b3-60cc-e44b5b05c4f9.jpeg)
![依存関係をコントロール.008.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/50821fc2-78cc-250e-4ea1-0756dcad75aa.jpeg)
![依存関係をコントロール.009.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/c94f7ab3-16eb-797f-194c-9d39db208705.jpeg)
![依存関係をコントロール.010.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/af1b3d2c-36af-142e-32db-2bae1bf59297.jpeg)
![依存関係をコントロール.011.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/1317a3f1-05f7-fff4-670e-8584891ec787.jpeg)
![依存関係をコントロール.012.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/60f08a92-f6f8-fe4c-4def-6010fd141831.jpeg)
![依存関係をコントロール.013.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/3cbc94f8-af6a-3053-780d-f3660eb3e6bd.jpeg)
![依存関係をコントロール.014.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/48318b59-f097-f7f5-f5da-69ecfa9217e9.jpeg)
![依存関係をコントロール.015.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/662095a8-602a-420e-fdb7-3642963de6e1.jpeg)
![依存関係をコントロール.016.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/5f4dbbb1-6dbc-e938-45e0-87dcc5627dcf.jpeg)
![依存関係をコントロール.017.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/0124f5df-363a-eb96-e313-66683aab8120.jpeg)
![依存関係をコントロール.018.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/778b6e52-38d1-8788-494e-298757413742.jpeg)
![依存関係をコントロール.019.jpeg](https://qiita-image-store.s3.amazonaws.com/0/234760/b7cadbaa-296b-fefa-ceab-079ae2184d69.jpeg)
RSpecで配列をテストするマッチャの使い分け

rspecで配列を検証する際にはマッチャとしてeqを使わない方が良い（と思っている）
eqを使用すると、内部的に==で比較を行うため、配列の要素と、要素の並び順も比較する

```ruby

expect([1, 2, 3]).to eq [1, 3, 2] #=> false
expect([1, 2, 3]).to eq [1, 2, 3] #=> true

#この方法だと配列の要素と要素の並び順を両方とも比較していることが伝わりにくい。
```

配列の要素と順番が両方とも期待値と一致していることを検証するにはmatchマッチャを使用する

```ruby
expect([1, 2, 3]).to match [1, 3, 2] #=> false
expect([1, 2, 3]).to match [1, 2, 3] #=> true
```


配列の要素のみ期待値と一致していることをテストするためにはcontain_exactlyかmatch_arrayマッチャを使用する

```ruby

expect([1, 2, 3]).to contain_exactly(1, 3, 2) #=> true
expect([1, 2, 3]).to match_array([1, 3, 2]) #=> true
```

*配列をテストする際にmatchでなくeqを優先して使用するようなパターンをご存知の方、大変お手数ですがご指摘を頂けますとありがたいです！:sweat: 

参考
https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/contain-exactly-matcher
リモートから削除されたブランチ/タグ/コミットをローカルからも削除する

Gitリポジトリに残ったごみコミットをローカル環境から掃除する方法まとめ

## リモート側で消えたブランチをローカルから削除

```
$ git fetch origin --prune 
```

または

```
$ git remote prune origin
```


## リモート側で消えたタグをローカルから削除

```
$ git fetch origin --prune 'refs/tags/*:refs/tags/*'
```

fetch --pruneだと消えてくれないので、上記のようにrefspecを指定する。

gitのバージョンが古いとうまくいかない場合もある。
その場合は仕方ないので、一旦ローカルのtagを全て消してからリモートのtagを取得し直す。

```
$ git tag -l | xargs git tag -d
$ git fetch origin --tags
```

## git gcで `.git/` 内から削除

* タグ削除やブランチ削除によりコミットがどこからも参照されなくなった場合、git gcを実行すればコミットオブジェクトが削除される。

```
$ git gc
```

* ただし、タグ/ブランチ以外に参照が残っている場合はgcされない。
    * 例: reflog。残っていた場合はexpireしてからgcする。

```
$ git reflog expire --expire=now --all
$ git gc --aggressive --prune=now
```

## チーム内へ周知

* tagなどは誰かのローカルリポジトリに残っていると、誤pushされ復活する可能性がある。
    * ~~だいたいgit push origin --tagsのせい~~
    *  複数人開発の場合は周知して消してもらう。
    * 面倒でなければ再度cloneしてもらうのもアリ。

## 参考

* https://qiita.com/ngyuki/items/ca7bed067d7e538fd0cd
* https://qiita.com/yuichielectric/items/84cd61915a1236f19221
* https://blog.clock-up.jp/entry/2017/12/03/git-gc
macOS で 'omp.h' file not found

macOS High Sierra の R (3.5.1, RStudio 1.1.383) から `install.packages('caret')` をすると、依存パッケージのインストール時に下のエラーが出た:

```
auc_.cpp:2:10: fatal error: 'omp.h' file not found
#include <omp.h>
         ^~~~~~~
1 error generated.
make: *** [auc_.o] Error 1
make: *** Waiting for unfinished jobs....
ERROR: compilation failed for package ‘ModelMetrics’
* removing ‘/usr/local/lib/R/3.5/site-library/ModelMetrics’
Warning in install.packages :
  installation of package ‘ModelMetrics’ had non-zero exit status
```

下のように `libomp` を入れると解消した:

```shell
brew install libomp
```
docker ポート番号じゃなくドメインでアクセスしたい

## 背景
dockerホストで管理するコンテナの数が膨大になってきました。
<pre>
http://IPアドレス:PORT番号
</pre>

と、いった感じでアクセスするのも困難な数になってきました。
また、他にも

* ホスト側の空きポートを明示的に指定してあげる必要がある
* ブラウザからアプリケーションへのアクセスは、可能な限り80番を使いたい

と、いった問題もあります。

<pre>
http://ドメイン名.com
</pre>

のような感じでアクセスする方法を実践したのでご紹介。
ちなみにhttpsの対応は今回は記載しませんが勿論できます(追記予定)。

今回は例として「jenkins」を使用します。

## 目標

上記の問題を、nginxで（動的に）リバースプロキシを設定し、
任意のサブドメイン等からコンテナにアクセスします。

## 用意するもの
* docker
* docker-compose

## アプリケーションのポートマッピング

jwilder/nginx-proxy を使用します。
このdockerイメージですべて解決します。

使用した例のyamlがこちら

``` yaml:docker-compose.yml
proxy:
  image: jwilder/nginx-proxy
  ports:
    - "80:80"
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro

jenkins:
  image: jenkins
  environment:
    - VIRTUAL_HOST=jenkins.com
```

上記のファイルを作成したらあとは「docker-compose up -d」を実行
ポイントはnginx-proxyのvolumesを見てください。

/var/run/docker.sock は Docker のソケットのパスです。
Dockerはデーモンプロセス（dockerd）と通信するクライアントとして動くわけですが、
その際のソケットにはUNIXドメインソケット（/var/run/docker.sock）が利用されます。
そのため、dockerdは特権的な動作が可能です。
dockerdが使うUNIXドメインソケットに対して書き込み権限を有するということは、
ルート権限があるのと同じことと言えます。

こちらをコンテナへマウントすることでnginxは動的にリバースプロクシの設定を行います。

※ /var/run/docker.sockへのコンテナからのマウントは注意が必要です
https://rimuru.lunanet.gr.jp/notes/post/how-to-root-from-inside-container/

そして最後に、任意のホストの「/etc/hosts」に下記のように記述します。

``` :/etc/hosts
192.168.1.XXX  jenkins.com
```

後は、ブラウザから下記のような形でアクセスすれば完了です。

``` 
http://jenkins.com
```

上記で目的は達成。
追記予定の内容としてはhttpsの対応を追記予定としています。
PostgreSQL コマンド  Mac

■起動/終了

    postgres -D /usr/local/var/postgres

以降のコマンドを打つ際は、ターミナルを別に開いて実行してください。

■データベースの一覧表示

    psql -l

テーブル一覧

    \dt;

■データベースに接続

    psql -U ユーザー名　データベース名

■接続

    psql テーブル名;

■DB作成

    create database データベース名;

■DBの切り替え

    \c dbname

■テーブル一覧表示

    \z

■テーブル作成

    CREATE TABLE tablename (
     id serial PRIMARY KEY,
     aaa text,
     bbb text
     );

■テーブル削除

    DROP TABLE tablename

■テーブル削除

    insert into tablename (aaa,bbb) values('AAA','BBB');
    『"』で囲うとエラーになります。

■切断

    \q
データベーススペシャリスト試験に向けて勉強する〜その1〜

# はじめに
　来春のデータベーススペシャリスト試験の合格に向けて、データベースに関する勉強をする。勉強して理解できたことを記事にして、モチベーションを維持していこうと思う。更新がなくなった時は、諦めた時かもしれない・・・。

# 学習の進め方
　自分は、応用情報技術者試験は合格済みだが、データベースに関する業務経験はほとんどない。
そのため、[**ここ**](https://www47.atwiki.jp/matowiki/pages/107.html)で紹介されている5つのステップを最初から順に進めていく。

1. 基礎学習－午前2対策－
2. クエリの勉強－基本的なDBの仕組みの学習－
3. 午前2対策＋応用情報DB関連の学習－DB問題の基礎－
4. 午後1対策
5. 午後2対策　

　各ステップの詳細は、参考のリンク先で確認できる。

# さいごに
　来春のデータベーススペシャリト試験を受ける方は、合格目指して頑張っていきましょう！

# 参考
* [データベーススペシャリスト試験の勉強法まとめ](https://www47.atwiki.jp/matowiki/pages/107.html)
初心者がRailsガイドを1から100まで読んでみる　Railsをはじめよう編その15　リファクタリング

###7.リファクタリング

リファクタリングとはいままで闇雲に作ってきたコードを綺麗に整理整頓して無駄を省くこと。
それじゃあやってみよう。

####7.1.パーシャルコレクションを描画する

リファクタリングする対象はshow.html.erbです。
コメント機能もつけたしすごくごちゃごちゃしてきたからね。

```erb:show.html.erb
<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>
 
<p>
  <strong>Text:</strong>
  <%= @article.text %>
</p>
 
<h2>Comments</h2>
<% @article.comments.each do |comment| %>
  <p>
    <strong>Commenter:</strong>
    <%= comment.commenter %>
  </p>
 
  <p>
    <strong>Comment:</strong>
    <%= comment.body %>
  </p>
<% end %>
 
<h2>Add a comment:</h2>
<%= form_with(model: [ @article, @article.comments.build ], local: true) do |form| %>
  <p>
    <%= form.label :commenter %><br>
    <%= form.text_field :commenter %>
  </p>
  <p>
    <%= form.label :body %><br>
    <%= form.text_area :body %>
  </p>
  <p>
    <%= form.submit %>
  </p>
<% end %>
 
<%= link_to 'Edit Article', edit_article_path(@article) %> |
<%= link_to 'Back to Articles', articles_path %>
```

パーシャルって前にも出てきた。
_form.html.erbっていう部分テンプレートをつくって、new.html.erbを簡略化したね。

おなじように
_comment.html.erbをつくってshow.thml.erbを簡略化しよう。

```erb:_comment.html.erb
<p>
  <strong>Commenter:</strong>
  <%= comment.commenter %>
</p>
 
<p>
  <strong>Comment:</strong>
  <%= comment.body %>
</p>
```
コメントの表示のところを抜き出しました。

次にshow.html.erbを編集しよう。

```erb:show.html.erb
<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>
 
<p>
  <strong>Text:</strong>
  <%= @article.text %>
</p>
 
<h2>Comments</h2>
<%= render @article.comments %>
 
<h2>Add a comment:</h2>
<%= form_with(model: [ @article, @article.comments.build ], local: true) do |form| %>
  <p>
    <%= form.label :commenter %><br>
    <%= form.text_field :commenter %>
  </p>
  <p>
    <%= form.label :body %><br>
    <%= form.text_area :body %>
  </p>
  <p>
    <%= form.submit %>
  </p>
<% end %>
 
<%= link_to 'Edit Article', edit_article_path(@article) %> |
<%= link_to 'Back to Articles', articles_path %>
```

```erb
<h2>Comments</h2>
<%= render @article.comments %>
```
ここの部分がパーシャルを呼び出しているところだね。

####7.2.パーシャルのフォームを描画する

こんどはコメントを作成するフォームのとこもパーシャルにおいだそう。

```erb:_form.html.erb
<%= form_with(model: [ @article, @article.comments.build ], local: true) do |form| %>
  <p>
    <%= form.label :commenter %><br>
    <%= form.text_field :commenter %>
  </p>
  <p>
    <%= form.label :body %><br>
    <%= form.text_area :body %>
  </p>
  <p>
    <%= form.submit %>
  </p>
<% end %>
```
パーシャルはこんなかんじ。ただのコピペだね。

```erb:show.html.erb
<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>
 
<p>
  <strong>Text:</strong>
  <%= @article.text %>
</p>
 
<h2>Comments</h2>
<%= render @article.comments %>
 
<h2>Add a comment:</h2>
<%= render "comments/form" %>
 
<%= link_to 'Edit Article', edit_article_path(@article) %> |
<%= link_to 'Back to Articles', articles_path %>
```

こんなにスッキリしました！

```erb
<h2>Add a comment:</h2>
<%= render "comments/form" %>
```
ここだけど、このように/つきでrenderしてあげると、Railsちゃんが階層を認識してくれて
commentsの下にある_form.html.erbを見に行ってくれるんだって。

リファクタリング完了！
SSHのタイムアウト防止策

## 環境
### SSHサーバ
- CentOS 7.4
- OpenSSH 7.4p1

### SSHクライアント
- MacOS High Sierra 10.13
- OpenSSH 7.6p1

## 問題：SSHでしばしば接続が切断される（タイムアウト）
SSH接続してしばらく放置していると、介在するルータやファイアウォール等により一定期間通信のない接続が以下のようなメッセージと共に切断されてしまう。
設定によっては数分で切断されるため、非常に煩わしい。。。

```
... Connection reset by peer Connection to example.com closed.
```
（正確には通信断されてからしばらくするとクライアント側で上記メッセージが表示されている模様）

## タイムアウトを回避する方法
1. ルータ等の設定を変更する
2. サーバ側またはクライアント側で定期的な接続応答確認を行うよう設定する（OpenSSHの場合）
3. クライアント側から無害なパケットを定期的に送信する

## タイムアウト回避方法詳細
### 1. ルータ等の設定を変更する
割愛
これが可能かつ望ましい方法となり得る場合はこちらをどうぞ

----

### 2. サーバ側またはクライアント側で定期的な接続応答確認を行うよう設定する
OpenSSHの場合、サーバ側で以下を設定するか、

```conf:/etc/ssh/sshd_config
ClientAliveInterval [秒数]
ClientAliveCountMax [回数]
```

クライアント側で以下をいずれかの設定ファイル[^1]にて設定することで応答確認を行うようにすると切断されなくなる。

```conf:/etc/ssh/ssh_config&nbsp;または&nbsp;~/.ssh/config
ServerAliveInterval [秒数]
ServerAliveCountMax [回数]
```

上記の設定後はsshサービスの再起動をお忘れなく。

**CentOS7の場合**

```
$ systemctl restart sshd
```

**MacOS 10.13の場合**

`システム環境設定 > 共有 > リモートログイン 一度OFF → 再度ON`

----
### 3. クライアント側から無害なパケットを定期的に送信する
[PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/ "PuTTY")など一部のクライアントソフトウェアでは、定期的にパケット送信して切断されないようにする機能（Heartbeat/KeepAlive機能）が提供されているようです。


[^1]: OpenSSHのクライアント用設定においては、デフォルトのシステム全体でのクライアント用設定ファイルは/etc/ssh/ssh_configだが、各ユーザがホームディレクトリ内で独自に設定ファイル（~/.ssh/config）を持つ場合はそちらが優先される
Steam VR Plugin 2.0 (for Unity) Oculus Rift

# はじめに
CameraRigのPrefabsでOculus Riftのコントローラーが動かなかったので、とりあえず最低動作確認する方法

HTV Vive系の記事では追加すれば動作するように記載されているのに、
ヘッドマウントディスプレイのみ認識して、コントローラーは動かなかった、、、
※自分の環境だけ？？

# 動作環境
* Windows 10 64bit
* Oculus Rift (ファームウェアバージョン：709/b1ae4f61ae)
* Unity 2018.2.10f1 
* Steam VR Plugin 2.0

# 手順
#### 1. プロジェクトの作成
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/42bdb406-a499-a5d9-ac54-7118a2415836.jpeg)


#### 2. SteamVR Pluginのインポート
![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/9abecc2d-ab89-e583-213b-03184893a184.jpeg)
![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/546f329d-17f9-27db-570a-18d76a91ab6f.jpeg)


#### 3. 「Accept All」をクリック
![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/dbbcf4ff-1962-cc91-f237-11ec0e6d01a3.jpeg)


#### 4. 「Main Camera」を削除
![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/f1148f34-a3b5-16a5-97de-7bfd5f21a6ee.jpeg)


#### 5. 「CameraRig」を「Hierarchy」にドラッグ＆ドロップ
※ここで実行すると動くってのがほとんどだった、、、、だが動かなかった！！！！！
![006.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/455a1000-c8d5-10a7-975b-298d1e8f5242.jpeg)


#### 6. 「Controller (left)」を選択、「Pose Action -> Add」をクリック
![009.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/b19ba41f-b5e4-0749-721d-c1b3e435926e.jpeg)

「Yes」をクリック
![010.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/80a94e70-ba1c-16b8-1ded-be074ac3d150.jpeg)


#### 7.「mirrored」を「pre hand」に変更、「Save and generater」をクリック
![011.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/9dfafd29-04df-5308-609d-2ffedbbf9438.jpeg)
![015.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/747a4a85-c143-0c09-8b24-1d1ae94120c8.jpeg)

「Save」をクリック
![012.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/94991d67-abac-e990-fb5e-cc36d815b9ae.jpeg)

#### 8.「Controller (left)」、「Controller (right)」の「Pose Action」に、それぞれ「SkeletonLeftHand」、「SkeletontRigthHand」を設定
![013.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/36711d4f-56e7-69be-9d2b-3ccd18654e82.jpeg)
![014.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/2dded8e9-7266-6227-a94f-c48b206540f6.jpeg)


#### 9.「Edit -> Project Settings -> Player」をクリック
![007.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/13a7d320-0cb9-3356-30e5-2fc3339d8778.jpeg)

#### 10.「XR Settings -> Virtual Reality SDKs」の順番をドラッグ＆ドロップで、「OpenVR」を先頭にする！！！！
![017.jpg](https://qiita-image-store.s3.amazonaws.com/0/148696/b1eda4b8-1b66-69eb-42b5-50a95419f163.jpeg)

**実行するとコントローラーのモデルが表示されるようになっている！！！**
winmergeでexcel比較をやってみた。「数式を比較する」も、よさそう。

(参考)

https://love-guava.com/winmerge-excel/

(操作方法)
1.展開プラグインで開く(E)
2.ファイル展開プラグイン:<自動>→CompareMSExcelFiles.sct
3.OK
4.テストで,1シートを比較したら、30秒位かかる。
5.「xxxx_Formulas.txt　テキストファイルは異なります。」を選択する。
6.表示したら、
7.表示(V)＞Diffコンテキスト(D):＞0行


# 参考

https://qiita.com/takarazuka-ssc/items/300aa9e9cb08072197a6
Google Colaboratoryでファイルをアップロードする方法が簡単になった！

いままでGoogleColaboratoryで以下の2行のコードを使って
ローカルに保存されているファイルをアップロードしていました

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

この2行、結構忘れることが多くちょっと不便だなぁと思っていましたがこれが解消されました！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Colab has added a file browser. Pretty cool! You can upload and download files with a click (this is possible using code snippets, too). <a href="https://t.co/zEyJlqaklX">pic.twitter.com/zEyJlqaklX</a></p>&mdash; Josh Gordon (@random_forests) <a href="https://twitter.com/random_forests/status/1047148604329271296?ref_src=twsrc%5Etfw">2018年10月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こちらのツイートいわく、GoogleColaboratoryにファイルブラウザ追加されたとのことで
早速、GoogleColaboratoryのどこが変わったのかを見に行ってみました！

GoogleColaboratoryを開いて赤丸の部分を押すと
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/8a242782-30ab-4bdf-e0db-4e3088bcc90b.png" width=75%>

今までMarkdown用の目次表示とコードスニペット記述しかなかった項目に
ファイルブラウザ用の項目が追加されています。また、デフォルトでサンプルデータが置かれるようになったみたいです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/5ef01af6-9e2f-3665-c71d-90ad7330e4eb.png">

今まで通り、アップロード用のコードを記述してファイルをアップロードしてみます。
`ls`コマンドで確認した結果とファイルブラウザの表示が一致していることがわかります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/99fdce2d-5c5b-234b-1d6d-70da1b496bb1.png" width=75%>

次にアップロードボタンを試してみます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/8ac90584-79fd-60a5-4a00-09c1d7324132.png" width=75%>

いつもの2行コードと同じ振る舞いをすることがわかりました。あとはアップロードしたいファイルを選んでアップロードするだけです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/7c12a6c8-66db-923c-3bdd-b451b0780dab.png" width=75%>


今後、ローカルのファイルをアップロードするだけの用途であれば上記手順でこなせるので、いつもの2行のコードは必要なくなるかもしれませんね。これはありがたいです。

さらに使いやすく進化してるGoogleColaboratory、皆様も使ってみてはいかがでしょうか。

# 参考

- [google Colaboratoryでファイルを読み込む方法](https://qiita.com/uni-3/items/201aaa2708260cc790b8)
- [Google Colaboratory - External data: Drive, Sheets, and Cloud Storage](https://colab.research.google.com/notebooks/io.ipynb)
- [【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)
アプリサイズを下げようとUnity2018.2にバージョンアップして挫折した話

#背景と顛末
Unity2017.4で開発してたんですが、アプリのAPKサイズが100MB近くになってしまい、アプリのサイズを減らすためAssetBundleの導入を決意。
（※APKサイズが100MBを超えるとGooglePlayStoreにアップロードできない制約があります）

今どきはUnity2018.2でAddressable Asset Systeｍが公式機能で提供されているので、思い切ってバージョンアップして触ってみた。そして挫折した。

#導入はできた
Unity2018へのバージョンアップと、Addressable Asset Systeｍの動作確認まではできた。

動作確認ではAddressables.LoadAssetが非同期なことで苦労したが、LoadingSceneを設けてLoadしてから本Sceneを読む方法を教えてもらい、試したら解決できた。
この時点ではその上手く行った方法を記事したいと思っていた。

#ビルドエラー発生したけど解決
Editorでの動作確認がとれたので、今度はAPKファイルでビルドしてみることに。
```Unable to merge```の見慣れたエラーが出たが、これは```.aar```内も含めてProject内のAndroidManifestのminSdkVersionとtargetSdkVersionを揃えれば解決する知識があったので、手動で直す。そしてビルドが通った！

#ファイルサイズが膨れている・・・だと
ビルドは通ったが、できあがったAPKファイルのサイズは **139.5M** だった。

なんとバージョンアップする前の99MBから増えている。

自分のアプリのサイズが大きい原因はTextureが多いことが主因とわかっていたので、「アップデートでTextureの設定でも変わってしまったのかな？」と思い、Textureの設定をガチャガチャいじってみる。

そして、試しに再ビルド。

アプリサイズを見る。

###────────195.6MB。

ふ、増えている・・・

堪らずEditorlogを開いてみる。
139.5Mと195.6MBの結果は以下の通りだった。

```
//139.5M
-----------------------------------
Build Report
Uncompressed usage by category:
Textures      103.3 mb	 38.8% 
Meshes        0.0 kb	 0.0% 
Animations    15.5 kb	 0.0% 
Sounds        2.9 mb	 1.1% 
Shaders       182.9 kb	 0.1% 
Other Assets  3.0 mb	 1.1% 
Levels        7.9 mb	 3.0% 
Scripts       3.4 mb	 1.3% 
Included DLLs 11.3 mb	 4.2% 
File headers  574.2 kb	 0.2% 
Complete size 266.2 mb	 100.0% 

//195.6MB
-----------------------------------
Build Report
Uncompressed usage by category:
Textures      103.3 mb	 32.3% 
Meshes        0.0 kb	 0.0% 
Animations    15.5 kb	 0.0% 
Sounds        2.9 mb	 0.9% 
Shaders       182.9 kb	 0.1% 
Other Assets  3.0 mb	 0.9% 
Levels        7.9 mb	 2.5% 
Scripts       3.4 mb	 1.1% 
Included DLLs 11.3 mb	 3.5% 
File headers  574.2 kb	 0.2% 
Complete size 319.7 mb	 100.0% 
```

具体的に何が増減してるかはよく分からなかった。
Complete sizeだけが膨れている。
意味がわからない・・・

気が動転して```Reimport All```やエディタの再起動、Addressable Asset Systeｍに登録してるAssetのRemoveと再登録などを試してみる。

そして再ビルド。

###────────242.8MB。

最近みたアニメの映像が脳裏に浮かぶ。

![alt](http://pbs.twimg.com/media/Dk5A9zmU0AAHqNq.jpg:large)

まるでがん細胞が無限に増殖しているよう・・・
もうダメだ。かゆうm

#追記
調査状況です
<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="ja" dir="ltr">APKファイルを解凍して調べてみたところ、bundleファイルが増殖してますね・・・ <a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a><br>①APK 139.5MB ※最初のやつ<br>②APK 242.8MB ※最後の1つ前<br>③APK 315.6MB ※最後にビルドしたやつ <a href="https://t.co/mfv8R4d08L">pic.twitter.com/mfv8R4d08L</a></p>&mdash; アズマゴロ―@デジゲー博C-02a (@azumagoro) <a href="https://twitter.com/azumagoro/status/1047519120286052352?ref_src=twsrc%5Etfw">October 3, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
DockerとESETセキュリティソフトとの相性が悪いみたい

## Dockerで起動したlocalhostにアクセスすると固まる

ESETのwebアクセス保護が有効になっていると、Dockerで不具合が生じた。
Chromeで http://localhost:3000 にアクセスすると固まり、10秒くらいタブ切り替えもできなくなった。

Dockerを使わずにlocalhostを立ち上げると問題なくアクセスできるので、Dockerが原因なのもわかってる。

## パーソナルファイアウォールのルール設定を適用することで解決しました

Dockerアプリだけセキュリティから除外してあげる方法を見つけたので共有します。


ESETの「設定」→「パーソナルファイアウォール」を選択。
<img width="910" alt="スクリーンショット 2018-10-03 22.38.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/9af3c5ce-53dd-ed76-5db8-41023c5fe8cd.png">

「ルールとゾーンの設定...」を選択。
<img width="904" alt="スクリーンショット 2018-10-03 22.38.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/a445da6b-a1dd-0fd6-0c0f-5b63fe7cbca6.png">

すると、ウィンドウが開かれる。
「ルール」タブの「追加」ボタンを選択して、新しいルールの設定画面を開く。
<img width="808" alt="スクリーンショット 2018-10-03 22.38.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/43a5eb30-f479-baa9-a473-10ba1e9073c7.png">

「アプリケーションアイコンをここにドラッグしてドロップするか、参照します。」と書いてある下の四角にDocker.appをドラッグ＆ドロップすると、画像のようにアイコンが表示されます。

名前は、「Docker」などにしておきましょう。

「次へ>」を選択。
<img width="803" alt="スクリーンショット 2018-10-03 22.45.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/22e35873-a740-ddd5-40bd-1930ca65dd53.png">

アクション： 許可
方向：　両方

「次へ>」を選択。

<img width="806" alt="スクリーンショット 2018-10-03 22.48.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/802561a0-8739-9419-1396-a32a0f3c5beb.png">

プロトコル： TCP&UDP
ポート： リモート
リモートポート： すべて

「次へ>」を選択。

<img width="803" alt="スクリーンショット 2018-10-03 22.52.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/d88a35f5-2f5d-d26a-8d21-1a95a3341cba.png">


宛先： インターネット全体

「終了」

<img width="1013" alt="スクリーンショット 2018-10-05 10.00.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/73a90780-3f18-d1a0-b96b-435eef573ec8.png">


## まとめ

以上の設定で、私の環境では問題なくアクセスできるようになりました。

Google先生のところでは、「DockerのShared Drivesが、ファイアウォールの影響で機能していない」とかもあるようなので、他にも不具合がでるかもしれません。
開発時に送信メールの確認をする「smtp4dev 」

# 開発時に送信メールのテストをするには

今までは、本番のメールサーバでテストを行なっていたのだが、
NGとなったので、簡単なSMTPサーバがないかと思い、探していたらありました。

[smtp4dev](https://github.com/rnwood/smtp4dev/releases/tag/v2.0.10)

これなら、メールは飛びません。
送信したメールの確認も可能です。
便利ですね。
ぜひ使ってみてください。
JSONデータ読み込み(ReadToEnd())時、タイムアウトでWebExceptionが発生してしまう

<h2>HTTP通信で受信したデータの読み込みに失敗する。</h2>

2日半解決できなかったので、忘備録としてメモします。

<h4>＊環境</h4>
・C# アプリケーションが2つ
・Windows 10

<h4>＊やりたいこと</h4>
HTTPプロトコルを使用して、2つのアプリケーション間でJSONデータをやり取りする。

※JSONの利用の理由
データの受け渡しにJSONを利用。
データをバイナリにして受け渡しすることで、ちょっとずつデータが転送されるので軽快なのが良いらしい。

<h4>★問題の原因</h4>Stream.ReadToEnd(読み込みたいStream)で
リクエストを送信する/要求の応答を受信する側のアプリケーションで、
レスポンスで受け取ったデータを読み込みたいのに、時間がなぜかかかりすぎてしまい
タイムアウト(WebException)が発生してしまう。

<br><h3>⇒原因は応答を返す側のアプリケーションで利用しているHTTPListenerResponseのClose()し忘れ</h3>でした。
使い慣れていないのなら、使う前にドキュメントを読み込む必要がありますね。。

<br><br>
<h3>＊試した解決策</h3>
　ネットで検索した以下解決策を試行してみました。結果的に全く違うことが原因。
　HTTPListenerを扱うのが初めてだったため、解決が遅れた。
<h4>・連続でWebRequestを投げるとオブジェクトの破棄忘れや残骸で遅くなってしまうことがある</h4>
→1回しかリクエストは投げてない

<h4>・ブラウザで同リクエストを投げてみると、レスポンスは正常に返っている。</h4>
JsonTextReaderのサンプルは正常に動くが、こちらはJsonフォームのStringを読み込むのであって
StreamをStringに直したい、という要求に合わない。
→レスポンスは返ってきていたものの、中身が不足していたため、Streamに変換できなかった→読み込めなかったものと見られる。

<h4>・MemoryStreamに変換し、それをStringに格納してみる→失敗</h4>
キャストは失敗する(コンパイルは成功する)ので、
変換元のStream型の変数.CopyTo(変換先のMemoryStream型の変数)
で変換してから読み込み。
→結果的に同じ処理をしている(レスポンスのStreamを読み込んでいる)ため解決できない。

以上
tar, gzip, gunzipで試すアーカイブ、圧縮、解凍、展開

# はじめに
tarでアーカイブ、圧縮、展開ができます。基本、```$ tar czvf```で圧縮と```$ tar xvf```で展開ができれば、はじめはOKな気がします。


# それぞれのコマンドができること

- ```tar``` -- アーカイブ、圧縮、展開
- ```gzip``` -- 圧縮（複数ファイルの場合、アーカイブ済であることが前提）
- ```gunzip``` -- 解凍


# アーカイブ、圧縮、解凍、展開
## アーカイブ
- 複数のファイルを1つのファイルにまとめる。
- 使えるコマンド：```tar```

### Ex） tarで2つのファイルがあるtar-dirディレクトリをアーカイブする。

```tar cvf tar-dir.tar tar-dir```

```
$ ls tar-dir
file1  file2

$ tar cvf tar-dir.tar tar-dir
tar-dir/
tar-dir/file1
tar-dir/file2

$ ll | grep tar
drwxrwxr-x  2 papapapaper papapapaper      30  9月 29 18:12 tar-dir
-rw-rw-r--  1 papapapaper papapapaper   10240  9月 29 18:16 tar-dir.tar
```

## 圧縮
- 複数のファイルを1つのファイルにまとめ、容量を小さくする。
- 使えるコマンド：```tar```, ```gzip```（複数ファイルの場合、アーカイブ済であることが前提）

### Ex) tarで2つのファイルがあるtar-dirディレクトリを圧縮する。

```tar czvf tar-dir.tar.gz tar-dir```

```
$ tar czvf tar-dir.tar.gz tar-dir
tar-dir/
tar-dir/file1
tar-dir/file2

$ ll | grep tar
drwxrwxr-x  2 papapapaper papapapaper      30  9月 29 18:12 tar-dir
-rw-rw-r--  1 papapapaper papapapaper     182  9月 29 18:33 tar-dir.tar.gz
```

### Ex) gzipでアーカイブ済のtar-dirディレクトリを圧縮する。

```gzip tar-dir.tar```

```
$ ll | grep tar
-rw-rw-r--  1 papapapaper papapapaper   10240  9月 29 18:16 tar-dir.tar

$ gzip tar-dir.tar

$ ll | grep tar
-rw-rw-r--  1 papapapaper papapapaper     194  9月 29 18:16 tar-dir.tar.gz
```

注意点：gzipはアーカイブファイルそのものを圧縮するため、結果的にアーカイブファイルが消えることになる。


## 解凍
- 圧縮ファイルを元のファイルに戻す。圧縮ファイルの中にあるファイルは取り出さない。
- 使えるコマンド：```gunzip```

### Ex) gunzipで圧縮ファイルをアーカイブファイルに解凍する。

```gunzip tar-dir.tar.gz```

```
$ ll | grep tar
-rw-rw-r--  1 papapapaper papapapaper     194  9月 29 18:16 tar-dir.tar.gz

$ gunzip tar-dir.tar.gz

$ ll | grep tar
-rw-rw-r--  1 papapapaper papapapaper   10240  9月 29 18:16 tar-dir.tar
```

注意点：gunzipは圧縮ファイルそのものを解凍するため、結果的に圧縮ファイルが消えることになる。


## 展開
- アーカイブファイル、圧縮ファイルの中にあるファイルを取り出す。
- 使えるコマンド：tar

### Ex) tarで圧縮ファイルを展開し、圧縮ファイルの中のファイルを取り出す。

```tar xvf tar-dir.tar.gz```

```
$ ll | grep tar
-rw-rw-r--  1 papapapaper papapapaper     194  9月 29 18:16 tar-dir.tar.gz

$ tar xvf tar-dir.tar.gz
tar-dir/
tar-dir/file1
tar-dir/file2

$ ll | grep tar
drwxrwxr-x  2 papapapaper papapapaper      30  9月 29 18:12 tar-dir
-rw-rw-r--  1 papapapaper papapapaper     194  9月 29 18:16 tar-dir.tar.gz

$ ll tar-dir
合計 8
-rw-rw-r-- 1 papapapaper papapapaper 5  9月 29 18:12 file1
-rw-rw-r-- 1 papapapaper papapapaper 5  9月 29 18:12 file2
```
【正規表現】これだけ抑えれば戦える超基本原則

# 今北産業
- 実は現場は最低限の知識で回っている。
- これだけ抑えておけば読める正規表現基本ルール
- 正規表現を実際に使う場面

# 実はみんな最低限の基本だけしか抑えていない

Web開発の現場は特に顕著だと思うが、大半の人は正規表現について体系的に学んだことがある人は実は少ない。「正規表現が得意だ」という人はほとんどいない、というかほとんどのエンジニアは正規表現に苦手意識を持っている。

それでもなぜ現場を回すことができるのかというと、**みんな基本となる箇所だけ抑えてあとはググりながら書いているからだ。**

つまり、正規表現全然分からない><という人もこの記事で取り上げる正規表現の基本ルールを抑えればなんとか現場では戦えるというレベルにはなるはずだ。細かいところはその場でググろう。

# これだけ抑えておけば読める正規表現基本ルール
## メタ文字
メタ文字(メタキャラクタ)とは正規表現のなかで特殊な意味をもつ記号のこと。
**正直ここさえ抑えれば8割は基本原則を押さえたといっても過言ではない。**
以下に並んでいるのがその一覧になる。

```
.  ^  $  [  ]  *  +  ?  |  {  }  (  )
```

## 量指定子、繰り返し
## 文頭、文末
## ブラケットによる文字指定
## 正規表現を実際に使う場面

# まとめ
Scraping


SimpleなScraping

``` python
def getSoup(url, timeSleep=1):
    import requests
    import time
    import lxml
    from bs4 import BeautifulSoup
    
    time.sleep(timeSleep)
    session = requests.session()

    url_page1 = url
    res = session.get(url_page1)

    soup = BeautifulSoup(res.content, 'lxml')
    return soup
```
Webエンジニアになって１年経ったので振り返ってみた。

#前書き
初めての投稿となりますが、
Webエンジニアとして１年が経ったため１年間を振り返ってみました。
これからエンジニアになろうと考えている方には１つの未来予想図に、
既にエンジニアとして活動している方にはこんな奴もいるんだと思ってみて頂ければと思います。

#エンジニアになるまで
まずは自分のこれまでの経歴となぜエンジニアになったかについて軽く触れておきます。
###経歴
+ 2013年4月 大学 入学
+ 2016年9月 大学 中退
+ 2017年10月 某システム会社 入社

大学中退から会社入社するまではアルバイトのみで生活していました。

###エンジニア職を選んだ理由
+ 昔からゲームが好きでパソコンに触れる機会が多かったため。またパソコンに詳しくなりたかったら。
+ 未経験の採用を積極的に行なっている会社が多く、会社を選びやすかったから。
+ 肉体労働したくなかったから。。。

#会社に入ってからの２ヶ月
外部研修にてプログラミング未経験者用の研修に参加。
内容としては
　- 基本情報技術士試験内容をベースとしたパソコン基礎
　- SQL基礎
　- Java基礎
　- JavaScript、HTML、CSS基礎
　- Servlet/JSPによるアプリケーション開発

などなど...

正直、２ヶ月で相当な量の知識を詰め込まれたなと感じましたが、
（ボリュームとしては中学３年間の社会を２ヶ月でやったイメージ...？）
この時点では「プログラミング楽しい！！」って思ってました。

#研修後、初現場！初仕事！
２ヶ月の研修後、ついに初現場（SES）で初仕事になりました！
自社の先輩1人とBPさん1人の合計３人のチームで参画しました。
2018年10月現在も同じ現場に参画中です。

###現場での仕事内容
+ 2つの会社のシステム統合およびデータ連携用バッチ開発（内部設計〜単体テスト）
+ マスタメンテナンスアプリケーションの開発・運用・保守（外部設計〜単体テスト）

###仕様技術
+ Java
+ Eclipse
+ Flex3
+ AS3
+ VB6.0

などなど...

#１年間の所感
プログラミングの技術は業務外で向上させないといけないと感じました！
というのも、仕事ではプログラムを書く時間が短いということと最新の技術を扱えるわけではないから。
自分もJavaのバージョンが古くモダンな開発するには個人的にアプリケーションを作成しないと感じている今日この頃です。
しかし、運用保守等のプログラミング以外の仕事も使ってくださるお客様の声を直に聞けてやりがいを感じています。
今後ももっともっと技術力をつけて一人前のエンジニアになるため精進していきたいと思います。

# 最後に
今回は初投稿ということで技術的な内容はありませんでしたが、
次回以降は個人でアプリケーションを作成して、ご紹介できたらなと思います。
（おそらくDjangoやるかな？）
カレンダー表示：jquery

##手順
http://www.hanemaru.com/itemcolumn/11jquidatepicker01.html
上記URL手順通り実行しました。

###①application.html.erbのhead内に下記挿入。jquery本体を取り込む。以下head内に挿入してるのはCDNってやつかな

```
<script type="text/javascript"> 
<src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
```

###②共通利用できるライブラリを利用
これもhead内に下記挿入

```
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery.ui.datepicker-ja.min.js"></script>
```

###③jQuery UIのデザインを決める
これもhead内に下記挿入

```
<link type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/ui-lightness/jquery-ui.css" rel="stylesheet" />
```


###④jQuery UIのDatepickerの使用方法
１：表示させたい場所に以下を。

```
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<input type="text" id="datepicker">
```

２：上記と同じページに以下

```
<script type="text/javascript">
$(function(){
　$("#datepicker").datepicker();
});
</script>
```

これで表示できる。

###⑤そのほか色々と設定できる。
https://www.sejuku.net/blog/44165
こんな感じとか。
<script type="text/javascript">
$(function(){
　$("#datepicker").datepicker({;
　　numberOfMonths: 3,
　　showButtonPanel: true
　});
});
</script>


###これ以外にもDateRangePickerってのもある。
DateRangePickerは日付の範囲を指定できる。