弊プロ研は退部者が絶えない
この記事は、Kosen13s Advent Calendar 2018 12日目の記事です。
はじめに
なぜ弊部は毎年のように退部者を出しているのか。他の部活と比べてみても、入る部員数が多いのにもかかわらずやめている人数の方が多い状況である。入る部員が初めは多いということは、それだけプログラミングをしたいと思う新入生が多いからだと思う。にもかかわらずなぜ退部者が後を絶たないのか。それを今から考察していく。
※これは個人的な考察であって所属する団体の意見とは別とする
理想のプログラミングとの格差
新入生をもう何年間も見てきた経験から、やめていく人々が口々に言う単語。それはむずかしいである。
なぜプログラミングが難しいと思われているのか。何が難しいのか
下級生が一番はじめに直面する問題は何処なのだろう。
環境構築の難易度
プログラミングを始めるにあたって必ず通る場所といっても過言ではない環境構築。ただ単にコンソールを動かすようなプログラムを書くのであればインストーラで一発!みたいに行けるが、AndroidやiOSの環境構築ははっきりいって超泥沼。正直1年が太刀打ち出来るものじゃない。パッケージの依存関係の解消、バージョンの違いでコンパイルさせてくれない等。でもこれは英語のエラー出力をコピペ貼り付けするスキルを身につけるだけで解決できたりする。
ここで苦手意識がついちゃってやめていく人が1割くらい。
混在する各種エディタ
次に多いのはエディタの量の多さである。プログラミングの効率とエディタが相関関係にあることは上級生はわかっているとは思うが、一年生は正直わからんと思う(過去にメモ帳で開発してたT田くんのように)。だからこのあたりは1つわかりやすいエディタを部内で決めておく必要がある気がする。
静的な言語のプログラミングの工程としてコーディング、コンパイル、実行があると思うがこれらを全て一つの画面でできることが好ましいと思われる。SublimeやAtomは拡張性が非常に高いが、初学者には向いてないのでコンソールやシンタックスハイライトをインストール後にすぐ使えるVSCodeをわりと推していきたい(最近俺も乗り換えた)。
パソコンを初めて触るって子もいたりして、これでも1割くらいやめる。
なにがわからないのかが分からない
これが一番深刻な問題。正直ここを解決できずに部員が去っていく例が一番多いと思われる。プログラミングを始めるにあたって明確なルートを決めてやらない限り、おそらくこの壁を超えられない人間が少なからず出てくると思う。
しかし、最近は文系大学生でもエンジニアになれる時代でそこらへんに資料はゴマンとおいてある。なのでその資料を活用する他ないと自分は考えている。例をあげるならば
- Progate
- ドットインストール
などなど、楽しく学べる学習環境は多くある。
新入生にはC++を勉強させるといった悪習が弊部にはある。プログラミングなんて、正直一番はじめが一番重要で、一番楽しい時期なのに意味もわからんC++とかいうビジュアライズも何もない(あるけど)わりかし低レイヤーな言語触らされているのが一番悪いと考えている。
最初からC++やっても楽しくないって声をたくさん後輩から聞いていて、これでやめていく人が本当に4割くらいいる。
授業でやるからわからないと今後困るみたいなことを言う人もいるが、実際プログラミング言語なんていくつか習得していれば根本は変わらないと思っているし、そこまで国はならないはず。HaskellとかDとかそういう特殊な言語をやっていくのは違うけど、javascriptだったりPythonだったりJavaだったり、言語は腐るほどある。
新入生には簡単にビジュアライズができるjavascriptとか、Javaとか、そういったものを教えつつ、JOIやPCKに参加したいって部員に対してC++を教えていく方針がいいと私は思う。
なぜこんな状態になっているのか
じゃあC++とかやらないでもっと楽しい言語とかフレームワークとか触らせればいいやん!って思いますよね。無理なんです。Ex.に書いたので読んで...
あと実は弊部には新入生を教育するためのマニュアル的なものが一切ない。私が入部した当初は先輩が2人, 同級生1人といった部員数だった。さらに先輩はほぼ部活には来ていなかったので、ちゃんと部活動をしていたのは1年だった自分ともう一人だけだった。なので私達は先輩に教えられたことは一度もなく、独学で技術を磨いてきた。その後、競技部門で準優勝、特別賞、優勝などをするうちに、部員数がいつのまにか20弱になっていた。
私たちの一番の失敗は後輩のための学習マニュアルを一切作っていなかったことだと思う。だから絶対部内で学習到達目標とか、どんな風に開発していくのがベストとかちゃんと保存しといたほうがいい、本当に。
まとめ
色々自分の思うところを書きなぐりましたが、結局は
- 開発環境の整備
- エラーの解決方法
- やってて楽しいか、目に見えるか
- モチベーションを保てるか
が一番問題になると思います。ここを解決できれば途中でさっていく悲しい後輩を少しでも減らせるはず。あとは後輩のためにマニュアルを作っていないのであれば、暇があるときに作ってあげること。どんなに強豪校になったとしてもメインの人が卒業したらそのまま弱くなっていくなんて辛いだけ....絶対に知見は共有しよう。
悲しい新入生を出さないためにも、上級生やつらい思いをした今の下級生がいい環境を作っていきましょう。
Ex. 学習内容を強要してくる環境
プログラミングは手段であって、他人に強要されるものではない。この言語やれ、これ実装しろと命令されるのはそれこそ企業に入ってからで十分である。
好きだったはずの、やりたかったはずの、楽しかったはずのプログラミングを「あれやれ、これやれ」と強要された時点でその人のモチベーションは地に落ちる。それが筋が通った、ちゃんと技術選定をしたり実例を出して納得をさせてからなら違うかもしれない。だが、部内で権力を持っている人間が「この言語はダメ」、「これはいいように思えないからこっちをやれ」と強要をすると、そこから部活動は崩壊していく。
逆求人フェスティバルに参加した
逆求人に行って得られた知見などを話したかったのでここでまとめます。
逆求人とは一般的な就活の形式とは異なり、「企業」サイドが「学生」サイドに対して話を聞きに来るスタイルのイベント。
また企業は錚々たる面々が集まっているのはそれらは各自ジースタイラスの逆求人を確認して欲しい*1。
逆求人自体は高専プロコンで色々と来ていたり,プロコンタグ等で見かけたりはしていたので知っていました。でもまさか自分が行くことになるとは思ってなかった。このイベントに関心を持たせてくれたのはkosen13s'の御仁なので本当に感謝....(情報共有大事、絶対)。なぜ関心を持ったかというと、逆求人に登録している人の招待メールから登録すると1万円のアマギフでそれが還元される仕組みになっていたから(完全に金につられた)。
まあなんやかんやで逆求人に登録したら当日までに色々なフローを踏んだので今後の人のために書いていく。
登録直後〜
登録後、逆求人の人からメールが来てとりあえずスカイプとかで面談したいからIDおしえて〜と言われた。おお、めっちゃ対応はやい。そう思って早速ID送って面談の希望日時とかを一緒に送って待つことに。。。
ちなみに待ってる間までに逆求人のプロフィール欄はある程度埋めておくということなので頑張って埋めた。結構ちゃんと書こうとすると1時間以上かかるので気合い入れてここはやったほうがいいかもしれない。
事前面談
率直な感想としては「めっちゃ優しい!!」って感じでした。
その時はすごい緊張してて家からでもSkypeで面談できたのにとりあえず「ちゃんとしなきゃ...」ってなって学校の研究室で面談の時間までPC前で座してた。そしたら担当のTさんから「じゃあ10分以内にかけますね〜」と来たのでその後Skypeでビデオ通話した。
最初は雑談とかしたり、盛り上がって自分の話しちゃったりだとか、Twitter交換したら知り合いのフォロワー結構いて盛り上がったりとかで終始楽しかったです。その後も雑談だけじゃなくてちゃんとプロフィールの考察とか、どんな風な企業に行きたいのか、どういう仕事が自分には向いているのかを対話しながらブラッシュアップしてくれました。自分が気づいていないようなことも発見できたのでとても有意義でした。
注意事項としては、企業側がイベント1週間前あたりでイベント参加者のプロフィールを確認するらしく、そこまでに内容をちゃんとしていこうということでした。
2回目の面談
当日の逆求人の流れやプロフィールの添削、その他色々なお話を伺ったりしました。
当日の流れは
- 1 企業との名刺交換タイム
- 2 ご飯休憩
- 3 企業と1:1での面談 x 10
といった感じと説明され、3の企業面談のためのスライドを作る必要があるから簡単につくったら送っておいて〜!と言われました。
担当のTさんとはTwitterを交換してDMでやりとりができたのですごいフランクにいつもやりとりができました。そして自己PRを完成させ、担当の人にスライドを添削してもらい当日に望みます!!
逆求人当日
会場到着
プロコンで一緒にやってきた後輩も引き連れ逆求人フェスティバルの会場にやってまいりました。隣に沖縄高専の女の子とかいて(はえ〜遠いとこから大変だな...)とか思いつつ色々会場でスライドの準備とかをします。スケジュールとしては
10:00から受付開始、10:30から軽い説明を受け、10:40から名刺交換スタート!
とかなりスピーディーな内容でした。
名刺交換タイム
そしてついに企業さんとの名刺交換....
めっちゃくちゃ来るやん
いや正直自分にそんなに魅力ないやろ!とか、周りに強そうな大学院生だとかがたくさんいたので一人もこなかったらどうしよう、、、とか思ってた自分が馬鹿らしくなりました。めちゃめちゃ企業さんきてくれます。名刺とか手提げバッグとか色々もらえます。うれしい。
そして30分程度でたくさんの名刺を受け取り、この時点で人事の方々とたくさんお話してとても楽しい!って思いました。いつのまにか緊張もあまりしなくなってました。
ご飯タイム
後輩つれて適当に丸亀製麺でとろろ温玉たべた。おいしい。
ご飯タイム中の12:00までに** 自分と面談を希望してくださった企業さんとのスケジュールが発表されます。
幸いなことに私は面談の10枠全てが埋まり、たくさんの企業さんとお話できることがきまりました!😊
面談タイム
面談は簡単な自己紹介から自分が今までやってきたこと、自分の夢(将来像)、貴社でどのような活躍ができそうか
といったことをスライドで説明し、それに対してのレスポンスをいただきました。
レスポンス内容は、大まかに説明すると
- バイタリティあるね〜
- 将来像がうちにあってるからインターンとかきて欲しい
- プロコンめっちゃ頑張ってる!すごい!
- もう少しプロダクトとか作ってみるといいかもね
といった内容でした。みなさんとても褒めてくださったり、こうしたらもっとよくなったりするんじゃないかといったアドバイス、新卒の業務内容や活躍等をたくさん聞かせてくれたのでとても有意義でした!プロコンに関しての発表はみなさん興味深々に聞いてくださり、プロコンに4年捧げたって話をしたらすごい色々と話が盛り上がったりしていい感じに成功したなあと思いました。
途中、企業さんが「おんなじスライド何回もするのは疲れるよねw」など言ってくださり場が和みました〜!w
終始楽しかった印象でした!就活なのにこんなに楽しくて良いのかって気分になったくらいです。
面談タイム終了後
面談終了後もいくつかの企業さんがお話を聞きにきてくださいました!選考もれちゃったけどお話聞ける?と言われた時には嬉しくなってしまって閉じてたスライドをばばっとすぐ出して簡単に説明したりしましたw
本当に有意義で為になる話ばかりでした。
終了の次の日
逆求人から、面談をしてくださった企業さんの総評等がもらえました!好印象の項目が一番高かったので発表はうまくいったのかなあと思います。
ただポテンシャルの点数が低い企業があったりしたので、もっとプロダクトガンガンつくってリリースして失敗して成長しなきゃなあと感じたので今めちゃくちゃモチベ上がってます。がんばろう。
おわりに
逆求人、めちゃくちゃ楽しくて有意義でタメになる!!!!!!
本当に行ってよかったと思います。これから行きたい!と思っている人、逆求人に興味を持った人は是非是非参加したほうがいいと思います!ただ、プロフィールの準備やスライドなど、適当に準備すると企業さんにも失礼なので、そこはちゃんと準備をしてから臨むようにしたほうがいいです!
Sublime Text3からツイキャスの情報を取得したい...したくない?
kosen13s'アドベントカレンダーの17日にあるはずだったやつです...(大遅刻)。
先週くらいに行われたビジネスコンテストに自分は参加してたんですが、運営側にオススメされた中に沖縄高専の会議のすげーやつ(多分@shimamizさんのやつ)があったのでそれを参考にしつつスライドやら発表やらを練習してたらいつのまにかアドベントカレンダー終わってました...つかれた...
いや、ほんとにこの1~2週間はすげえ忙しくて記事の存在を少し忘れてました!反省します。
さて、ここからは記事の本題でみなさん大好きST3のお話です。最近MacBook Proを買い換えたので新しくSublime Text3の構築をしていたら、Packageつくってみたくね...あれ?って気持ちが芽生えてました。あといい歳こいて最近ツイキャスに
鬼ほどはまってしまってほぼ毎日みてました。
そんな時に発見したのがこれ。
ツイキャスにもAPIあったんだ、、、って感じでした。なんかRubyとPHPで動作するやつがあるみたいだったので、ちょうど高専プロコンでもらったさくらInternetさんのVPSをつかって、アクセストークンを取得するやつを作ってみました。
中身はただ単にツイキャスに飛ばして、コールバックしたときにアクセストークン取得してページにそれを表示するだけのコードなので割愛します!まじでドメインとか取得してないから怪しいサイト感が否めないのはごめんなさいです。
これでツイキャスにログインするととりあえずアクセストークンがもらえます。こっからキャスの配信情報を取得していきます。
配信情報を取得する部分を今回はST3のpackageにしました!ぶっちゃけAPIとかも全部Package上で完結させたかったんですけど知識不足で全然できなかった...誰か教えてください...
ちなみにST3のPackageはPython3で動作してるので書くのは簡単です!(簡単とは言っていない)。
独自の記法とか、ST3用のリファレンスとかあるんで、がんばって英語を解読しながらコードをせっせと書きました。
とりあえず流れとしては
トークンを取得
ST3側でトークンを入力
配信情報が取得できる!
って感じになります。コードはこれ。
class CasConnectCommand(sublime_plugin.TextCommand): def run(self, edit, token): window = self.view.window() # output_view = window.get_output_panel("textarea") # window.run_command("show_panel",{"panel": "output.textarea"}) # output_view.set_read_only(False) file_view = window.new_file() headers = { 'Accept': 'application/json', 'X-Api-Version': '2.0', 'Authorization': 'Bearer '+token, } res = requests.get('https://apiv2.twitcasting.tv/verify_credentials', headers=headers) file_view.insert(edit, 0, res.text) # output_view.set_read_only(True) class CasCallCommand(sublime_plugin.TextCommand): def on_done(self,token): self.view.run_command('cas_connect', {'token': token}) def run(self, edit): self.view.window().show_input_panel('トークンを入力 : ', '', self.on_done, None, None)
普段pythonあんまり触らないから書き方でnoobなのがばれちゃうのは勘弁
結果の画面がこんな感じです。
1.トークンの取得
まずツイキャス側で連携を許可して
帰ってきたトークンを表示!
2.ST3側でトークンを入力
このしたにあるトークンを入力のとこにさっき取得したトークン入力します。
3.配信情報の取得
バァン
おわりです。
時間があればST3側でビュワーとか作ったり、別窓で配信みれるようにしたかったんですけどいかんせん時間がなかったですね...時間取れたらがんばってつくってみます。
じゃあみなさん、良いお年を~。
(来年は専攻科に入ってまた後輩のプロコンの世話とかするかもしれないから実質6年プロコンすることになる...老害になっちゃう...)
第28回全国高専プログラミングコンテスト競技部門の話
2017.10.7~9で開催された第28回全国高専プログラミングコンテストに行ってきました.
結果はプロコン競技部門、都立品川は優勝しました。
山口本戦に参加したメンバーはめうめう(@w_yasu_w0809)、hatanoの2人で、応援学生として法華経(@_hokekyo1210)と私(@Mahito6)が居ました。
私の簡単な自己紹介として、過去25~27回の競技部門の都立品川での本戦出場メンバーとして参加をしていました.
準優勝をした26回大会(#procon26)の参加記及び技術的な話は過去に法華経と書いています.
hokekyo1210.hatenablog.jp
今年は自分が5年なので卒業研究で忙しかったことや、後輩を舞台に上げたい気持ち、去年のダメージが大きくてモチベーションが上がらないという点から応援学生として参加して居ました(完全にプロコン老害)。
今年の大会の内容ですが,昨年の27回大会(#procon27)とほぼ同様な内容でした.昨年は木製(MDF製)のパズルが存在し,枠内に置いたピースの個数を競う問題がそのまま得点に反映されるため,どのような置き方をした場合でも得点になるという点がありました.
しかし、今回はルールとして完全解を出さない場合には得点にならないという制約が付け加えられ、与えられる問題のデータも2.5mmの格子状のグリッドに乗るといった項目が追加されました。これによって、去年とは劇的に状況が変わったと思います。画像処理は法華経と一緒に、去年半年かけて完成させたものがあったのでそれを今年用に改良しました。
去年めげずに本番でもプログラムのみで頑張った結果が、今回の優勝に結びついたと私は思っています。
4月(問題公開)
ほぼ完全に去年と同じ内容だったため驚愕。普通にモチベが上がらなかった。でもグリッドとかに乗ってる話とか、いろいろメンバーとは考察を重ねてた。
5-6月
専攻科の入試(推薦)。
7-8月下旬
卒業研究に苦しんだ。でも内容は完成させた。
9月上旬
メンバーに連絡を取ったら全体的な完成度があまりにも低かった。この辺から去年のUIとか画像処理を引っ張り出して頑張った。
9月中旬
サンプルの焦げがめっちゃ少ないからものすごい精度で2値化及びエッジ検出が行えるようになった。運営側のものすごい努力を垣間見た。
あとソルバーを後輩にビームサーチで誤差考慮して解けるようにするよう指示。
9月下旬
滅茶苦茶エッジ検出が上手くいった。研究内容を少し使ってさらに精度を上げたら、サンプルからQRコードと同程度のデータが得られるようになった。また、ピースを並べる時の補助プログラムを後輩に組んでもらうよう指示。
10月
dpiを600から900にして鈍角も精度が良くなった。あとは評価値を考察して最適解が出せるように調整。
本番前日
卒業研究の中間発表があった。競技部門のメンバーは即帰宅して明日に備え就寝。課題はかなり残ってたらしい。
本番(受付日)
早朝家を出てそのまま新幹線で山口へ。徳山についた後、ホテル近くの怪しいカレー屋で腹ごしらえしてからホテルにチェックイン、そのまま会場へ行き参加登録を行った。
その日の夜はクソほど評価値の考察、調整、ソルバの高速化を行った。パンフとか見てたらいろいろアイデアが浮かんだのでそれを実装したり。
本戦(初日)
予行演習は壇上のデータを収集したかったので、ひたすらスキャンする作戦だった。これが意外と虚をついた感じになったのかもしれない。その後初戦は突破。満点出せてたので安心したけど、スキャナとかでトラブってたりしたのでいろいろメモ書きを貼ってミスらないように練習。あと予選1問目が難しかったのでそれをジェネレータで再現して解かせたりして評価を鍛えてた。
本戦(最終日)
課題のリーダーが体調悪そうだったので少し看病してから会場入りした。準決勝観戦には間に合ったけど、ウチは表裏のピースの判別をミスったらしく、完全解が一発で出てなかった。テンパってる後輩を見てそれ以上に法華経と私はテンパりまくってた。
決勝戦ではもうスキャンを使うチームはいないと踏んでいたので間違えないように確実にやるような作戦に変更した。これが功を奏したのか、ミスなく一発で完全解も出たらしいので満点解を提出。大阪府大高専、広瀬が死ぬほど解答が早くてビビった。QRの作戦なら確実に負けてた気しかしない。
感想
後輩が去年の雪辱を晴らしてくれて心の底から嬉しかった。あと、去年のプログラムの方向性が間違っていなかったこともわかったのでそれも嬉しかった。去年不貞腐れてプログラム公開とかしてなかったのも結果的に良かったのかなあと法華経と話したりしてた。専攻科いってもプロコンしたいって気分になる大会の内容でした!
技術的な話はまた後日挙げるのでよろしくお願いします。
P.S. パンフレットで高度な情報戦してすみませんでした...
QWidgetにオブジェクトを追加する
Qtは基本QWidget(とかQDialog、QMainWindow)をベースとして書くけど、あんまり違いとかわかんないからそのままQWidget使ってます。
とりあえずコード。めんどくさいので全部main.cppに自分は記述します。
#include "widget.h" #include <QtWidgets> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; QPushButton *button = new QPushButton("QUIT"); QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit())); QHBoxLayout *lay = new QHBoxLayout(); lay->addWidget(button); w.setLayout(lay); w.show(); return a.exec(); }
こんな感じ。上から大まかに説明します。
(いきなり重要)
Qt5使ってる人は
#include <QtWidgets>
これかなり重要です。なんかQt4の説明記事ばかりで毎度
#include <QtGui>
してください、とか書いてあるんですけど、Qt5から(あくまでも自分の環境では)
これインクルードしない限りお話にならない(オブジェクトとか色々まとめてやってくれる)ので、取り敢えずこれは忘れないこと。
ようやくコードの説明。
QPushButtonの宣言
QPushButton *button = new QPushButton("QUIT");
buttonという名のQPushButtonのオブジェクトを生成。
次はかなり重要なオブジェクトのSIGNAL, SLOTのお話。
QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
あんまり考えずにそのまま見た通り
buttonのclick受け取ったら、a(アプリケーション)をquit()させますよ、ってことです。
Qtは大体これつかって処理作ってるイメージです。
最後にタイトルの通り、QWidgetにオブジェクトを追加するやり方。
QHBoxLayout *lay = new QHBoxLayout();
lay->addWidget(button);
w.setLayout(lay);
w.show();
QHBoxLayoutとやらでレイアウト指定し、そのレイアウトにbuttonを追加。
widgetにレイアウトをセットしてw.show()で表示。
完成品がこれ
ど真ん中にquitが来ててダサい。これ押したらそのままアプリケーション終了するので、まあ上手くはできたのかな。
とりあえず今回はここまで。
はあ、説明終わった。疲れた。説明になってないと思うけどゆるして。