経営工学徒の備忘録

~日々の大学生活や留学について~

一年の計は元旦にあり【2021】

2021年が始まりました。
今年1年間を有意義に過ごすためにも、やることとやらないことを決めて、目標を持って邁進して行ければと思います。
それでは始めていきます。

大目標:学歴ロンダリング

目標:世界大学ランキング(QS)50位以内の大学院に合格する

目的:4年前の悔しさを晴らすため。自分の人生に納得感を持って生きるため。より良い環境で自分を高めるため。自由になるため。

  • KR:2021年3月31日までにGREで320点(V:150,Q:170,AW:3.5)を達成する。
  • KR:2021年3月31日までにTOEFL iBTで100点(R:28,L:28,S:20,W:24)を達成する。
  • KR:2021年2月28日までに国内大学院の志望研究室を3つ具体的にあげる。
  • KR:2021年7月までに国内大学院の入試過去問で7割を取れるようになる。
  • KR:2021年夏に国内の留学向け奨学金を獲得する。
  • KR:2021年夏にSoPやEssayの対策を始める。
  • KR:EmpowerGREと中国TPOを使って1日3時間はGRE対策に取り組む。
  • KR:1日1時間は新しい単語の暗記を行う。1日で200単語は見る。

目標:起業した領域で月10万円かせげるようになる。

目的:起業を通じて自分で稼ぐ力を身に着けるため。

  • KR:YouTubeを2021年3月31日までに収益化。
  • KR:毎週2本は動画投稿する。
  • KR:価値のあるサービス提供できる顧客を10人獲得する。

目標:学会に論文を投稿する。

目的:海外大学院進学に向けて研究実績を作るため。

  • KR:2021年1月中に研究成果を出す。
  • KR:2021年3月までに研究内容を論文にまとめる。

目標:Kaggle Expertになる

目的:データサイエンティストとして定量的に評価される指標を持ち、今後の食い扶持を広げるため。

  • KR:コンペに参加し銅メダルを2つとる。
  • KR:2か月に1週間は毎日3つnotebookを読むような集中期間を作る。

目標:AtCoderで緑コーダーになる

目的:楽しいから。アルゴリズムを学べるから。

  • KR:2021年2月中に一通りアルゴリズムをけんちょん本通して学ぶ。
  • KR:Bootcamp含めて300ACを目指す。


ここに書いていない裏目標も実はあったりしますが、とりあえずこんな感じで進めていきます。昨年のコロナなど絶対に想定外なことは出てきますし、上に書いたようにはおそらく上手くいきませんが、臨機応変に波乗りしつつ取り組んでいきます。

本年もどうぞよろしくお願いいたします。

よわよわエンジニアがサマーインターンに応募して落ちまくった話

今更ですが、2020年のサマーインターンについて、選考結果や当時のスキルを振り返ってみたいと思います。
NDAに抵触しないように、あまり詳しい具体的な内容は書けませんのでご了承ください。

当時の私のスペックは以下のような感じです。(2020年7月)

地方国立大学 学部3年生
英語:TOEIC840, IELTS7.0
プログラミング経験:
Python(1年程度):授業とUdemyなどR(半年程度):授業など
SQL(半年程度):長期インターンで使用
Kaggle Contributor, 灰コーダー
HTML, CSS, JS, Java, Ruby, PHPなど少し
その他経験:
スタートアップ企業で長期インターンシップ(7か月)

留学に行きたかったので英語は頑張っていましたが、ちゃんとプログラミングを始めたといえるのは2020年の4月ぐらいです。
ですから、実質プログラミング歴は3か月ぐらいですね。

また、基本的に院進するつもりで、修士卒での就活を予定しています。じゃあ何で今サマーインターン申しこんどんねん、って話ですが、ちょっとでも実務の世界を見ておきたかったんです。


ここからは、実際に選考に参加した企業について書いていきます。
そもそもエントリーしなかったところも多いんですけどね(MicrosoftDeNAなど、22卒限定だったり、論文の実績がしっかりいったり)

尚、社名のアルファベットと実際の会社名には関係はないですよー、と一応言っておきます。

【ES落ち】

  • S社

かなり初期に受けて、ESで祈られました。まぁES対策とか何もしてないのでしょうがないですね。

  • C社

Web系の業務未経験でしたが応募、ES後のスキルチェックみたいなので落ちました。競プロ力、そしてAPIの扱いに精通したいと思ったきっかけです。

  • B社

機械学習系のインターンに応募。普通にES落ちです。

  • R社

ESで落ちました。サーバもフロントもほぼ経験がなかったので、Webアプリ作る系はダメですね(他もダメとかは言っちゃいけない)。
参加した人によると、毎日夜中3時とかまでアプリ作ってたそうです。

  • D社

SPIや玉手箱といったWebテストを初めて受験し、余裕で時間が足りず、おそらく足切りされたであろう企業さんです。

  • N社

面接にて、22卒で入社希望してくれるような人を募っている印象でした。自分は当てはまらないのでミスマッチかなと思い、面接も爆速で終了して無事不合格です。

  • A社

申し込めば誰でも行けるタイプの1dayインターンです。ハンズオンでディープラーニングやったり結構楽しかったです。ネットで調べると不穏な検索サジェストが出るのでちょっと気になりますが。。

  • W社

普通にESで祈られましたね。ESで祈られたところは定量的な実績のアピールが弱かったように思います。

  • B社

W社と似たような感じなので特に言うことはありません。

【面接落ち】

  • R社

時給が高く、データ周りのことを出来ると聞いて応募しました。ただ、スキルチェック段階ではpandasの扱いも全然慣れておらず、割と苦労しながら、でも成長しながら課題をクリアしていきました。あまり面接に慣れておらず、一次面接で落ちました。

  • G社

ここはESが通ったと連絡をくれたものの、面接の日程調整システムが一向に上手く動かず、そのまま流れてしまいました。

  • Y社

ESは通り、スキルテストもダメかな、と思ったら意外と通ってました。面接は友達と自転車で旅行中だったので、途中漫画喫茶によってやってもらったことが思い出です。でも面接は落ちました。あとからのフィードバックによると、エピソードに自分らしさが足りなかったそうです、残念。

インターン参加】

  • P社

初めて通った企業です。面接はなく書類選考のみだったので、思いのたけや実績をフォーム欄にしたためました。インターンの感想記事は別で書こうと思います。

  • C社

ESで祈られた部署もあったのですが、データサイエンス系のインターンに合格することができました。こちらも後ほど記事にできればと思います。

こうしてみると、戦績は全部で3/14でした。
中々厳しかったですが、インターンに行けば次のインターンに行きやすくなるとも言いますし、少しでも合格を頂いて経験をつめて良かったと思います。

今後とも精進してきます。

pythonで順列全探索を実装する

以前、bit全探索に関する記事をあげました。
今回は、pythonで順列全探索を実装してみます。

itertools.permutationsというライブラリを利用すれば、非常に簡単に実装できるようです。

from itertools import permutations
nums =[1,2,3]
pers =permutations(nums,3)
for i in pers:
    print(i)

permutationsがイテレータであるということに注意が必要です。
二個目の引数に出力したい数を入れてfor文を回してあげます。

出力結果

(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)

郵便番号と緯度経度の一覧データを取得する【Python】

日本郵便からは、郵便番号の一覧データをダウンロードすることができます。
www.post.japanpost.jp
また、国土交通省からは、全国の市町村と緯度経度のデータをダウンロードすることができます。
nlftp.mlit.go.jp

しかしながら、郵便番号と緯度経度が紐づけされた一覧データはダウンロードすることができません。
今回は、以下の記事やAPIをもとに、郵便番号と緯度経度の一覧データを取得してみます。
qiita.com
geoapi.heartrails.com

早速、Pythonでのコードを載せます。

import requests
import json
import pandas as pd
import csv

name =["code","zip5","zip7","yomi1","yomi2","yomi3","name1","name2","name3","other1","other2","other3","other4","other5","reason"]
zipcode = pd.read_csv('./KEN_ALL.CSV', names=name, encoding='cp932', header = None)

url = 'http://geoapi.heartrails.com/api/json'
payload = {'method':'searchByPostal'}

for i in range(len(zipcode)):
    try:
        payload['postal']= (str(zipcode["zip7"][i]).zfill(7))
        res = requests.get(url, params=payload).json()['response']['location'][0]
        with open('./KEN_ALL_POSTALCODE.csv', 'a',newline='') as f:
            writer = csv.writer(f)
            writer.writerow([res['postal'], res['prefecture'], res['city'], res['town'], res['y'],res['x']])
            
    except:
        continue

簡単な説明としては、まずpandasでこちら(https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html)にある全国一括の郵便番号データを読み込みます。この際に、nameでheaderに名前を付けてあげています。
その後、forループを回して、一つ一つの郵便番号を参照し、APIを動かし、取得した値をcsvファイルに書き込む、ということを繰り返しています。
たまに郵便番号を入れてもAPIが緯度経度を返せずエラーが起こってしまうため、try exceptでそのような場合は次のループに進むようにしています。
特に工夫もせず単純なループを回しただけのコードですので、実行には大体4時間程度かかりました。
もしご要望等あれば、完成したファイルの無料または有料での配布も考えておりますので、コメントいただければ幸いです。

pythonでビット全探索を実装する【ABC128-C Switches】

スイッチのon,off、何かを含める,含めない、といったように、全部で2のn乗個あるような場合を全て書き出して全探索する方法についてまとめておきます。
例えば以下のような問題です。

atcoder.jp
atcoder.jp
 
本記事では、普段使用しているpythonを用います。

n = int(input())

for i in range(2 ** n):
    for j in range(n):  # ポイント1
        if ((i >> j) & 1):  # ポイント2

ビット全探索の基本的な実装は上記のようになります。
nは、ある・ないを考えるような事象の種類として設定します。

ポイント1
0~2^nまで繰り返されるループの中で、jのループを回します。
つまり、iが0の時jが0,1,2...、iが1の時jが0,1,2....と推移していきます。

ポイント2
最も大事なところです。
ここでは、順に右にシフトさせて最下位bitのチェックを行っています。

もう少し具体的に考えてみましょう。
例えばn=2について調べたいとなった場合、全部で調べる事象は2^2=4通りについてです。
ここで、2進数での表記を考えると、0=00、1=01、2=10、3=11と書くことができます。
この0,1,2,3という値は、最初のループの各iの値に対応していますね。
これらの数字を2進数で表記したものを、j個(ここでは0か1)だけシフトさせて、最下位のbitが0か1であるかというのを((i >> j) & 1)で判定しています。0=off、1=onなどと対応させてあげれば、2種類のスイッチに対してon,offの組み合わせを全部書き出してあげることができました。


最後に、bit全探索を用いてAtcoder Beginner Contest128のC-Switchesを解いてみます。
競技プログラミングは始めたばかりなのでゴリ押しなコード否めないかもしれませんがご了承ください。
atcoder.jp

問題文onとoffの状態を持つ N 個のスイッチと、M個の電球があります。スイッチには1からNの、電球には1からMの番号がついています。電球
iはki個のスイッチに繋がっており、スイッチsi1,si2,...,sikiのうち on になっているスイッチの個数を2で割った余りがpiに等しい時に点灯します。
全ての電球が点灯するようなスイッチの on/off の状態の組み合わせは何通りあるでしょうか。

私はこんなコードを書きました。

N,M = map(int,input().split())
K = [0 for m in range(M)]
count = 0
 
for m in range(M):
  K[m] = list(map(int,input().split()))
P = list(map(int,input().split()))
 
for i in range(2**N):
  op = [0]*N
  for j in range(N):
    if ((i>>j) & 1):
      op[N-1-j] = 1
      
  flag = True
  
  for k in range(M):
    S = 0
    for l in range(K[k][0]):
      S += op[K[k][l+1]-1]
    if S % 2 != P[k]:
      flag = False
  if flag:
    count += 1
    
print(count)