OmniAICreator/Qiita-1.07M huggingface dataset:
Cocos2d-html5でスプラッシュ画面時点から背景色を変える

cocos2d-html5で、スプラッシュ画面時点から背景色を変えたいと思いました。SPAから滑らかにCocos2dに移行しようと思ったのです。概ね当たり前の部分、つまり、html内・loading.jsでの色指定に関わる部分を弄れば何とかなるのですが、WebGLの時だけ、一瞬画面が黒くなります。

一瞬のことなので、後回しにしようとも思ったのですが、こういうのってちょっとしたことながら「すげえ挙動不安定アプリっぽい見た目」になるので、耐えきれず一応ソースを読みました。

過程はすっ飛ばして、

frameworks > cocos2d-html5 > cocos2d > core > renderer > RendererWebGL.js > _clearColor 

に背景色を設定するしかない模様。

確かに、ライブラリの読み込み時に介入できる方法をcocos2dは提供していないので、これは困りものです。
少なくとも現バージョン3.17.2では、ライブラリのソースを書き換えざるを得ない感じ。

提案としては、ライブラリ初期化時に、呼び出し元HTMLの背景色を覗いて、_clearColorのデフォルト値にする、といった仕様が嬉しいんではないでしょうか。誰かプルリクしてあげて。

ちなみに、背景色を明るい色にすると、これに限らず色々な障害に阻まれる感じです。まだそのせいだとは確証できていませんが、TransitionCrossFadeとか。Cocos2d-HTML5って、黒背景で使う人がほとんどなのかも。

以上。
Go言語からシェルスクリプトが実行できない(シェバングの必要性)

#概要
Go言語を用いてシェルスクリプトを実行しようとしたところ、エラーになり実行できなかった。
lsなどコマンド単体での実行はでき、シェルスクリプトのみ実行できなかった。
シェルスクリプト自体は、コンソールログインした状態では実行できる状態であった。

原因としては、シェルスクリプトにシェバングがないためであった。
シェルスクリプトにシェバングを追加することで、実行可能となった。


#実行されるシェルスクリプト

```bash:test.sh
date "+%Y.%m.%d-%H.%M.%S" >> test.log
```


#シェルスクリプトを実行するGoプログラム

```go:gotest.go
package main

import (
    "os/exec"
    "fmt"
)

func main() {
        out,err := exec.Command("/test.sh").Output()

        if err != nil {
                fmt.Println("Command Exec Error.")
        }

        fmt.Printf("result: \n%s", string(out))
}
```


#エラー原因
シェルスクリプトにシェバングが記載されていないため。
コンソールからログインしている場合は、ログイン時のシェルがいい感じにスクリプトを読み取ってくれるため、
シェバングがなくとも、シェルスクリプトは実行できる。

Goから実行する場合は、新規プロセスの生成となるため実行可能ファイル以外では、何らかの手段で起動方法を連携する必要がある。
シェバングがないと、なにも情報がないため、実行が不可能となっていた。


#対応策
シェルスクリプトにシェバングを追加した。

```bash:test.sh
#!/bin/sh   <= 追加
date "+%Y.%m.%d-%H.%M.%S" >> test.log
```
Android Studio使ってみた。

Android Studioのインストール、サンプル表示について述べる。


#はじめに

##現状
・仕事でAndroidStudioを使うのでその学習
・触ったことはない

##AndroidStudioとは

・アプリケーションソフトウェア開発用のIDE
・Googleが提供する公式開発ツール
・Androidプラットフォーム向け

らしい…


#インストール手順
大まかな流れは以下の通り。

・PCシステム要件確認
・exeファイルをダウンロード、実行
・AndroidStudioインストール
・SDK追加インストール

#プロジェクト作成
アプリを作るためプロジェクトを作成。
とりあえずEmpty Activityを選択しておけば問題なし。

・Name：好きにしてよし。
・Package name：リリース時以外は好きにしてよし。
・Save location：保存場所。アルファベット名であれば問題なし。
・Language：Kotlin or Java選択。
・Minimum API Level：API29：Android 10.0(Q)

#エミュレータ　AVD Managerの設定
アプリが起動するか確認するためエミュレータが必要。
「Tool」→「AVD Manager」→「Create Virtual Device」で新たに作成。
ハードウェア、APIレベル、ABI、Targetを選択して完了。

#サンプル実行
さっそく実行してみる…





エミュレータが起動し、Hello Worldが表示された。

Android開発完了の確認完了。
Intellj IDEAからsbt runで起動したアプリをステップ実行する方法

Intellj IDEAでsbtを起動すると一番最初にsbtがオプション付きで起動する。

```sbtの起動ログ
C:\Java\jdk1.8.0_161\bin\java -agentlib:jdwp=transport=dt_socket,address=localhost:55151,suspend=n,server=y -Xdebug -server -Xmx1536M -XX:MaxPermSize=384M -Dfile.encoding=UTF-8 -Didea.runid=2017.2 -Didea.managed=true -jar C:\Users\xxxxx\.IdeaIC2017.3\config\plugins\Scala\launcher\sbt-launch.jar idea-shell
```

この中の `address=localhost:55151` がデバッガが接続するべきポート番号。
あとは[メニュー]->[Run]->[Edit Configuration]のダイアログで[Remote]を選択し、このポート番号を入力すれば完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11203/bc47fc2e-b083-d8ca-3b8d-5d0a29c36424.png)

あとは`run`を実行するだけです。
Jupyter notebookでコードを折返したい。

Jupyter notebookでコードの折返しをしたかったが、日本語での解説記事が少なかったので、メモ程度に記しておきます。

Jupyterの設定フォルダ(私のWin環境では`C:\Users\(UserName)\.jupyter`)の下、フォルダ`nbconfoig`の中にある`notebook.json`に以下を追記する。


```json:notebook.json
{
    "Cell": {
        "cm_config": {
            "lineWrapping": true
        }
    }
}
```

より良いコーディング環境を！
ARC-062 C-AtCoDeerくんと選挙速報: ceil関数の割り算に気をつけよう

##はじめに
今回Atcoder Regular Contest のC問題「AtCoDeerくんと選挙速報」を解いてみたのですが、なぜかWAが4回ぐらいでて1時間ぐらい溶かしたので反省文を書きます。

##問題と解法について
今回の問題では$\lceil A/x \rceil$と$\lceil T/y \rceil$
(A, T, x, y は整数)を求めることがメインとなるのですが、そのときのこの計算方法が大事になります。


##ミスした原因：Ceil関数内の割り算
自分は愚直にpythonのmathモジュールのceil関数を利用して

```python
#ここでの割り算は誤差をうんでしまう
A_div = math.ceil(A/x)
T_div = math.ceil(T/y)
```
と計算していたのですが、これは良い方法ではありません。

Pythonでは割り算の結果はfloatとなってしまい、floatの数値は16桁ぐらいまでしか精度が保証されていません。
>次のブログを参考にさせていただきました。
>>https://linus-mk.hatenablog.com/entry/2019/05/26/234642

以下に1を18桁並べた例をあげます。

```python
#正解
111111111111111111 // 9
>>12345679012345679

111111111111111111 / 9
>>1.234567901234568e+16

#間違い
int(111111111111111111 / 9)
>>12345679012345680
```

ここで商はfloatの17桁のため、16,17桁で狂いが生じてしまっているのがわかります。
これが今回の問題でWAが生じた原因となります。





###以下は以前書いていた間違った内容でご指摘を受けて直させていただきました。

~~なぜなら我々が普通に整数の割り算をするときは~~
~~1 / 1 = 1~~
~~2 / 1 = 2~~
~~100 / 10 = 10~~
~~100 / 40 = 2.5~~
~~と正確にでますが、コンピュータの世界では少し誤差が生まれます。~~

~~それはpythonでformat関数を利用してfloat formatにするとわかります。~~



~~pythonで/を使うとfloatとして結果が出力されるため、何度も計算をしていると誤差がceil関数に影響することになり、誤った答えが出てしまいます。詳しいことはドキュメンテーションで確認できます。~~
https://docs.python.org/3/tutorial/floatingpoint.html



##ではどうするべきだったか
誤差を生まないために、以下のように書くべきでした。

```python
#負の数にして//を使えばfloatを経由せずに計算することができる。
A_div = -(-A//x)
T_div = -(-T//y)
```

負の数にして切り捨て//を用いて、もう一度マイナスをかければintを使っているためfloatによる計算結果の誤差を産むことはありません。これによってceilを再現することができます。
7と5を利用すると
$\lceil 7/5 \rceil$ = $\lceil 1.4 \rceil$ = 2
-(-7 // 5) = -(-2) = 2

と同じ結果が生まれます。


##最後に
Ceil関数は便利ですが、中身の割り算には気をつけましょう。
以上です。
Deviseを入れた後、コンソールからのUser.firstやUser.all等がArgmentErrorになる

## 結論
Userモデルから
**password_digestカラム**
を削除すると解消する。

## 起こったこと
Deviseを入れた後、コンソールからのUser.firstやUser.all等が下記のようにArgmentErrorになる

```
irb(main):001:0> User.all
  User Load (1.8ms)  SELECT  "users".* FROM "users" LIMIT ?  [["LIMIT", 11]]
Traceback (most recent call last):
ArgumentError (wrong number of arguments (given 0, expected 1))
irb(main):002:0> User.find(1)
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
Traceback (most recent call last):
```

下記のissueにある通り、DeviseでUserモデルをセットアップした時に、既にUserモデルに
**password_digestカラム**
が存在すると、上記のエラーが出ます。

参考
https://github.com/plataformatec/devise/issues/

<img width="768" alt="スクリーンショット 2019-10-02 15.56.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/528e6fde-abfc-dcc5-8420-82d0718b889a.png">


今回は既にUserモデルを作っていて、後からDeviseを導入したのでおそらくDeviseの
**encrypted_passwordカラム**
とバッティングして発生していると思われる。

なので、Userモデルから
**password_digestカラム**
を削除すると解消しました。
Cordovaで音声入力する。


UIWebViewではnavigator.mediaDevicesが取得できず、audio inputが出来ない。
cordova-plugin-audioinputを使う。

# 導入

```
cordova plugin add cordova-plugin-audioinput@1.0.1
```

サンプルコードが現時点で最新の1.0.2では動かなかったため、1.0.1を入れた。

# Blob形式でデータを取得する流れ

- 公式デモソースが教えてくれる。

https://github.com/edimuj/cordova-plugin-audioinput/blob/master/demo/wav-demo.js

  
## Permissionを取る

## 準備
```js
document.getElementById("startCapture").addEventListener("click", startCapture);

// 送られてくるデータを貯める
var onDeviceReady = function () {
    if (window.cordova && window.audioinput) {
        initUIEvents();

        consoleMessage("Use 'Start Capture' to begin...");

        // Subscribe to audioinput events
        //
        window.addEventListener('audioinput', onAudioInputCapture, false);
        window.addEventListener('audioinputerror', onAudioInputError, false);
    }
    else {
        consoleMessage("cordova-plugin-audioinput not found!");
        disableAllButtons();
    }
};
```

onAudioInput内部で、音声ストリーミングを取得する


## 開始

```js
audioinput.start({audioSourceType: 0})
```

## 終了
```js

//停止
audioinput.stop();
    
// waveへ変換する    
consoleMessage("Encoding WAV...");
var encoder = new WavAudioEncoder(captureCfg.sampleRate, captureCfg.channels);
encoder.encode([audioDataBuffer]);

consoleMessage("Encoding WAV finished");

var blob = encoder.finish("audio/wav");
```
Sinatra サーバーを Rakefile とかで起動する

## 背景

Sinatraでサーバー起動したかったんだが、
```rackup```や、```bundle exec ruby ～～～``` で起動する方法しかググれなかった、、、


## 結論

Rakefileのタスクの中などで、Sinatra::Baseのサブクラスの`run!`を呼ぶ

```ruby
option = {port: 12345}
ClassOfSinatraServer.run!(option)
```

## 経緯と詳細

Sinatraのドキュメントをざっと読んだんだが、

http://sinatrarb.com/intro-ja.html

「モジュラーアプリケーションの提供」あたりにいくつか起動方法が書いてあるんだが、
~~rubyスクリプトで起動する方法がずばり書いてない、、、（と思う、、）~~
書いてあったが、わからんかった。（`run!`メソッドがprivateなんかと思った）

---

その他ググったりして、
以下の感じで一応起動したので、メモ作成

```ruby:Gemfile
source "https://rubygems.org"
gem 'sinatra'
```

```ruby:the_server.rb
require 'sinatra/base'

class TheServer < Sinatra::Base
  get '/' do
    'Hello, Sinatra'
  end
end
```

```ruby:Rakefile
require './the_server.rb'

task default: :sinatra_server

desc 'start Sinatra server'
task :sinatra_server do
  option = {
    port: 12345
  }
  TheServer.run!(option)
end
```

上記３ファイルを同じフォルダにおいて、そこのフォルダをカレントにして

```
> bundle
> rake
```

で起動する！
【統計学・データ分析】確率の基礎

##はじめに
皆さん、こんにちは。[@Raphael_de_murl](https://twitter.com/Raphael_de_murl)です。前回の集合に続きに今回は確率について共有していきたいと思います。少し分けて【確率の基礎、離散型確率、連続型確率】の順に紹介します。今回はその1番目で確率の基礎だけ軽く紹介します。

##確率
>偶然起こる現象の、現象全てに対する割合の事である。起こりやすさを数値で表した指標として使われる。 

####1)数学的確率
数学的確率P(A)：「有限な<b>全事象U</b>の部分集合である事象Aの起こる確率」と定義しています。ここで<b>全事象</b>が何かを見てみましょう。
[【統計学・データ分析】集合の基礎](https://qiita.com/Raphael_de_murl/items/65c53b60849ecae2e07a)ここの記事で<b>試行</b>や<b>事象</b>などを扱いました。
少し繰り返すと「サイコロを振ったり」、「コインを投げたり」など繰り返すことが可能な行為を<b>施行</b>と言いました。
またその結果「表が出たり」、「3以上の目が出たり」することを<b>事象</b>と言いました。そして基本的な1つ1つの事象を<b>根元事象</b>と呼び、
対象になる全ての根元事象(要素)から成る集合を<b>全事象</b>や<b>事象の全体</b>と呼びます。
P(A)を求める公式は以下のようです。

[【3分でわかる！】確率の問題を解くための6つの基礎知識](https://goukaku-suppli.com/archives/37915)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309361/57a546ac-88a3-160a-0f27-c1a64a00ee9a.png)

####練習問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309361/52703611-e60d-b95a-6a52-1504b55c90d4.png)

####2)反復試行の確率
まず<b>独立な試行</b>について見てみます。
これは独立な試行T1,T2があり、T1における事象A、T2における事象Bを考えるとき、試行T1でAが起こり、かつ試行T2でBが起こる確率は、P(A) x P(B)となります。例を入れて説明するとサイコロを1回目に振って3以下の目が出ることと、2回目に振って、5の目が出ることとは、無関係であり、このように2つの結果が<b>お互いに全く影響を与えないときの試行</b>を言います。話を戻してこの試行を<b>n回繰り返したとき、事象AがK回起こる確率</b>を<b>反復試行の確率</b>といいます。確率を求める公式は以下のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309361/dfc15885-a647-faf2-ec7b-502c781ef87b.png)

 - p：1回の試行で、事象Aの起こる確率
 - 1-p(q)：事象Aの起こらない確率

この試行をn回行って、そのうちk回だけ事象Aの起こる確率を計算します。

####練習問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309361/de90d160-fecf-c322-e44d-1929fc86f624.png)

####3)条件付きの確率
条件付き確率：ある事象が起こっている条件を下で、別の事象が起こる確率。これをある事象A、Bを例として見ると分かりやすいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309361/01db8970-a762-f53d-feb8-0520157c053f.png)
これをまた<b>【確率の乗法定理】</b>を使ってこう表せます。
分子のP(A∩B)を<b>P(A)・P(B|A)</b>に表示し、<b>P(B)・P(A|B)</b>にも表示します。

####事後確率
上記に紹介した条件付きの確率の公式を少し変化したものがあり、それを事後確率と呼びます。これは<b>ベイズの定理</b>で表せる確率でもあります。実際どう変形されたのかを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309361/2c45f063-0b40-e567-de53-416f663359c3.png)

###参考
[スバラシク実力がつくと評判の統計学キャンパス・ゼミ―大学の数学がこんなに分かる!単位なんて楽に取れる!](https://www.amazon.co.jp/%E3%82%B9%E3%83%90%E3%83%A9%E3%82%B7%E3%82%AF%E5%AE%9F%E5%8A%9B%E3%81%8C%E3%81%A4%E3%81%8F%E3%81%A8%E8%A9%95%E5%88%A4%E3%81%AE%E7%B5%B1%E8%A8%88%E5%AD%A6%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%91%E3%82%B9%E3%83%BB%E3%82%BC%E3%83%9F%E2%80%95%E5%A4%A7%E5%AD%A6%E3%81%AE%E6%95%B0%E5%AD%A6%E3%81%8C%E3%81%93%E3%82%93%E3%81%AA%E3%81%AB%E5%88%86%E3%81%8B%E3%82%8B-%E5%8D%98%E4%BD%8D%E3%81%AA%E3%82%93%E3%81%A6%E6%A5%BD%E3%81%AB%E5%8F%96%E3%82%8C%E3%82%8B-%E9%A6%AC%E5%A0%B4-%E6%95%AC%E4%B9%8B/dp/4866151021/ref=asc_df_4866151021/?tag=jpgo-22&linkCode=df0&hvadid=310844024129&hvpos=1o1&hvnetw=g&hvrand=18398388376262621955&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009279&hvtargid=pla-627339391834&psc=1&th=1&psc=1)
[確率](https://ja.wikipedia.org/wiki/%E7%A2%BA%E7%8E%87)
[反復試行の確率の公式といろいろな例題](https://mathtrain.jp/hanpukushikou)
[反復試行の確率とは？1からはじめる場合の数](https://linky-juku.com/math-hanpuku1/)
[ベイズの定理の基本的な解説](ｈｔｔｐｓ：／／ｍａｔｈｔｒａｉｎ．ｊｐ／ｂａｙｅｓ)
新人エンジニアが企業面接で自分の市場価値を聞かれ「あ、0円だな」と思った話と改善策。

# 目的
この記事は自分がプログラミング学習を始める前にもう少しこういった心持ちや戦略をしっかり立てて始めてればよかったのかなということを共有したものです。

# この話の背景説明
昨今騒がれているフィリピンのIT留学を現在実際に在籍中の僕が6ヶ月コースの4ヶ月目にしてよしこれからは座学じゃなくて実践だ！！と思い立ち初めて面接を受けた時のお話です。

# お金を 「払って」 ITを身につけるかお金を 「もらって」 ITを身につけるか
僕が受けた企業の事業内容は本当に素晴らしく心躍るものでした。
気に入りすぎてそこの一社しかまず受けたくない思いもう他の企業には目もくれずそことの面接を心待ちにしてました。（これがもう戦略的には間違い笑）
代表の方も非常に気さくな方で話しているうちに本当にいい会社だなと感じ、いざ自分を売り込もうとした時に代表の方から「うん、あなたが作ったWebsiteは実践のプレッシャーの中で作れば1ヶ月ないくらいで完成できるものだね。」と。
もうぐーのねも出ないとはこのことでした。（これでも結構コーディングの勉強はしている方でした）
実際に、いろいろなことを学んでも実際にお金を生み出せるスキルはその企業が必要としているスキルが当然中心となります。
そんな感じで面接も進み、最後に「お給料はいくらがいいですか？」と、今までお給料は会社が決めた額をもらって文句をブーブー言いながら働いてた割にいざこの質問をぶつけられた時の答えは。。。わ、わかんねぇ（汗でした。
もちろん１００万円欲しいですって言ったら即スカイプ面談を切られると思いますので笑
自分を数字に表すってとっても大変だなと痛感しました。。

#2つの問題点と改善策
こういう状況になったのは主に２つの思考が欠けていたから
1.実際の企業の案件や、仕事内容に対する「実践」への意識の薄さ。
2.自分のやってきたことの「整理」が全くできていなかった。

1.結論から言うとこれはバランスを失ってしまったと言うことに尽きます。
もちろんITコースに参加した当初はもちろんあったのですが、どんどんコースが進んでいくにつれてコーディングの勉強に追われる日々になり
自分は当分実践なんておこがましいと思ってしまい、求人や調べるのをやめてしまったんですね。。。
これが本当によくなかった。

２.自分がやってきたことの整理はとにかくアウトプットすることを怠ったことの跳ね返りでした。。
[GitHub](https://github.com/)　や こちらのQiitaなどいくらでもシェアする方法はあったのですが怠りました。
なので、この記事もそうですが、少しでも自分の知識などを外に出し、同じ境遇の方や誰かの参考になればと考えています。

ちなみに、こちらが企業に見せた4ヶ月目の自分のWebsiteです。→[http://sodaihirano.com/](http://sodaihirano.com/)

#まとめ
まぁ、結局思ったことは、
・IT留学してても結局は自分でアンテナはって案件や企業調べてニーズを図りつつ、授業で学んだ知識でどうやって企業に属した時にいかせるかを常に考え、そこでの気づきなどをアウトプットしていかないと一生懸命机に向かって何も実践を想定せずコード書いてても実質的な自分の価値は上がらない。

・逆に少しずつでもアウトプットして残せるものがあればそれを見せてこれ作れますって言えますよね。だからお給料は１００円を希望します。って言える。

それでも、０円よりはマシですよね。笑

以上、僕の体験談でした！
これから少しずつ技術系の記事もあげながら自分の価値に念頭を置き書き進めていきたいと思います！
お読みいただきありがとうございました！
Rails スクレイピングでデータを取得(getメソッド・searchメソッド編)備忘録

# スクレイピングとは
+ 例えば、以下のようなHTMLのサイトがあった場合


```:index.html
<ul>
  <li>TEST1</li>
  <li>TEST2</li>
  <li>TEST3</li>
</ul>
```
```<ul><li>```の中にある「TEST1, TEST2, TEST3」等の値を取り出すことを言う。(ウェブサイト上のHTMLからある特定のデータを抜き出す処理のこと)
# Mechanize
+ Mechanizeはスクレイピングを行うためのGemである。
+ __Mechanizeクラス__が使えるようになる。
+ Mechanizeクラスにはスクレイピングするための様々なメソッドが用意されている。

# GemfileにMechanizeを追記(Railsの場合)
```ruby:Gemfile
# 省略

gem 'mechanize'
```
bundle installすればOK
# Mechanizeクラスで使うメソッドの紹介
### HTML情報から指定のタグ要素の情報を検索する
● __searchメソッド__

+ getメソッドで取得したページの情報が入ったオブジェクトに対して使用する。
+ __該当するHTMLのタグ要素が１つでも、返り値は配列の形式で返ってくる。__

使い方

```
elements = Mechanize::Pageオブジェクト.search('セレクタ')
```
あるウェブページから__h2要素のHTMLの情報を取得する場合__

```ruby:scraping.rb
agent = Mechanize.new
page = agent.get("http://sample.com/")
elements = page.search('h2') # h2要素を検索
puts elements
```
+ 出力結果(例)

```
<h2 class="entry-title index-entry-title">
<a href="/products/1" title="Single Post">sample1</a>
            </h2>
<h2 class="entry-title index-entry-title">
<a href="/products/2" title="Single Post">sample2</a>
            </h2>
<h2 class="entry-title index-entry-title">
<a href="/products/3" title="Single Post">sample3</a>
            </h2>
#以下略
```
__h2要素の下のa要素__のHTML情報を取得してみる

```ruby:scraping.rb
agent = Mechanize.new
page = agent.get("http://sample.com/")
elements = page.search('h2 a') # h2要素の下のa要素を検索
puts elements
```
+ 出力結果(例)

```
<a href="/products/1" title="Single Post">sample1</a>
<a href="/products/2" title="Single Post">sample2</a>
<a href="/products/3" title="Single Post">sample3</a>
<a href="/products/4" title="Single Post">sample4</a>
# 以下略
```
このように、__該当するHTMLのタグ要素全てが取得される。__

+ 以下のようにするとsearchメソッドの返り値が__配列の形式になっている__ことが確認できる。

```ruby:test_scraping.rb
require 'mechanize'

agent = Mechanize.new
page = agent.get("http://sample.com/")
elements = page.search('h2 a') # h2要素の下のa要素を検索
puts elements[0]
```
+ 出力結果

```:ターミナル
<a href="/products/1" title="Single Post">Sample1</a>
```
以上のように返ってきた値の1番目の要素を取り出すことができるので__配列の形式で返ってきている__ことがわかる。
# まとめ
以上でmechanizeを使用したメソッドのうち__getメソッド__と__searchメソッド__の２つを紹介しましたが今日は時間切れなので後日、他の使える便利なメソッドを紹介したいと思う。
職務経歴書（スキルシート）を作ったので公開します。「書くべきポイント」と「アンチパターン」まとめ

Repsona LLCの[@GussieTech](https://twitter.com/GussieTech)です。[「無料でガントチャートとカンバンが使える理想的なプロジェクト管理ツール」Repsona（レプソナ）](https://repsona.com)を作っています。

職務経歴書って書くの大変ですよね。ググるとどうやら何年も前までさかのぼって思い出して、何枚もこまかく書かなきゃいけないみたい、、？

「出してください」と言われたので、そんなことを調べながら、職務経歴書を作りました。せっかく作ったので公開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17680/b39a77a5-c9f6-f914-08b2-dea31b947fd7.png)

## なぜ公開するのか

前職では、Webサービスを提供する上場企業で、技術部門長として3年くらい採用活動をしていました。職務経歴書を**見る側**でした。

職務経歴書を見る作業は時間もかかるし大変だし、**正直たのしい時間ではない**。今回作るにあたって、「おれが面接官だったら、こういうの見たいな、会いたいと思うな」という風に作ってみました。

作ってみたところ、求職時とは違う視点で**「書くべきポイント」**や**「アンチパターン」**が見えてきたので、共有しようと思いました。

## 工夫した点

### 短い
A4 1枚でシンプルにまとめました。印刷もしやすいです。

### カジュアル
色やフォントを工夫して、目を通したくなる印象にしました。

### 濃淡
文字の大きさで濃淡をつけて、アピールポイントがひとめでわかるようにしました。

### 写真
人物像のイメージがつきやすいように写真をつけました。かわりにSNSのアカウントなどでもいいと思います。

## 面接官として重視した点
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17680/56cd19e0-41db-4cda-cc62-bee9161033f2.png)
正社員採用か、プロジェクトチーム組成時かで重み付けは違うと思いますが、**採用する側の立場**として、以下の点は共通して重視していました。

### 自己PR

- 人間的にどんなひとなのか
- 技術以外に何を提供してくれるのか
- お話しして楽しそうか、楽しいか

### 求める人物像か

- 求めるスキルがあるか
- 求める経験があるか
- 能力を発揮することができそうか

### キャリアパスをイメージできるか

- 組織内でどのようなキャリアとなりそうか
- 本人のキャリアイメージと乖離がないか

## アンチパターン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17680/f9ded602-c6a3-205a-8d45-4616609d9eb9.png)

### 長い
忙しい合間に、2-3枚以上読むのは**実は結構しんどい**です。字の大きさや空白の取り方で、読む人の気持ちを考えている人は素敵だなと感じました。

### 誤字
言語名やサービス名など、誤字は要注意です。細部を気にするというのは仕事をする上でとても重要です。単なる字の間違いもありますが、**大文字小文字やスペースの有無**なども要チェックです。

### かたい
システムや業務のかたさではなく、**書類の印象**です。仕事は楽しく、ワクワクしてやりたいと思っています。ガッチガチにかたい印象があると、ちょっと構えてしまいます。

### ベタ
うまく例が出せないのですが、**「なんかこの自己PR見たことあるな」**という印象を受けることがあります。文章の長さよりも、個性が出ると好印象です。

## いい例

**「自分なりに工夫する」**というのが最も重要です。

GitHubで公開する、Markdownで書いちゃう、ポートフォリオサイト作る、Webサービスを使うなど、いろいろなかっこいい手段がありますし、**実はフォーマットに決まりはありません**。

エンジニアの仕事って自分で考えて工夫してアウトプットしていかなきゃいけない。これからエンジニア（ライバル）が増えてきたときに、**どういう人が淘汰されていくのか**想像すると、答えに近いものが見えてくる気がします。

**「職務経歴書さえも自分なりに考えて工夫するような人なんだ。仕事でも工夫してくれるだろうな」**と、僕ならとてもいい印象を持ちますし、会ってみたいと感じます。会ったら、「なぜこういう風にしたのか」聞いてみたいし、そこから話が広がって、楽しくなったら最高です。スキルの話とかは数分話せばだいたいわかるものです。

仕事上、どうしても踏ん張らなきゃいけないときに、踏ん張ってくれる。解決が難しい問題に直面したとき、考えを出し、行動をとってくれる。**そういうパワーはとても魅力的**です。こういう部分は職務経歴書上、行間に埋もれがちですが、ぜひPRしたい点です。

場合によっては、記述フォーマットが決まっていたりする状況もあると思いますが、ぜひ思考停止せずに、工夫をしてみてください。

## テンプレートダウンロード

Qiitaで添付できなかったので、noteに[ダウンロードできるページ](https://note.mu/gussietech/n/naecf6f64d000)を用意しました。ご自由にお使いください。

## まとめ

職場の求める人材、そのタイミング、会社の文化、面接官の性格など、大いに関わってくるので、**きっと正解はありません**。僕はカジュアルでお話しして楽しい人と仕事をしたいと思っていますが、違う視点では、僕の職務経歴書はふざけているように見えてゴミ箱行きかもしれません。

「僕ならこのように一緒に働きたい人を探す」という風に書きました。どういう人と、どういう雰囲気で、どういう仕事がしたいのかを**一生懸命考えて、それを職務経歴書にも反映**してみたらいいのではないかと思いました。

### そんな僕が作っている Repsona

ワクワク使えるサービスにしたいと思いながら開発しています。フリープランでも全機能、ずっと無料で使えます。ぜひお試しください。

[カンバンもガントチャートも情報共有も無料でユーザー数無制限 - チームのためのタスク管理ツール - Repsona
![スクリーンショット 2019-10-02 14.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17680/6a17688c-35aa-8402-5d64-70a365fc8706.png)](https://repsona.com)
UPDATE 文と DELETE 文でインデックスヒントを指定する

# UPDATE 文と DELETE 文でインデックスヒントを指定する

Transact-SQL リファレンス見ても分からなかったので記録. 特に FROM が2回出てくる DELETE 文. ちなみに1つめの FROM は消してもいい(オプショナル).

```sql
UPDATE
    <table_name>
  SET
    <column_name1> = <expression1>,
    <column_name2> = <expression2>,
    ...
  FROM
    <table_name>
    WITH
      (INDEX(<index_name>))
  WHERE
    ...

DELETE
  FROM
    <table_name>
  FROM
    <table_name>
    WITH
      (INDEX(<index_name>))
  WHERE
    ...
```
DockerfileのRUNコマンドを繋げて書く

# RUNをまとめてorつなげて書く

RUNで不要な処理が生まれないように繋げてorまとめて書く
参考
https://qiita.com/c18t/items/f3a911ef01f124071c95

`--squash`オプションを使えばその限りでは無いようですが…
繋げて書きたい！！

# RUNをつなげるにはバックスラッシュ`\`を使う

改行を繋げるだけなら`\`でOK
別の処理が入るようなものをつなげるなら追加で`&&`が必要になります！

```dockerfile
RUN  apt-get -y update \
     && apt-get install -y git \
     && yarn global add @vue/cli -g
```

この時、個人的な好みですが`&&`が先頭に来るように書くと見やすくてなお良しです。

↓こちらの記事の方も同じ意見のようです。
https://qiita.com/yuyakato/items/4e8616ad83d67e35bc5a
bundle install時にインストール先のpathを変える

# bundle install時にインストール先のpathを変える

(anyenv, rbenv利用)

deviseインストール。

ログを見ると、.anyenv/envs/rbenv/以下へdeviseがインストールされ、実行されている。

<img width="1440" alt="スクリーンショット 2019-10-02 14.52.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/dcea5358-58aa-0dc4-3869-3dc763dddd74.png">


bundle install時にpathを指定しないと、rbenvを利用している場合は.anyenv/envs/rbenv/以下にインストールされる。

参考
https://qiita.com/chro96/items/35f67767d0b511939fea

deviseのファイルを編集するのに.anyenv/envs/rbenv/以下だとやりづらいため、プロジェクト以下にインストールしたい。

そのため、bundle install時にpathを指定する。

-j4は bundle install を並列処理するコマンド。
bundle install が早くなる。
https://qiita.com/camelmasa/items/5ca27ab398f105f86c76

```
$ bundle install -j4 --path .bundle
```

これでプロジェクト内に、.bundleというディレクトリが作成され、gemがインストールされ、.bundle/以下にあるファイルで実行されることを確認。

<img width="1440" alt="スクリーンショット 2019-10-02 14.52.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/4681e3a1-ec63-533f-b38e-18de982201f0.png">
主要RDBMSの比較

ちょっと気になったのでまとめてみた。（SQLServerはちょっと内容薄め..ww）

### 主な特徴
- **Oracle** 高額なライセンスフィーだが高機能。RACは独自機能。
- **SQLServer** Microsoftのお膝元。
- **MYSQL** シンプルかつ軽量。高速にSQL文を処理することで定評。
- **Postgre** 拡張性重視。小さいサービスなどに使われることが多い。



### プロセス管理
<font color="Blue">マルチプロセス：クライアントからの接続毎にプロセスを起動する。特定のプロセスに問題があっても影響範囲が少ない。
マルチスレッド：単一のプロセスで動き、クライアントからの接続毎にスレッドが作成。（スレッドの方がオーバーヘッド少ないと言われる。）</font>

- **Oracle** マルチプロセス。必須プロセスと接続毎に起動するサーバープロセスで構成される。インスタンスとは独立してクライアントから接続を受けるリスナープロセスも存在。
- **SQLServer** マルチスレッド。
- **MYSQL** マルチスレッド。
- **Postgre** マルチプロセス。postmasterという管理者プロセスがあり、これが落ちるとおしまい。


### メモリ管理
- **Oracle** プロセス共有のメモリとコネクション単位のメモリがあり、パラメーターで指定可能。
- **SQLServer** ローカルメモリのみ。インスタンスで最大と最小のメモリ数を指定するシンプルなやりかた。
- **MYSQL** 全体管理のグローバルバッファ、スレッド毎のバッファ、ログバッファに分割。グローバルバッファはテーブルやインデックスを管理。多数の接続があると競合を防ぐ目的で分割することもある。
- **Postgre** プロセス共有のメモリとSQL文実行のメモリ領域に分かれる。

### ストレージ
<font color="Blue">通常、RDBMSはテーブル等情報を保存するデータファイル領域と差分データを保存するストレージを持つ。ストレージはクラッシュ時のリカバリに使われる。</font>

- **Oracle** ストレージ管理用インスタンスを使うことができる。DBはそれが管理するディスクグループにファイルを保存。データファイルは初期サイズ等設定可能。ストレージはパスの指定が可能。
- **SQLServer** シンプルな構成で、少数ファイルから成り立つ。DB単位でデータファイルを作成。TXログは動的サイズかつ単一のファイル（他のRDBMSは固定の複数ファイルを循環利用する）
- **MYSQL** 複数のストレージエンジンを利用可。ストレージは任意のデータディレクトリに保存。トランザクションログとして、バイナリログとInnoDBがあり、前者はレプリケーション用のイベント、後者はクラッシュ時のロールフォーワードで使われる。
- **Postgre** ファイルシステムの階層構造をそのままDBに利用。単一のデータベースクラスタ上に保存する。レコードが更新前のデータはそのまま保持され、バキューム処理で領域の開放がなされる（MｙSQL/Oracleでは更新時には更新前データはロールバック・セグメントに移動される）
JavaScript　覚えておくべき注意点！（１）　JavaScriptで扱うデータ型 / 特殊文字の表現方法 / 変数にデータを記憶する方法 / 例


### JavaScriptで扱うデータ型は7種類
　　※データ系とは？　「数値」のデータなら掛けたり割ったりすることができるが、「文字列」を掛けたり割ったりは出来ない。このようにデータにはいくつかの種類があります。

- 文字列(String)-----------'Hello'、"こんにちは"などの文字列
- 数値(Number)-----------100、15.23、-12.5などの数値
- 真偽値(Boolean)---------true、falseの２値で真と偽を表わす
- シンボル(Symbol)-------インスタンスが固有で不変となるデータ型
- null-----------------------null値を意味する特殊キーワード
- underfined---------------値が未定義であることを示す
- オブジェクト(Object)---上記６つのいずれでもない特殊なデータ型

###主なエスケープシーケンス
　　※改行などの特殊文字はそのままでは文字列として表現できないために、バックスラッシュ「\n」で表現されます。この特殊文字のことをエスケープシーケンスと言います。

```javascript:hensuu-data.js
\n       // ---------------------改行する
\t       // ---------------------タブを入れる
\"       // ---------------------""で囲まれた文中に"を入れる
\'       // ---------------------''で囲まれた文中に'を入れる
\\       // ---------------------文字列中にバックスラッシュを入れる
```

###変数にデータを記憶する方法
- 代入演算子「=」を使う方法を「代入する」という。
- 「=」は「左辺の変数に右辺の値を記憶する」という意味である

```javascript:data-kioku.js

// 変数の宣言と利用
var name; // .....................変数宣言
name = 'Taro'; // ................nameに'Taro'を代入
console.log(name); // ............nameをconsole.logで表示

// 宣言と代入を同時にする例

var time = 60; // ................変数timeを宣言し、数値の60を代入
time = time * 60; // .............変数timeに「time * 60」の演算結果を代入
console.log(time); // ............3600

```

###例　ＢＭＩ計算プログラムを作成しましょう
　　※入力　→　処理　→　出力
　　
　　入力：体重・身長の値を得る
　　処理：体重と身長をもとにＢＭＩの値を計算する
　　出力：計算結果をダイアログボックスで表示する

　　この流れでプログラムを組み立てる

```javascript:reidai.js

// 体重の数値を得る
var weight;
weight = prompt('BMIを測定します。まずはあなたの体重（kg）を入力してください');
// 身長の数値を得る
var height;
height = prompt('BMIを測定します。次にあなたの身長（m）を入力してください');
// 体重と身長からBMIを計算して、警告ダイアログに表示する
var bmi = weight / (height * height);
var message = 'あなたのBMIは「' + bmi + '」です。';
alert(message);

```
【インフラ】問合せフォームで蹴られた意外な理由とは？

※ 実話です (´・ω・｀)

# 皆さんも考えてみてください

ある企業（Ｄ社）に問い合わせをするため、
Ｄ社のｗｅｂサイトの「問合せフォーム」を利用しました。

>
>●氏名
>ほげほげ太郎
>
>●返信用メールアドレス
>xxxx@example.com
>
>●問い合わせ内容
>かくかくしかじか。かくかくしかじか。かくかくしかじか。
>

これらを記入し投稿しました（ブラウザ上は正常終了）。
すると記入したメールアドレスに、下記のメールが届きました。

>
>●件名
>Mail delivery failed : returning message to sender
>
>●本文
>This message was created automatically by XXXXXXX.
>
>A message that you sent could not be delivered to all of its recipients.
>This is a permanent error. The following address(es) failed:
>
>  xxxx_xxxxxxx_xxxxx@xxxxxxxx.com
>    host xxxxxxxx.xx.xxxxxxxxxxx.com [XX.XX.XX.XX]
>    SMTP error from remote mail server after end of data:
>    553-SPF (Sender Policy Framework) domain authentication
>    553-fail. Refer to the Troubleshooting page at
>    553-http://xxx.xxxxxxxxxxxxx.com/troubleshooting for more
>    553 information. (#5.7.1)
>

さて、これは何を意味するのでしょうか？
問合せフォームと、何か関係あるのでしょうか？
そもそも問い合わせは、受理されたのでしょうか？

# 解答

問い合わせは、**受理されなかった** 可能性が高いです。
上記の英文メールも、問合せフォームに関係があります。

# 解説

上記の問合せフォームは、おそらく、投稿内容をメールで転送する仕組みです。
私たちがフォームで投稿すると、Ｄ社の問合せ担当にメールが届きます。

それ自体は問題ありません。しかし、転送メールの組み立てに問題がありました。
**メールの差出人(From)**、および、**エンベロープFrom(Return-Path)**に、
私の記入した「返信用メールアドレス」をセットしていました。

つまり、あたかも私のメールアドレスから直接、
Ｄ社に送信したように加工していたのです。

これは何を意味するでしょうか？
そうです。**「なりすまし」**です！ 上記の加工は、From の偽装そのものです。

From 偽装のメールを、Ｄ社のメールサーバに送ると どうなるか？
（実際はＤ社からＤ社へ送っているのですが）
スパム判定ツールが「なりすまし」と見なし、メールを拒否します。

そりゃそうです。Ｄ社のＩＰアドレスからは来るはずのない
差出人 xxxx@example.com のメールが飛んでくるのですから。

しかも面白いことに、拒否されたという通知（冒頭の英文メール）が、
Return-Path の xxxx@example.com （つまり私）に送られたのです。
私は なりすましメールなど送っていないのに、です。

（フォーム投稿しただけなんだけど。）

# 疑問

ただ それだと、すべてのフォーム投稿が拒否されるはずです。
投稿のたびに なりすましメールが送信され、スパム判定され、
捨てられるのですから。

でも実際は逆で、ほとんどの問い合わせがスパム判定にパスし、
受理されているに違いありません。

じつは、記入したメールアドレス（xxxx@example.com）だから
拒否された理由があったのです。

# ＳＰＦ

冒頭の英文メールのＵＲＬにアクセスすると、このような説明がありました。

>
>If the Env Sender publishes a hard-fail SPF policy and the inbound email fails SPF verification,
>the action of block and delete will be enforced and a 5xx error is returned to the sender.
>SPF records set to soft-fail will not trigger the action.
>

要するに なりすましの場合、ＳＰＦに `-all`(hard-fail) の設定があれば
エラーとして扱います。ただし `~all`(soft-fail) なら受理します、と。

たしかに xxxx@example.com のＳＰＦは、
`-all`(hard-fail) という厳密な設定をしていました。
それゆえ、問い合わせがエラーとして扱われたのでしょう。

# いやいや（笑）

Ｄ社の担当者さん、そうじゃないでしょう。
じゃ、ＳＰＦに `-all`(hard-fail) は使えないのですか？
ウチが `~all`(soft-fail) に変えなきゃいけないのですか？

Ｄ社内で勝手になりすましメールを送って、
これまた勝手に拒否しているんでしょう？
変えるとしたらＤ社の問合せシステムですよね？

まずメールの差出人(From)を、Ｄ社の固定のメールアドレスにする！
（これで、なりすましでは無くなります。）

そして必要なら、返信用メールアドレス（xxxx@example.com）は
Reply-To に設定する！（決して From, Return-Path ではない。）

（あるいは問い合わせの転送メールのみ、スパム判定をスルーするとか。）

# 強制 問い合わせ！

さて、愚痴ったところで、このままでは永遠に問い合わせができません。
私は以下をおこないました。

じつは冒頭の英文メールには、本来 届くはずだった問合せメールが添付されていました。
その内容を そっくりそのままコピーし、私のＰＣのメーラーから送りました。
正規のＩＰアドレスから送るのだから、今度は なりすましではありません。

（もし届いたとき、Ｄ社の担当者がメールを見たら、
「なんかフォントが違うなぁ」くらいは思ったかもしれません。）

結局、問い合わせは受理されたようで、後日 回答メールが届きました。

# コマンド

ＳＰＦ（ＴＸＴレコード）の確認は、Linux(CentOS7)の場合、`dig` を使います。

`dig txt xxxx.com`

# 参考

[SPF（Sender Policy Framework） : 迷惑メール対策委員会](https://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/)
Composerいろいろ

## バージョンを調べる

```bash
$ composer -V
Composer version 1.8.6 2019-06-11 15:03:05
```

## バージョンアップ

```bash
composer self-update
```

## Composer管理パッケージのバージョンを調べる

```
composer sh
composer sho
composer show
```

上記どれでも良い。
`-i` は古いと怒られる (`You are using the deprecated option "installed". Only installed packages are shown by default now. The --all option can be used to show all packages.`) ので注意。
Raspberry Pi上のNode-REDにパスワードを設定するスクリプト

# Raspberry PiにおけるNode-REDで、セキュリティ設定を実施する

[Raspberry PiにおけるNode-REDの活用について](https://qiita.com/utaani/items/7155c62d6c5e96822afb) に [記載したように](https://qiita.com/utaani/items/7155c62d6c5e96822afb#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%AD%E5%AE%9A)、 RaspbianでNode-REDを動作させるとpiユーザで実行されるため、Flow Editorからexecノードを使われてしまうと管理者権限でRaspberry Piの全操作が可能になってしまいます。

まったくインターネットからアクセスできないRaspberry Piでも、最低でもログイン画面設定は実施する必要がありますが、[settings.jsの編集が必要](https://qiita.com/utaani/items/7155c62d6c5e96822afb#flow-editor%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%94%BB%E9%9D%A2%E8%A8%AD%E5%AE%9A-%E9%87%8D%E8%A6%81)なため、初心者には難しいという話がありました。

そこで、settings.jsを編集しパスワードを設定する「nrpiadminpass.sh」というスクリプトを作成しました。
nrpiadminpass.sh
https://gist.github.com/utaani/2243b7501a2cde52d93cb85c91f173e8

このスクリプトを使うことで、settings.jsをエディタで編集しなくてもFlowEditorのセキュリティ設定ができます。

## スクリプト導入方法
```
wget https://gist.githubusercontent.com/utaani/2243b7501a2cde52d93cb85c91f173e8/raw/94b8c72c8a358670e0eb389b30de58993adbe6f8/nrpiadminpass.sh
```
なお、URLが長いので、githubで提供されている[短縮URLサービス](https://blog.github.com/2011-11-10-git-io-github-url-shortener/)を使って https://git.io/nrpiadminpass.sh という短縮URLを作りましたので、

```
wget https://git.io/nrpiadminpass.sh
```
でも導入可能です。

## スクリプト実行方法
bashスクリプトですので、

```
bash nrpiadminpass.sh パスワード文字列
```
で実行可能です。

直接 ```/home/pi/.node-red/settings.js``` を編集しますので、Node-REDを一度も起動していないRaspberry Piで実行するとエラーになります。その場合は、一度 ```node-red-start```で起動した後、実行してください。

また、すでに手動でsettings.jsを編集された場合にはエラーになり動作しませんので、その場合は

```
    //adminAuth: {
    //    type: "credentials",
    //    users: [{
    //        username: "admin",
    //        password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
    //        permissions: "*"
    //    }]
    //},
```
のように、元の形式に編集しなおしてから実行してください。

実行後は、以下のようにadminAuthの行のみコメントが外され、bcryptされたパスワードが設定されます。

```
    // Securing Node-RED
    // -----------------
    // To password protect the Node-RED editor and admin API, the following
    // property can be used. See http://nodered.org/docs/security.html for details.
adminAuth: { type:"credentials", users: [{ username: "admin", password: "$2a$10$MQFIBU4L6ZhkznKMt2Dh6ucb1xQwLqjPUOB5ZrwwUOgU2ttkuzAlq", permissions: "*" }] },
    //    type: "credentials",
    //    users: [{
    //        username: "admin",
    //        password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
    //        permissions: "*"
    //    }]
    //},
```

ファイル編集しただけでは、実行中のNode-REDには影響しませんので、```node-red-restart```コマンドでNode-REDを再起動してください。FlowEditorにログインしている場合は、ブラウザをリロードする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/90b10480-f344-d473-a957-cc9024a9af42.png)

このように認証ダイアログが表示されたら設定完了です。なお、このスクリプトでは、ユーザ名はadminに固定されますので、パスワードにスクリプトで指定したパスワード文字列を入力してログインできます。

パスワードを変更したい場合は、もう一度

```
bash nrpiadminpass.sh 新しいパスワード文字列
```
で変更できます。設定時と同様に```node-red-restart```コマンドでNode-REDを再起動する必要があります。さらに、FlowEditorにログインしている場合は、右上のメニューより一度ログアウトする必要があります。
2019/10/1のApp StoreのTier改訂の罠

割と混乱したのでまとめておきます。
Appleの対応イマイチですね。

# 忙しい人のための時系列まとめ
2019/9/25(水) 突然AppleからDeveloper向けにTier変更メールが来る
[変更後Tier](https://itunespartner.apple.com/assets/downloads/180919Japan.pdf)

※Tier: App Storeで有料アプリを出したり、アプリ内課金をする際にAppleが定めた価格表のこと
　　　　iOSアプリ開発者はこの価格表以外の価格で販売することはできない

2019/10/1(火) 日系企業がTier対応のためメンテナンスに入る
　　　　　　　　**が、変更されず**
2019/10/2(水) 9：30頃、突如反映

# 突然のメール
7日ほど前に、突然こんなメールが来ました。

> Dear EverGree,

> When taxes or foreign exchange rates change, we sometimes need to update prices on the App Store. Starting October 2019, the Japan Consumption Tax (JCT) will increase from 8% to 10%, resulting in a price increase for apps on the App Store and in-app purchases (excluding auto-renewable subscriptions) in Japan. Once this change goes into effect, the Pricing and Availability section of My Apps will be updated and your proceeds will be increased accordingly. You can change the price of your apps and in-app purchases (including auto-renewable subscriptions) at any time in App Store Connect. For subscriptions, you have the option to preserve prices for existing subscribers.

> Note that Apple does not administer the collection and remittance of JCT applicable to sales to customers purchasing content on the App Store in Japan. You will continue to be responsible for the collection and remittance of such taxes to the appropriate tax authorities, as may be required by local law.

> View updated [price tiers](https://itunespartner.apple.com/assets/downloads/180919Japan.pdf)

> If you have any questions, contact us.

> Best regards,
> Apple Developer Relations

和訳はちょっとしんどいので書きませんが、
要は「消費税上がるんで、価格表変えます。対応よろしく😁」です。

- 日本語  
[日本のApp Storeの価格に影響を与える税金の変更について](https://developer.apple.com/jp/news/?id=09232019a)

# いつ？？？
アナウンスをどれだけ読んでも、いつ変更が実行されるのかが読み取れません。
多くのソシャゲ会社は10/1から臨時メンテナンスに入って、App Storeの価格変更に備えていました。
しかし、待てど暮らせど変更はされませんでした。

Appleの本社があるカリフォルニア州と日本の時差が16時間なので、
日本時間16時なのでは？？？　と思っていたらこれもハズレました。
正解は現地時間で １０/1 17:30頃。日本時間10/2 9:30でした。

- ご参考  
[App Store、価格改定が反映されず　『FGO』など複数のタイトルでメンテナンス延長や一部アイテム販売が停止に](https://gamebiz.jp/?p=249821)

# サブスクリプションについての誤解
以上はAppleの「これはひどい」対応の概要だったんですが、個人的に1番影響出たのはサブスクリプションの部分でした。

> Starting October 2019, the Japan Consumption Tax (JCT) will increase from 8% to 10%, resulting in a price increase for apps on the App Store and in-app purchases (excluding auto-renewable subscriptions) in Japan.

この部分↓ですね。

> a price increase for apps on the App Store and in-app purchases (excluding auto-renewable subscriptions)

ここ↓です。

> (excluding auto-renewable subscriptions)

そう。
**自動更新のサブスクリプションは値上げ対象外**でした。
ちゃんと調べたら、サブスクリプションのTierは、他の課金要素のTierとは別テーブルでした。
そのテーブル表を見せたいところなんですが、App Store Connectの深いところにあって、リンクするのが難しいので、自分で探してください。
（すみません。。。公開リンクがあればコメントでこっそり教えてください）

# 教訓
Appleから来た英語の文章は、大まかに意味を把握してOKにしないで、隅々まで読む。

# 過去の対応
[突然のApple Tier変更に伴い過去の増税や歴史をまとめてみたよ](https://qiita.com/a-nishimura/items/6c6d40ec1be329b68b21)
Gofeed利用時に発生した「Failed to detect feed type」の対応

# 現象
Cloud Functionsを利用して、gofeedでブログをパースしようとしたところ、以下のメッセージと共にエラーが発生。

```
  Failed to detect feed type
```

```go:main.go
  fp := gofeed.NewParser()
  feed, _ := fp.ParseString(xmlData) // ここでエラー
```

原因切り分けのために条件を変えて実行したところ、以下がわかった。

- エラーが発生しないブログもある
- ローカルで実行するとエラーにならない


# 環境
- Golang 1.11.0
- gofeed v1.0.0-beta2
- Google Cloud SDK 264.0.0

# 原因
httpアクセスする際のCloud FunctionsのIPアドレスがブログ側からブロックされてしまったためと思われる。

# 対応
Cloud Functionsのregionをasia-northeast1からus-east1に変更したところ、正常に処理が完了した。

## 参考
https://github.com/mmcdole/gofeed/issues/75
https://github.com/mmcdole/gofeed/issues/96
Laravelで複数のデータベースを跨ぐテストを実施する際のトランザクションの設定

# 背景

LaravelのPHPUnitで

```php
use DatabaseTransactions;
```

を使用すると１つのデータベースへのトランザクションしか受け付けてくれない。
複数のデータベースを跨ぐトランザクションの設定を実施するには

`connectionsToTransact`

を使用する。

## 具体例

```php

use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\TestCase;

class HogeTest extends TestCase
{
    use DatabaseTransactions;

    protected $connectionsToTransact = ['mysql1', 'mysql2'];
```

## 参考

[Multiple databases and testing](https://laracasts.com/discuss/channels/testing/multiple-databases-and-testing?page=1)
C#でかみ砕いたデザインパターン:TemplateMethod

過去に教えて頂いたデザインパターンの一つ
テンプレートメソッドパターンをアウトプット
（間違ってるかも）

[デザインパターン:TemplateMethod]
(https://qiita.com/shoheiyokoyama/items/c2ce16b4f492cd014d50#abstract)
を参考にJAVAをC#に変えて記述にしております。

Class1.cs

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Class1
{
    public abstract class AbstractDisplay
    {
        public abstract void Open();
        public abstract void Print();
        public abstract void Close();

        public void Display()
        {
            Open();
            for (int i = 0; i < 3; i++)
            {
                Print();
            }
            Close();
        }
    }
    public class CharDisplay : AbstractDisplay
    {
        char ch;
        public CharDisplay(char ch)
        {
            this.ch = ch;
        }

        public override void Open()
        {
            Console.Write("***");
        }

        public override void Print()
        {
            Console.Write(ch);
        }

        public override void Close()
        {
            Console.WriteLine("***");
        }
    }
    public class StringDisplay : AbstractDisplay
    {
        private string str;
        private int width;
        public StringDisplay(string str)
        {
            this.str = str;
            this.width = str.Length;
        }
        void PrintLine()
        {
            Console.Write("+");
            for (int i = 0; i < width; i++)
            {
                Console.Write("-");
            }
            Console.WriteLine("+");
        }

        public override void Open()
        {
            PrintLine();
        }

        public override void Print()
        {
            Console.WriteLine("|" + str + "|");
        }
        public override void Close()
        {
            PrintLine();
        }
    }
}
```

Program.cs

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            AbstractDisplay cd = new CharDisplay('T');
            cd.Display();
            AbstractDisplay sd = new StringDisplay("Design Pattern");
            sd.Display();

        }
    }
}
```

２３/１個目
attr_accessorについて

#attr_accessorについて

attr_accesssorは外部からインスタンス変数を参照できるようにするために使用するメソッド。（厳密には、参照と書き込みの両方が行うことができる。）initializeで定義したインスタンス変数を外部から参照または、変更ができるようになる。
ex: attr_accessorの使用例

```ruby
class Product
  attr_accessor :id
  
  def initialize(name)
    @id = name
  end

  def name
    "#{@id}-Product."
  end
end

#　=> コンソール
a=Product.new("sample")
=> #<Product:0x000056145a7f3d10 @id="sample">
a.name
=> "sample-Product."

#インスタンス変数を参照可能
a.id
=> "sample"
#　インスタンス変数を変更可能
a.id = "red"
=> "red"
a.name
=> "red-Product."
```

##\#initializeとは？　
インスタンスを初期化したいときに実装したい処理を定義する場所。外部から呼び出せない。（デフォがprivateメソッド）引数をつければ、newする時に引数が必要となる。initialize内でインスタンス変数を作成すれば、クラス内でそのまま参照できる。しかし、インスタンス変数を外部から参照はできない。

```ruby
class Product
  def initialize(name)
    @id = name
  end

  def name
    "#{@id}-Product."
  end
end

# => コンソール
a=Product.new('aa')
=> #<Product:0x0000558c6c72a508 @id="aa">
a.name
=> "aa-Product."
#　外部からの参照はできない
a.id
=> NoMethodError: undefined method 'id'
```

##initializeを使用せずにクラスを作成してみた。
initializeがないため引数をつけるとエラーが出る。初期化時の実行が定義されていないため！
引数なしで作成し、インスタンス変数に値を代入すれば、メソッドでもインスタンス変数をして出力できた。


```ruby
class Product
  attr_accessor :id

  def name
    "#{@id}-Product."
  end
end

# =>　コンソール
# 引数をつけるとエラーが出る
a=Product.new("sample")
ArgumentError: wrong number of arguments (given 1, expected 0)
# 引数なしなら作成できる
a=Product.new          
=> #<Product:0x000055eca644b478>
#　値を代入していないためnil
a.id
=> nil
a.name
=> "-Product."
# attr_accessorがあるため、代入は可能
a.id = "sample"
=> "sample"
# 代入後はメソッドなども問題なく使用できる
a.id
=> "sample"
a.name
=> "sample-Product."
```
株式会社セレスさんの3daysインターンシップに参加した話

# 株式会社セレス3daysインターンシップ

![IMG_8170.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427079/6bb6580e-a01f-19f8-c58b-56a6ba9f2cff.jpeg)

##【インターンシップの概要】
>Day1：アイディアソン
テーマに沿って新しいメディアを自分達で考えてみましょう！ とはいえ、アイディア出しって何からするの？という方もいるかもしれませんが、心配いりません。 しっかりとアイディア出しのノウハウや企画のコツをお教えします！

>Day2：ハッカソン
1日目のアイディアソンで出たアイディアを、実際にカタチにしてみましょう！ チームで開発を行うので、自分の知らない技術や得意な技術を教え合う事もあります。

>Day3：ハッカソン＆成果発表
最終日は成果発表を行ってもらいます。開発と同時進行で自分たちの成果をまとめたプレゼンの準備も進めていきましょう。 発表後はプロのエンジニアからフィードバックを行うので、今後の開発に役立ててください！

*※サポーターズ引用*

1日目は色々なアイデア出しの手法を教えてもらった。
###Break the bias
否定、逆説からアイデア出しをする手法。
調べすぎないのも重要
###シナリオグラフ
いつ、誰が、どこで、何した、という４点から選択肢をピックアップして物語にすることでアイデアを生み出すフレームワーク
###ブレスト
1. 批判しない
2. 自由発言
3. 質より量
4. アイデアのシナジー　

などなど...


##【実際に製作したサービス】
[ライブ後の感動をファン同士で共有できるサービス「Yo-in」] (https://www.slideshare.net/KanadeIshida/yoin-178248972)
>好きなアーティストのライブに参戦した後って、なんだか悲しい気分になりませんか？虚無感というか...（特にぼっち参戦だったら）そんな人たちのためにライブ後にファン同士で交流できるサイトを作りました！
ライブ映像というのは全てが映像化されて永遠に保存できるものではなく、「あのとき〇〇が手振ってくれた！」などのその時のその場でしか味わえない感動があると思います。そういった「鮮度の高い感動をその場で共有できるお友達ができたら嬉しい」という方のためのアプリです。自分の参戦するライブが決まったらこのサイトを通じてファンの交流会に参加して仲間を見つけてみませんか？ぜひ「余韻」に浸ってみってください！

##【エンジニアの方々のフィードバック】
>・今はツイッターで行われている気がする。そっからデータ取ってきたりすればいいかも？
・「発狂」にフォーカス当ててるところ評価する
・最近だとマップアプリで検索するとすぐ出てきそう…
・どういう風な提案かと思いきや二次会提案サービスでちょっと残念。
・ライブ本体にどうやって寄生するのかが難しそうに感じました
・ライブに限らなくてもいいんじゃないじゃなあ。
・いいね！
・作り込まれていてよかったです。
・ライブの後はカラオケや食事に行きたくラリますよね！駅も混んでますし…。
・お疲れ様です。プレゼンがすごく上手でした！ライブの後に飲み会行きたいのは分かります！ただLIVEならではの工夫が欲しいです。今回のデモストーリーだと、普通の飲み屋予約サービスとの違いがわかりませんでした。
・プレゼン資料が見やすく、説明も聞きやすくて良かった
・twiplaなんかで募集してたりするので、専門のサービスを作るのもアリだなと思いました。
・感動を共有したい、帰るまで→ライブ後の居酒屋探し・・・？
・3日間お疲れ様でした！サービスもデザイン含め凄くよくまとまっていました！ライブとかの後に余韻を共有したいというのは非常にニーズがありそうだと思いました。
・発想も面白いと感じ、ライブ会場やレストランとの場所の連携もとれていて機能性も良いと思った。空席が分かるのも、ユーザー・レストランニーズ満たせて良いと感じました。
・マネタイズが少し弱い気がしました。サイトの作りはきれいな感じにまとまっていたと思います。
・デザインがきれいで良かったです。
・余韻で乗っかる系のサービスは良さそうですね。集客は何もしなくてもできそう。
・ライブに限らず色んな余韻を共有しあえるといいのかなとも思ったり

##【インターン終えての感想と反省】
・Twig,slim,PHP, Bootstrapなど知らない技術ばかりだったけれどフレームワークやチートシーををとても丁寧に用意してくれていたのでそれなりに形にして実装することができた。
・チームの中でタスクと進捗を共有する時間を十分に取ったことで、時間内に作り上げることができた。
・枝葉末節にとらわれず、とりあえず「最低限動くものを作る」という感覚を養うことができた。
・既存のソーシャルアプリ（twitterなど）との違い、「なぜこのアプリでなければいけないのか？」をうまく伝えられなかった。
・他にも実装したい機能はたくさんあった。
今更だけどぬるぽ

#ぬるぽってなんですぞい
Javaと付き合うのであれば一生ついてくるであろうNullPointerExceptionという例外で
海外ではNPE等と略されてる
参照型で参照する値がないときに参照しようとするとおこるやつ

#ぬるぽがわかれば参照型がわかる

## 参照型
参照型とは変数の内部に、実際の値が入っているメモリのアドレスを持っている型で、
例として
`String x = "あ"`
と定義したとすると、このときにxに実際に格納されているものは "あ" のメモリ上のアドレスとなっている。
つまり 
`x = 0001`
`0001 = "あ” `
みたいな感じになっている。

## 住所不定無職
さて、いよいよぬるぽはどうしておこるのかですが
nullという状態はさっきの変数xのアドレスが未定義の状態のことで
`x = null `
とすると
`x = 未定義`
`0001 = "あ"`
みたいにメモリにデータがあってもなくても実際のデータがある場所がわからない状態に、
このときに x を使おうとすると 「ふえぇ、住所わっかんないよぉ〜><」 と言う感じでぬるぽになります。
つまりNullPointerExceptionは住所不定無職の人に会おうとしても住所がなくて会えないって感じです。
【iOS】タブページャーOSSのParchmentでSelf-Sizingを行う

iOSのタブページャーOSSはXLPagerTabStripというライブラリが有名ですが、カスタマイズが効きにくくメンテナンスが最近されていていないので、Parchmentというライブラリを使ってみました。

ただ、普通にやるとSelf-Sizingに対応していないので、いくつか工夫をして解決しました。

案件で使っているコードを雰囲気コードとして抽象化して取り出したので、基本的にはアイデアの参考になるコードとして見て貰えると嬉しいですが、動かなかったら教えて下さい。

# 要件
テキストと画像の混じったタブアイテムをセルフサイジングさせたい。

# コード

Self-Sizingサイズは`PagingViewControllerDelegate`を設定することで実現可能です

```swift:ViewDidLoad.swift
let pagingViewController = PagingViewController<TabItem>()
pagingViewController.delegate = self
```

delegateの`pagingItem`がHashableで帰ってくる関係上、`hashValue` でアイテムを引っ掛けてサイズを返すしか方法が思いつかなかったので、そのアイデアで実現しました。

```swift
enum TabItem: Int, PagingItem, Hashable, Comparable, CaseIterable {
    case first
    case second
    case third
    case fourth
    case fifth

    enum TabType {
        case label(String)
        case icon(UIImage)
    }

    var tabType: TabType {
        switch self {
        case .first:
            return .icon(UIIImage(named: "yourImage")!)
        case .second:
            return .label("second")
        case .third:
            return .label("third")
        case .forth:
            return .label("forth")
        case .fifth:
            return .label("fifth")
        }
    }

    static func < (lhs: NewsTabItem, rhs: NewsTabItem) -> Bool {
        return lhs.rawValue < rhs.rawValue
    }

}

private extension TabItem {

    private var sideMargin: CGFloat { return 15 }

    func estimatedWidth(font: UIFont) -> CGFloat? {
        switch tabType {
            case .label:
                let textWidth = (text as NSString).size(withAttributes: [.font: font]).width
                return sideMargin + textWidth + sideMargin
            case .icon:
                let imageWidth: CGFloat = 15
                return sideMargine + imageWidth + sideMargine 
        }

    }

}

extension MyPagingViewController: PagingViewControllerDelegate {

    func pagingViewController<T>(_ pagingViewController: PagingViewController<T>, widthForPagingItem pagingItem: T, isSelected: Bool) -> CGFloat? where T: PagingItem, T: Comparable, T: Hashable {
        guard let tabItem = TabItem.allCases.first(where: { $0.hashValue == pagingItem.hashValue }) else {
            return nil
        }
        return tabItem.estimatedWidth(font: .descriptionBold)
    }
}

```
再帰してディレクトリ内のファイルの行数を個別に表示する

末尾が `_spec` のファイルは除外している

```ruby
# 全ファイルの行数を吐き出すlinuxコマンド (rubyはバッククォートにするとシェルを直接実行できる)
`for file in $(find . -name "*.rb"); do wc -l $file; done > ./tmp/lines.txt`
  open('./tmp/lines.txt', 'r') { |f| f.inject([]) { |r, l| r << l.split(" ") } }.sort{|a, b| a[0].to_i <=> b[0].to_i }.each {|i| puts i.join(" : ") unless i[1] =~ /_spec/  }
  
```

よくよく考えたらシェル使わずに ` Dir.glob ` でパス取ってきてやるでもよかったな...
remote server setting on rsyslog 


リモートサーバーに対してSyslogを送信する場合、下記の通り設定する。意味は以下の通り。

「```*.*```」：すべてのログを対象とする
「```@@```」：TCPプロトコルを使用する。UDPの場合は＠のみ。
「```127.0.0.1:514```」：Localhost（127.0.0.1）のWell-known port(514)を使用する。


```
# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
*.* @@127.0.0.1:514
# ### end of the forwarding rule ###
```

設定後は、rsyslogを再起動する必要あり。


```
[root@ip-172-31-13-174 ~]# systemctl restart rsyslog
```


対抗側でポートが適切に開いているかどうかは下記を実施すればOK。下記の場合は514が開いているので問題なし。


```
[root@ip-172-31-13-174 ~]# ss -nltu | grep 514
udp  UNCONN 0      0                               0.0.0.0:514          0.0.0.0:*                                                                               
tcp  LISTEN 0      50                                    *:514                *:*  
```
福岡県の交通事故（平成30年）はどのような場所で起きているのか．

#どのような結果となったか
とりあえず，全てマッピングしてみた結果
<img width="1183" alt="スクリーンショット 2019-10-01 21.43.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431266/2cf32bbe-3c64-2422-2a7d-8d58a5396c95.png">

<br>
死亡事故のみをマッピングしてみた結果
<img width="1183" alt="スクリーンショット 2019-10-02 12.52.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431266/1edc6ab5-1464-39bb-9705-2985be46220a.png">


#利用したデータ
以下からダウンロード．
https://www.open-governmentdata.org/fukuoka-pref/#topPage
https://ckan.open-governmentdata.org/dataset/401000_koutsuujiko2018

#準備・マッピング
※交通事故ではあまりにも多かったので，今回は死亡事故のみを対象にしました．
Google Driveにダウンロードしたexcelファイルをcsvファイルに変換して保存する．

Google Driveにマウントする．

```
from google.colab import drive
drive.mount('/content/drive')
```

<br>
simplekmlをインストールする．

```
pip install simplekml
```

<br>
csvファイルがあるディレクトリに移動する．

```
%cd /content/drive/[csvファイルの所在]
```

<br>
importするもの

```
import simplekml
import pandas as pd
```

<br>
csvファイルを読み込む．

```
data = pd.read_csv("h30.1-12.csv")
```

<br>
この2行を一つにできると思いますが，これしか思いつかなかった．

```
temp = data[data['死者数'] > 0]
temp2 = temp[['発生場所経度', '発生場所緯度']]
print(temp2) #確認

           発生場所経度     発生場所緯度
238    130.544670  33.245694
403    130.448324  33.523743
726    130.484980  33.689822
1074   130.848454  33.609312
```

<br>
緯度経度情報をリストへ

```
longitude_latitude_list = temp2.values.tolist()
```

<br>
kmlファイルを作成する．

```
kml = simplekml.Kml()
for d in longitude_latitude_list:
  kml.newpoint(coords=[(d[0], d[1] )])  # 経度，緯度
kml.save("fukuoka_deadly_accident.kml")
```



#結果
最初に示した結果と同じです．
なんとなく北部が多い気がしますね．
<img width="1183" alt="スクリーンショット 2019-10-02 12.52.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431266/e0b04651-156c-aa84-5004-55518ba5bf81.png">

<br>
実際に，どのような場所で起きているのか？
<img width="1183" alt="スクリーンショット 2019-10-02 12.42.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431266/7b251f5d-24de-51de-a195-d9b69439d587.png">

<img width="1183" alt="スクリーンショット 2019-10-02 12.50.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431266/2c89d93b-3848-8329-0dd8-8a41c02b73c5.png">

<img width="1182" alt="スクリーンショット 2019-10-02 12.52.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431266/f93a8f3f-1ac1-14f3-a16a-4aee5442f15f.png">

<img width="1182" alt="スクリーンショット 2019-10-02 12.57.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431266/a31abbf2-7302-35bc-7ba5-94fe089854b4.png">

<img width="1182" alt="スクリーンショット 2019-10-02 12.58.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431266/d2c6dd43-d564-da7d-43c3-3334adc99b4f.png">


交差点が多いかと思いましたが，見通しの良い直線道路も多く含まれていることが見てわかります．
福岡県民ではないので，詳しい周辺の状況はわかりませんが，このような場所には交通事故を予防する工夫が必要かもしれません．
最後に，データ提供者である福岡県に感謝いたします．

#関連のある投稿
<a href = https://qiita.com/y-s-y-s/items/a40fcf8f27b192ef37c7>Google Earth Proとsimplekmlを使って，マッピングしてみる</a>
Google Colaboratory のオススメ設定

# 1. 「Python 3 の新しいノートブック」　を使う。

いまだに Python 2 が選択可能になっていますが、混乱の元。 Python 3 を使おう。

<img width="1038" alt="スクリーンショット 2019-10-02 13.32.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/b185c6e4-bd65-46dd-fa41-6fc6da0a4e90.png">


# 2. エディタ設定でインデント幅を「４」にする。

デフォルトは「２」になっているようだけど、これだとインデントが見にくくて困る。PEP８でもインデントは「スペース４」が推奨されている。行番号も表示するとデバッグしやすい。

<img width="1009" alt="スクリーンショット 2019-10-02 13.27.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/8dfceff5-dc6b-e18f-78f6-1b1fa18ec5dc.png">

# 3. 「猫モード」にする。

ぬこかわいい

<img width="1009" alt="スクリーンショット 2019-10-02 13.27.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/f75b7948-c0f6-d2d9-94e2-d75046ae1223.png">

<img width="1042" alt="スクリーンショット 2019-10-02 13.26.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/39c83c67-0431-5ee5-1a82-8af27756700c.png">
はじめまして

はじめまして　みなさん、
私はメキシコ人のデベロッパーです、日本ではたらきたいですから、このブログでプログラミングのトピックについて書きますよ。
毎日、PHPとLaravelで仕事をしていますが、日本ではこの言語「げんご」はあまり見たことがありません。

げんざい日本語とGolangを勉強していて、いつか日本ではたらきたいです。　
スペイン語とえいごがわかりますが、日本語が少しわかります、
１２月にN5のしけんを受けますから。がんばります！
このブログで日本語をれんしゅうしたいと考えています。

みなさん、　どうぞよろしく　おねがいします。