「Webサービスを作りたい!」と思ってから実際に作るまで5年かかった

この記事は CAMPHOR- Advent Calendar 2018 10日目の記事です.

初めまして.京大工学部情報学科1回のあたらんです.プログラミングは初心者ですが,初心者なりに感じていることを綴ろうと思います.

最高にクールなWebサービスを作りたい

中学2年生の時,映画「ソーシャルネットワーク」を見ました.マークザッカーバーグハーバード大学在学中にFacebookを作り上げる過程を描いた映画ですが,とても感動したのを覚えています.どこに感動したかというと,Facebookをローンチした瞬間にサーバーのログが大量のアクセスによって流れていくシーン.一人の人間が作り上げたものが大量の人間に影響を与えているのが最高にかっこよくて,「やばい,Webサービス作りたい!」という気持ちになりました.しかし,実際にWebサービスを作るまで(今初めてWebサービスと呼べるものを作っている)にはそれから5年もかかってしまいました.

そこから学んだプログラミングの習得(やそのほかの学習なんでも)に重要だと思っていることを書こうと思います.

順番って大事

初手Railsチュートリアルはだめ

高校生になった僕は,入学祝いに念願のMacBook Proを買ってもらい,夏休みに中高生向けプログラミングキャンプWebサービス開発コースに参加しました.プログラミングキャンプとは言っても5日間しかないし,HTMLとCSSをdotinstallでかじった程度の知識でRailsを理解するのは不可能でした.

その後Railsチュートリアルで勉強しようと試みましたが,Rubyをはじめその他のプログラミング言語を何一つ触ったこともない状態で理解できるはずもありませんでした.Webフレームワークを理解するにはそのフレームワークプログラミング言語をまず習得する必要があります.

というかそもそも,動的なWebサービスを作る為には世の中のWebサイトを閲覧できる仕組み(インターネットの仕組みとかhttpプロトコルとか)を学び,プログラミングとは何かを知り,Webフレームワークの仕様を学ぶ,というプロセスが必要だと僕は思っています.Railsチュートリアルに案の定挫折させられた(RailsチュートリアルはあたかもRubyが分からない人にも理解できるかのように書かれている)僕からプログラミングをするモチベは消え去りました.

Webフレームワークの勉強をする前に,そのフレームワークを記述しているプログラミング言語の基本的な文法は最低限学ぶようにしましょう.

コミュニティって大事

オフラインで人と会うことの重要性

大学入学前よりも,大学に入学してCAMPHOR-に通い始めてからの方が成長のスピードは多分数倍速いです.当時はプログラミングができる人にもほとんど会ったことがなかったので学習方法もよくわからず,本で勉強するなんてナンセンスだと思っていて,全てググってどうにかしようと思っていました.実際ググって出てくる情報はググっただけでどうにかなるていで書かれていますが,ググっただけではどうにもならないこともあるということを実際に人に会って初めてわかりました.

ググったらなんでもわかる時代とはいえ,やはり人に会ってみないとわからないことも多々あります.

ちょっとズレるような気もするけど,こんな研究もあります.

切磋琢磨できる仲間を探す

大学入学以前は周りに「プログラミングやりたい!」って言っている人は多分ほとんどいなかったので,自分がプログラミングをやっていてもその話題を共有できる人がいませんでした.自分のやっていることが共有できる仲間がいない場合,モチベは続きません(少なくとも僕の場合).

僕は高校時代数学にハマっていました.高1の冬休み,塾の友達と数学の問題集の1つの章を1週間で1周できなければ500円払うという賭けみたいなことをしたことがあります.それを3,4週間した時には「数学おもしれー」ってなってたし,美しい解法を誰かが見つけた時にはそのメンツで共有したりしました.

同じように,大学に入学して競プロというものの存在をCAMPHOR-で知り,学科の友達とその話題を共有することでプログラミングにハマっていきました.おそらくアルゴリズムを考えること自体も面白いことではあるのですが,自分で思いついた美しいアルゴリズムを人と共有して盛り上がることでモチベが保たれるんだと思います.一人で黙々とやってモチベを保てている人がいるとすれば,尊敬します.

Webサービスを開発したい人が辿るべき道

結局,「Webサービスを作りたい!」と思った人がまずやるべきは,パソコンを買って,同じような意志を持った集団に属し(なるべくオフラインがいい),焦らずに必要なことから習得していくことです.そのような環境を提供してくれるのでCAMPHOR-はいいところです.

今開発しているWebサービス

それはそうと,今どんなWebサービスを開発しているかちょっと紹介します.

RoC京大(Rate our Coursesの略)という,自分の取っている授業にレビューや資料をを投稿して共有できる,京大に排他的なサイトを作っています.授業を選ぶ時に先輩たちのレビューを参考にできたり,同じ授業を取っている人とノートを共有できたり(,過去問をもらえたり)してみんなハッピーになる気がしています.

伝えたかったこと

  1. 物事を学習しようと思ったら,焦らず必要なことから順番に学習する.

  2. 学習のモチベを維持する為に同じ目的を持った集団に属す.

  3. それにハマる.

以上です.

なんか精神論みたいな話が多くなってしまいましたが,最後まで読んでいただいてありがとうございました.来年はバリバリに技術的な話ができるようにレベル上げしていきたいと思います.

Raspberry PiをIRリモコンにする

はじめに

LIRCを使ってRaspberry Piで赤外線の送受信するとこまで。

計画

スマートホーム化①

Google HomeRaspberry Piで家電を操作する f:id:satoarata:20180522175108p:plain

目次

用意するもの

必要ならば

ハードを整える

ハード面はこのサイトを参考にしました。(回路は全く同じ) make.bcde.jp

実際に使った電子部品など :

lircで赤外線受送信部分を作る

lircとは

LIRC is a package that allows you to decode and send infra-red signals of many (but not all) commonly used remote controls. (http://www.lirc.org/)

要はRaspberry Piを赤外線リモコンにするやつってこと。たぶん。

Raspberry Piにインストール

$ sudo apt install lirc

バージョンの確認

$ lircd -v lircd 0.9.4c

lircの設定を変更(/etc/lirc/lirc_options.confを編集する)

$ sudo emacs /etc/lirc/lirc_options.conf

[lircd]のところをこんな感じにする

[lircd] 
nodaemon = False 
driver = default 
device = /dev/lirc0 
output = /var/run/lirc/lircd 
pidfile = /var/run/lirc/lircd.pid 
plugindir = /usr/lib/arm-linux-gnueabihf/lirc/plugins 
permission = 666 
allow-simulate = No 
repeat-max = 600 
#effective-user = 
#listen = [address:]port 
#connect = host[:port] 
#loglevel = 6 
#uinput = ... 
#release = ... 
#logfile = ... 

変えたのは

driver = default 
device = /dev/lirc0 

使うピンの設定 /boot/config.txtを編集

$ sudo emacs /boot/config.txt 

最後にこれを追加(ピンのところは自分で決めたピン)

#RemoteController 
dtoverlay=lirc-rpi 
dtparam=gpio_in_pin=22 
dtparam=gpio_out_pin=23 

再起動

$ sudo reboot 

動作確認

$ sudo mode2 -d /dev/lirc0 

受信モードになるので受信機にテレビのリモコンとか向けて赤外線を浴びせてみる

Using driver default on device /dev/lirc0
Trying device: /dev/lirc0
Using device: /dev/lirc0
Running as regular user pi
space 16777215
pulse 3766
space 1921
pulse 441
space 482
pulse 465
space 1436
pulse 446
space 432
pulse 508
space 1443
pulse 489
space 466
pulse 431
... 

って感じで出てきたらOK

ちなみにlircの起動は $ sudo /etc/init.d/lircd start 終了は $ sudo /etc/init.d/lircd stop リモコンの学習はirrecordでやってる記事も多いがうまくいかなかったので、さっきの受信モードで受信したデータを加工して設定ファイルを記述した。

このサイトを参考にした。

takuborn.hatenablog.jp

補足:irrecord で作成した定義ファイルではうまくいかないとき

のところを参考にしてファイルを作る。

部屋の照明を登録した。

lircを再起動して ちゃんと登録されたか見てみる

$ irsend list "" "" 
light tv

信号を送ってみる

$ irsend send_once light full

電気がついた!