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

機械音痴な情報系

そしてエンジニアに…。

初めてPythonでWebスクレイピングする時に役立ったサイト

バイト先で、Excelデータを作成する時に、いちいち検索して、クリックしてWebページ表示してコピペして…が面倒くさい!
じゃ、Webスクレイピングとかいうもので(詳しくは知らなかった)一気に引っ張ってくればいいのでは、と思ったがやり方がわからない。
コピペで取り敢えず動かしてみたのでその時に役に立ったサイトをメモ。


www.s-arcana.co.jp
単にどんなもんか試してみるにはこのサイトが一番シンプルだった。
ただ、コピペするだけだと以下のようなエラーが出てしまった。

$ python3 main.py
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/site-packages/selenium/webdriver/common/service.py", line 64, in start
    stdout=self.log_file, stderr=self.log_file)
  File "/usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 950, in __init__
    restore_signals, start_new_session)
  File "/usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 1540, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'phantomjs'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 11, in <module>
    driver = webdriver.PhantomJS()
  File "/usr/local/lib/python3.5/site-packages/selenium/webdriver/phantomjs/webdriver.py", line 52, in __init__
    self.service.start()
  File "/usr/local/lib/python3.5/site-packages/selenium/webdriver/common/service.py", line 71, in start
    os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'phantomjs' executable needs to be in PATH. 

Exception ignored in: <bound method Service.__del__ of <selenium.webdriver.phantomjs.service.Service object at 0x10bbf8be0>>
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/site-packages/selenium/webdriver/common/service.py", line 163, in __del__
    self.stop()
  File "/usr/local/lib/python3.5/site-packages/selenium/webdriver/common/service.py", line 135, in stop
    if self.process is None:
AttributeError: 'Service' object has no attribute 'process'

ということでphantomjsとやらをインストールするために以下のサイトを参考にさせて頂きました。
nigohiroki.hatenablog.com






はぁ…。

こんなことしてていいのか…修論進めなくちゃ…。。。。

無事修了出来るといいな…。

国立台湾大学へポスターセッションをしに行ってきた【1日目】

いつものゼミ合宿は軽井沢なのに、軽い気持ちで誰かが海外へ行きたいといったら本当に海外へ行くことになった!



初成田空港。
機内食が出るけど時間が空いたので寿司を食べていざ出発。
f:id:saneeeatsu:20160923145106j:plain



なかなか予約のとれない有名なレストランを予約してたけど、入国審査をなかなか通れないメンバーがいて1時間ほどの遅れが出たため急遽他の店へ変更。お店の名前忘れちゃったけど美味しかった。
あと写真とる用に切る前にも持ってきてくれて観光客慣れを感じた。
f:id:saneeeatsu:20160923145138j:plain




ホテルに一旦荷物を置き、以前台湾に住んでいたナイトクラブのスペシャリストと言われている中国人の先輩らとクラブへ。台湾の地下鉄では紙のチケットではなくプラスチック製のコインが使われていて、これを改札口でタッチする方式だった。小さいコインをタッチさせるのは正直やりづらかった。

f:id:saneeeatsu:20160923145312j:plain

f:id:saneeeatsu:20160923145535j:plain




明日は国立台湾大学へ行ってポスターセッション。
英語に不安が残るけどなんとかなるだろう…。

各国滞在期間と、飛行機・船代でかかる最低金額

おおまかなルートは決まっているので取り敢えず飛行機・船代を調べてざっくり算出してみた。とにかく安く済ませたいので早めに日付を決めてチケットを取った場合の値段。
適当に各国・都市での予算を決めてみたけど絶対もっとかかる気がする。
また、サンパウロ、ヒューストン、台湾、福岡、兵庫、大阪、三重、愛知、小田原、菊名では友人の家に泊まろうと思っている(友人にはまだ言ってないけど)。

国・都市 滞在期間 予算
ブラジル、コロンビア等 1ヶ月 20万(飛行機代込み)
ヒューストン 1ヶ月 10万
デンバー 2週間 8万
ロサンゼルス 1週間 5万
シンガポール、タイ、ベトナム 2週間 6万
中国(福州) 1週間 2万
台湾 1週間 2万
沖縄〜東京 1.5ヶ月 10万
合計 5ヶ月ちょい 60〜70万

【移動費(航路、海路)】

出発 到着 予算
成田 ブラジル 27,200
ロサンゼルス シンガポール 52,000
中国 台湾 5,000
台湾 石垣島 不明(5000円?)
石垣島 沖縄 5000
沖縄 鹿児島 7,000
合計 - 約11万

さっさととっちゃおうかな〜。

学生ライセンスを利用し、無料でRubyMindをインストールしてみた。

RubyMindというものがあるのは知ってたけど、有料だしSublime使ってるし別にいいやと思って特に調べもしませんでした。ところが最近Railsのプログラミング動画を見ていてRubyMindを使用していたので気になって値段を調べてみると…

なんと学生なら無料で利用出来るとのこと!


ということで早速インストールしてみよう。
まずはRubyMindにアクセス。 

f:id:saneeeatsu:20160627194235p:plain

「Buy」>「DISCOUNTED AND COMPLIMENTARY LICENSES」>「For students and teachers」
f:id:saneeeatsu:20160627194452p:plain


「APPLY NOW」をクリック
f:id:saneeeatsu:20160627194658p:plain


あとは名前とメアドを入れて送信。
f:id:saneeeatsu:20160627194711p:plain


来たメールの指示通りURLをクリックして完了。
f:id:saneeeatsu:20160627194736p:plain



次のメールはいつ来るんだろうか。
承認されてインストールでき次第更新します。

そうだ、世界半周旅行をしよう。

来年度から社会人になるわけですが、入る会社が4〜9月であれば入社月を好きに決められるようなので(人数制限があるので希望が通らない場合もある)卒業後は2、3ヶ月旅行にでも行ってこようかな〜と思っています。

といっても銀行の残高は数万円…。
これからバイトをしたところで30も貯められない気がする…。
そういえば前みずほ銀行でお金を引き出す時、50万円まではお金を貸せますみたいな事が書かれてたし、みずほに借〜〜りよ〜〜(ホジホジ)。

なんとか海外にいる友だちの家に留めてもらいながら旅行できねーかなー。

高校卒業後サンディエゴに行っていた時にルームシェアしていた友人がブラジル人なので、取り敢えずブラジルに会いに行こうかと思っています。あと、南米に行くには乗り換えが必要だそうなので(詳しくは知らない)、時間がある今のうちに行ってみようという理由もあります。

ブラジルから北上してアメリカをある程度堪能したら東南アジアに行って、中国、韓国、台湾へ。
それからは九州へ飛んでテキトーにヒッチハイクでもしながらテキトーに東京へ帰ってこようと思っています。

ところで今住んでいる家の契約は2017年3月まで。
しかし、その後は日本にいないかもしれない。
その場合の家具はどうするのか。
働いていないから給料は無いけど、取り敢えず部屋を借りてしまうのか。
それとも一旦どこかに預けて、帰国してから部屋を探すのか。


取り敢えずお金がすっごいかかりそうなのはわかった…もう考えたくない。


お金を貯めるのは諦めてとにかく安く、長く海外にいれるような方法を考えよう…。

就活で利用した便利なアプリ2つ。

3月1日から始まった就職活動が終わりました。やったぁ〜。


採用担当の人たちの多くが「色々な分野を見てみたらいい」と言っていたし、実際どんな会社がどんなことやってるのかに興味があったので、短い期間ではあったけど会社説明会にはそこそこ足を運びました。誰でも知っているような有名企業でも実際何をやっているのかは知らなかったので新鮮で面白かったですし、聞いたことない企業でも面白いことしてるところはたくさんありました。

就活する際に企業を調べたりする上で取り敢えずリクナビのアプリは使用していましたが、それ以外に使用して特に便利だったもの2つを紹介します。



1. Staccal
就活中はリクナビのアプリを使っていました。カレンダー機能があり、予約した説明会の日時等が見れるのですが、リクナビと連携していない企業HPから直接予約した場合等は使えないのでStaccalというカレンダーアプリを使用していました。有料(120円)ですが超便利なのでお勧めです。
詳しいことは今度かこ。。。


2. GoogleSpreadsheet

f:id:saneeeatsu:20160626175935p:plain

各色の意味は次の通り。

紫色:志望度が高い
水色:説明会に行った。またはWeb説明会で見た。
赤色:お祈りされた。
灰色:辞退した。

マイページのURL、ID、Pass等を一括管理しておくと非常に便利です。
スプレッドシートのアプリをスマホに入れておくと外出先で説明会の予約とかもすぐできて重宝しました。

【Java】GPSのNMEAフォーマットの情報から経度・緯度を抽出する

public class test1 { public static void main(String[] args) { String gprmc = "$GPRMC,085120.307,A,3542.4488,N,13945.3994,E,000.0,240.3,181211,,,A6A"; String gpgga = "$GPGGA,085120.307,3541.1493,N,13945.3994,E,1,08,1.0,6.9,M,35.9,M,,00005E"; String gpgsa = "$GPGSA,A,3,29,26,05,10,02,27,08,15,,,,,1.8,1.0,1.53E"; String gpgsv = "$GPGSV,3,1,12,26,72,352,28,05,65,066,37,15,50,268,35,27,33,189,377F"; String gpvtg = "$GPVTG,240.3,T,,M,000.0,N,000.0,K,A*08";

String regex = "^\\$GPRMC,..........,A,"; 
Pattern p = Pattern.compile(regex);

check(p, gprmc);
check(p, gpgga);
check(p, gpgsa);
check(p, gpgsv);
check(p, gpvtg);

}

private static void check(Pattern p, String target){ Matcher m=p.matcher(target); int i; double longitude, latitude, longdp, latdp; BigDecimal bd;

if (m.find()){
  String[] strs = target.split(",");
  System.out.println("○ " + target);

  for(i=0; i< strs.length; i++){
  //System.out.println(String.format("%d個目の文字列 : %s",i+1,strs[i]));
    if(i == 3){
      longitude = Double.valueOf(strs[i]);  // 文字列を数値に変換
      //System.out.println(String.format("計算前の値:%f", longitude));

      longitude = longitude/100;  // 整数値を取り出す
      //System.out.println(String.format("÷100:%f", longitude));

      longdp=longitude%1*100/60;  // 小数点以下を取り出し計算
      //System.out.println(String.format("小数点以下を取り出して、計算:%f", long2));

      longitude = Math.floor(longitude); // 取り出した整数値の小数点以下を切り捨て
      longitude = longitude+longdp; // 合計値を計算
      //System.out.println(String.format("合計値:%f", longitude));

      bd = new BigDecimal(longitude);  // 計算した合計値をBigDecimal型に変換

      longitude = bd.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue(); // 小数点第5位で四捨五入
      System.out.println(String.format("経度:東経 %2.4f", longitude));    // 小数点第4位まで表示 
    }
    if(i == 5){ 
      latitude = Double.valueOf(strs[i]);
      //System.out.println(String.format("計算前の値:%f", latitude));

      latitude = latitude/100; 
      //System.out.println(String.format("÷100:%f", latitude));

      latdp = latitude%1*100/60; 
      //System.out.println(String.format("小数点以下を取り出して、計算:%f", lat2));

      latitude = Math.floor(latitude); 
      latitude = latitude+latdp;
      //System.out.println(String.format("合計値:%f", latitude));

      bd = new BigDecimal(latitude);

      latitude = bd.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
      System.out.println(String.format("緯度:北緯 %3.4f", latitude))
    }
  }
}else{
  System.out.println("× " + target);
}

} } ||<

  • 実行結果

    || ○ $GPRMC,085120.307,A,3542.4488,N,13945.3994,E,000.0,240.3,181211,,,A6A 経度:東経 35.7075 緯度:北緯 139.7567 × $GPGGA,085120.307,3541.1493,N,13945.3994,E,1,08,1.0,6.9,M,35.9,M,,00005E × $GPGSA,A,3,29,26,05,10,02,27,08,15,,,,,1.8,1.0,1.53E × $GPGSV,3,1,12,26,72,352,28,05,65,066,37,15,50,268,35,27,33,189,377F × $GPVTG,240.3,T,,M,000.0,N,000.0,K,A*08 ||< 因みにGPRMCのステータスがA(有効)ではなく、V(警告)だった場合は、○が×になり、経度も緯度も表示されません。

  • 経度・緯度の計算方法
    例えばGPRMCに

  3542.4488

と表示されているとします。この時下6桁が実際に経度に変換した時に小数点以下を表します。 つまり35の部分が経度の整数部分になります。つまりこんな感じ。

  35      42.4488   ↑       ↑   整数になる  小数になる

「整数になる部分」はそのまま扱えばいいので、小数点以下の部分を計算していきます。これは÷60をするだけなので、

  42.4488/60=0.70748

最後に「整数になる部分」と、「小数になる部分」を足して、

  35.70748

となります。今回はGPSで経度・緯度を取得する対象が日本だけなので、デフォルトで「東経」、「北緯」と書いてあります。また、アプリケーションの仕様の関係から小数点第5位を四捨五入して4位までを表示しています。

小数点以下を取得する方法。値を1で割ったあまりを求める方法が簡単。 実数からの小数部の取得 【OKWave】

文字列を分割し取り出す。 部分文字列の取り出し ( Javaサンプル集 )

BigDecimalクラスを使用して四捨五入をする方法。 Java 四捨五入

絶対もっとスマートな書き方ありそう\(^o^)/ コメントアウトしてるところはデバッグするときに使用したものです。 今回はとりあえず文字列を設定して行ったけど、実際にはTerminalから情報を取得して行いたい。 ターミナルの結果をファイルに出力して、ファイルを読み込む方法くらいしか思い浮かばないなぁ…。

Eclipseではインデント4文字だったのに、コピペしたら8文字になってしまったので、ブログの横幅短いし手動で2文字に直した。なんで8文字になったんだろ…。