読者です 読者をやめる 読者になる 読者になる

小さなエンドウ豆

まだまだいろいろ勉強中

国土数値情報の鉄道データ(shp)をgeojsonへ変換

手順

  1. データ のダウンロード
  2. QGISのインストー
  3. .shp -> .json の変換

それぞれ説明します。

データのダウンロード

データはこちらです。
このページの下の方からダウンロードしてきます。
データが年度で分かれているのですが、27年をダウンロードしました。

QGISのインストー

Macの場合、ここから
今回はおそらく最新のQGISのバージョン2.18.7-1 をダウンロードしました。
DLが済むとzipファイルを展開して、GDALとmatplotlib、QGISインストーラを起動します。

開発元が未確認のため開けません についての解決法

単にクリックしてインストールしようとしたところ「開発元が未確認のため開けません」というメッセージが出てインストールできませんでした。
解決策として、右クリックで「このアプリケーションで開く」を押すと開くの選択肢ができるので、このやり方でインストールを行いました。

インストールが終わると以下の1行をPATHに追加します。

/Library/Frameworks/GDAL.framework/Programs

.shp -> .json の変換

この変換は以下のコマンドで行えます。

ogr2ogr -f GeoJSON N02-15_RailroadSection.json N02-15_RailroadSection.shp

React-Dropzoneが便利

ドラックアンドドロップでファイルをアップロードしたい

最近?のWEBサービスではよくファイルをアップロードする際ドラックアンドドロップで行う場合が多い。
今回はそれを自分のサービスの中にも使いたいと思い実装してみました。

Reactにはそんな願いを叶える便利なコンポーネントとしてreact-dropzoneというものがある。
今回はこれを使って手っ取り早く実装することにしました。

React-Dropzone

実装したサービスの画面はこれです。 f:id:h-piiice16:20170423212401p:plain

ここにファイルをドラックアンドドロップで持っていくと、デベロッパーツールのコンソールにファイル名が表示されるサンプルを作りました。

実装のためにまずはreact-dropzoneをnpm経由でインストールします

npm install --save-dev react-dropzone

そして以下のようにコンポーネントを作成します。

import Dropzone from 'react-dropzone';
import React, {Component} from 'react';
import {render} from 'react-dom';

export default class UploadFile extends Component {

  handleOnDrop(files) {
    files.map(file => console.log(file.name))
  }

  render() {
    return( 
      <Dropzone
        onDrop={this.handleOnDrop}
        accept="image/gif,image/jpeg,image/png,image/jpg" >
          <div>
            Drag and Drop files Here!
            <p>format: gif/png/jpeg/jpg</p>
          </div>
      </Dropzone>
    );
  }
}

にはいろいろなアトリビュートが設定できるらしく、デフォで必要そうなonDrop(アップロード時の振る舞い)にコールバック関数としてhandleDrop()を、accept(受け入れるファイルの形式)に画像ファイルの形式を記述しました。

次回はアップロードされたファイルをサーバサイドにpostして保存するところまで行きたいと思います。

SQL小技集

SQL小技

最近SQLを書くことが多いので学んだことをまとめたいと思います。

2つのテーブルを更新したい

勝手な認識でupdate文は1つのテーブルに対し行うものだと思ってました。
しかし以下のように2つのテーブルに対して実行することができます。

update users u, players p
set u.id=1, p.user_id=1
where u.name="piiice" and p.name="piiice"

こんな感じです。

SQLを間違えてしまった…

間違いは誰にでもある。にんげんだもの

とはいえ、SQLの間違いはとってもやばいです。(語彙力)
こんな時に役に立つのがbegin, rollback, commitです。

begin, rollback, commitは制御構文といってcrud操作の中でもupdate, deleteで使うことが多いです。
これを用いるとsqlで加えた変更をなしにできることができます。 例はこちらです。

-- 1
begin;

-- 2
update user
set id=1, name="piiice";

-- 3
select *
from user;

-- rollback; -- 4
-- commit; -- 5

まず1を実行します。
次に2のupdateを実行します。この時点でDB自体の値は変わっていません。
3で2のupdateが正しいかどうか確認します。<- ここ小技!
もし間違いがあれば4を実行し、updateをなかったことにします。
間違がなければ5を実行し、値の更新を受け入れます。

これでSQLコワクナイ

servletのコンパイル2

modelパッケージの指定の仕方

servletコンパイルする際
modelがインポートできない問題に直面し なんとか解決出来たので忘れないように書いておく

構成はこんなかんじ

webapps/
└── example
    └── WEB-INF
        ├── classes
        │   ├── model
        │   └── servlet
        └── jsp

クラスパスを':'でつなげるところがコツらしい

javac -classpass /usr/share/tomcat7/lib/servlet-api.jar:./webapps/example/WEB-INF/classes webapps/example/WEB-INF/classes/servlet/Test.java

Servletのコンパイル

Servletコンパイル

Servletを使ってアプリケーションを開発してみた。
ソースはこんな感じです。

package servlet;                                                                                                                            

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/FowardServlet")
public class FowardServlet extends HttpServlet {
  private static final long serialVersionUID = 1L; 
  
  protected void doGet (HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {

      // forward
      RequestDispatcher dispatcher =
        request.getRequestDispatcher("/WEB-INF/jsp/forward.jsp");
      dispatcher.forward(request, response);
    }   
}

前に書いたJSPファイルをサーブレットから呼び出すアプリケーションである。

さーコンパイル

$ javac FowardServlet.java
FowardServlet.java:5: エラー: パッケージjavax.servletは存在しません
import javax.servlet.RequestDispatcher;
                    ^
FowardServlet.java:6: エラー: パッケージjavax.servletは存在しません
import javax.servlet.ServletException;
                    ^
FowardServlet.java:7: エラー: パッケージjavax.servlet.annotationは存在しません
import javax.servlet.annotation.WebServlet;
                               ^
FowardServlet.java:8: エラー: パッケージjavax.servlet.httpは存在しません
import javax.servlet.http.HttpServlet;
                         ^
FowardServlet.java:9: エラー: パッケージjavax.servlet.httpは存在しません
import javax.servlet.http.HttpServletRequest;
                         ^
FowardServlet.java:10: エラー: パッケージjavax.servlet.httpは存在しません
import javax.servlet.http.HttpServletResponse;
                         ^
FowardServlet.java:13: エラー: シンボルを見つけられません
public class FowardServlet extends HttpServlet {
                                   ^
  シンボル: クラス HttpServlet
FowardServlet.java:12: エラー: シンボルを見つけられません
@WebServlet("/FowardServlet")

...

あれ??

たくさんエラーたちが出てきました。

どうやらいろいろとインポートできていないらしい…

調べるとクラスパスでservlet-api.jarをささなければならなかった。

探すこと1時間ありました。 Tomcat7をインストールした時に一緒に落ちてきたみたい。

今度はクラスパスを指定して挑戦

$ javac -classpath /usr/share/tomcat7/lib/servlet-api.jar FowardServlet.java

うまくいきました!
環境変数にTomcat7の場所を設定する方法が一般的らしいですね。 この後すぐに行いました。

自分のツイートをダウンロードする

自分のツイートをダウンロード

今年も残すところあと3週間。2016年の自分は一体何をつぶやいているのか…

気になって自分のツイートを簡単に見る機能があればよいなーと探してみると、一括でダウンロードできるサービスがあるらしい。

今回はやり方を記していきます!

手順

手順は以下のとおりです。

  1. Twitterの設定から全ツイートダウンロードをクリック f:id:h-piiice16:20161213081100p:plain 僕は押しちゃったのでダウンロード待ちの状態になっていますが、本来は「全ツイート履歴をリクエストする」というボタンがありますのでそれをクリックします。
  2. Twitterのアカウントを登録する際に使ったメールアドレスにダウンロード用のURLが届くのでそれを待つ。
  3. ダウンロードを行う f:id:h-piiice16:20161213081541p:plain 届いたメールにあるダウンロードのボタンをクリックすると、こういったページにアクセスします。ここでダウンロードのボタンをクリックします。

  4. ダウンロードされたzipファイルを解凍し、tweets.csvというファイルを見つける このファイルがツイート履歴の記されたファイルとなります!

これで完了です

これと合わせて

h-piiice16.hatenablog.com

こんなのをやってみると面白いかもしれません。

ヒッチハイクのすすめ

暇な大学生がヒッチハイクやってみた

最近、暇で仕方なかったので前からやってみたかったヒッチハイクに挑戦してみた!

ルートは

こんな感じ!

用賀IC→足柄SA→浜名湖SA→上郷SA→岐阜駅

次からはやってみて思った コツ について書いていく!

ヒッチハイクのコツ

車を捕まえるコツ

僕が思うコツは以下の5つ

  • 目的地は具体的に 例:名古屋方面✕ 海老名SA○
  • SAでの立ち位置は警備の人に聞いてみる
  • スピードに乗る前の車がいる場所に断つ
  • スケッチブックは胸のあたりに持つ
  • 辛くなっても表情を柔らかく保つ

順に説明していく

目的地は具体的に

具体的に書くとのせる側がわかりやすくなる。ドライバーさんはスケッチブックに書かれている内容を運転しながら見るわけですから瞬時に理解できるSA名などが書く内容として適切だと感じた。
実際に私は最初、「名古屋方面」と書いたが20分たっても捕まらず…「海老名SA」と書きなおしてみると5分もたたずに捕まった!
あと他の体験談を見ると目的地を細かく区切るというコツもありますがそれはあっていると思う。

SAでの立ち位置は警備の人に聞いてみる

まず私はSAでヒッチハイクのために待っていても良いのかわからなかった。それも確認すべく警備のお兄さんに立ち位置とともに聞いてみた。

私「SAってヒッチハイクとかやっても大丈夫なんですか???」

お兄さん「やってる人ときどきいますよー」

私「どこらへんで待たれる方が多いですか???」

お兄さん「本線に入る付近だね。頑張って!」

ってという感じで聞くことに成功した! 警備の人は毎日?いるので聞いてみると効率がよいかも

スピードに乗る前の車がいる場所に断つ

これも警備のお兄さんに聞いたのだが、車がスピードに乗ると止まるのが困難なためなるべくSAよりのスピードに乗る前に立っておくと良さそう

スケッチブックは胸のあたりに持つ

これは私も意外で、最初は頭の上で持ってなるべく強調させるよう持っていたが、なかなか捕まらない…
そこで思ったのがそもそもドライバーに見えているのか?この自問が良かったのかいろいろな位置でためしてみると胸のあたりがよくドライバーから見えるのが相手のリアクションを見ててわかった。

これを意識してやってみると捕まるようになった!

辛くなっても表情は柔らかく保つ

乗せていただいた方に聞いたのですが、やっぱりのせる側も怖いし警戒するとのこと。
乗せていただく前に信用してもらえるように表情だけでも柔らかく保つとよいと思いました。

柔かくって抽象的ですが、実際意識して実行してみると、捕まりはしなかったが通行人の人に声をかけられたり差し入れをもらえたりと人から喋りかけられるようになった!

乗ってからのコツ

乗ってからはなるべく沈黙にならないように努力した。トークのコツをまとめようと思う。 コツは以下の3つ

  • まずは自己消化
  • 景色や天候で盛り上がる
  • 方言ネタが鉄板

まずは自己紹介

乗せていただく方の警戒を解くことにまずは注力しなければならない。まずは自己紹介をして自分を知ってもらう。
ある程度自分のことを話すと向こうから質問が飛んてくると思うのでそれに返答するだけでも会話になるためまずは自己紹介が大事!

景色や天候で盛り上がる

ヒッチハイクする日ってたいてい天気が良い日だと思われる。そのため乗せてくださる方もどこか出かける途中だったりする。失礼のないように行き先などを聞いてみるとそこから会話が広がったりするかもしれない。
また景色について触れると載せてくる方がその地方に詳しい方だったら豆知識など教えてもらえてそこから会話につなげるという荒技もある。

方言ネタが鉄板

乗せていただいた方が違う県の出身だった場合に限るが珍しい方言についての話が続いた。例えば相手との会話の途中にわからない単語や言い回しが出てきた時質問しそこから方言について聞いたり、自分の住んでいる地域の方言について教えるなどして会話が続く。これはほとんどの車でやりました笑

乗せていただいたあとは全力で感謝!

乗せていただいた方への感謝の言葉を忘れてはいけない。ヒッチハイクではこっちがやってもらうばかりでなかなか感謝を行動に表すのは難しいが、僕は全力で感謝を伝えた。 この場を借りて改めてお礼を言いたい。

あとこれは変かもしれないが、名刺や名前を頂いた場合はフェイスブック等のSNSで調べてみて改めてお礼を言ってみるのも良いかもしれません。(私はやりました。

なんにせよ感謝の気持ちを忘れてはいけません!

感想

今回はじめのヒッチハイクだったが最長で30分くらいしか待ちませんでした。意外にも私にはヒッチハイクの才能があるのかもしれないw
才能云々の前に乗せてくれる方が多いということが一番の要因です。
日本には優しい人が思っている以上に多いことに気づくことができ、私も日常、優しく生きようと誓った。

あと自信がつきます。今の私は何でもできちゃうかもと思っています。これを期にいろいろなことに挑戦していこうと思った。