Raspberry Piとnginxでサクッとファイルサーバ作った
前回 の続き。
太古の無線LAN子機があまりにも使えない子だったので200円くらいでLANケーブル買ってつないだ。途中で切れたりしなくなった。
nginx実践入門 にたしかビルド済みパッケージはバージョンが古いと書いてあったような記憶があるので、 公式サイト からmainlineの最新のバージョンを落としてきた。特にnginxに追加したいmoduleもないので素直に configure
して make
して make install
した。
conf/nginx.conf
をこんなかんじで編集した。
http { ... server { listen 80; server_name localhost; root /media/pi/HDD; location / { access_log off; autoindex on; } } }
めちゃ短い。 自分しか使わないのでアクセスログを切った。エラーログはとりあえず出しておく。
起動sudo /usr/local/nginx/sbin/nginx
GET 192.168.0.10
403 Forbiddenって言われた。
エラーログ見ると index.html" is forbidden (13: Permission denied)
とか言われるんだけど権限ちゃんと755になってるしなぁと思ってたら、その上のディレクトリの権限がだめでした。*1
自分の環境だと sudo chmod 755 /media/pi
としてみたところ、問題なくファイルツリーが表示された。これで家の中にいる限りはなんでもDLできるようになった。便利!
1年半寝かせたRaspberry Piを引っ張り出してきた
2017年はもう少しブログをやっていきたい。
最近3TBのHDDを手に入れたのだけど、たまってる写真とかバックアップデータも保存できるようサーバでも立ててみるかと思い立って、22歳の誕生日に @kazutoyo さんにもらったRaspberry Pi 2を1年半の熟成の後にようやく開けて電源に繋いだ。やったことをメモ程度にかく。
22歳の誕生日にもらって放置してたラズパイ、この前やっとmicroSDカードを買って今初めて電源入れた
— ワタオリ (@cotton_ori) 2017年1月8日
手頃な容量のmicroSDカードがなかったので使えなかったのだれど、やっと買った。これを買った。
NOOBSをDLして展開した。 MicroSDカードを開けてそのままNOOBSをコピーして電源入れたら起動しなかった。FAT32でフォーマットして入れ直したら動いたのでそのままウィザードに従ってRaspbian OSを入れた。
パッケージをアップデートしてvimを入れる。
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install vim
$ sudo raspi-config
ロケールがUKになっていたのでJPに変更してタイムゾーンも Asia/Tokyo
にする。ssh接続したいのでsshもenabledに変更。キーボードはもともと英字なのでそのまま。 http://www.k2-y.com/archives/2033 あたりを参考にしました。
一旦再起動
$ sudo shutdown -r now
microSDにswap領域があって心がざわつくのでswapを切る。
$ sudo swapoff --all
使っていないときはHDDの回転数を下げたくて、以下を参考に設定した。 kassyjp.ninja-web.net
sshするのにipを固定させたいので、 /etc/network/interface
を編集しようとするとコメントアウト形式で /etc/dhcpcd.conf
を編集してねって書いてあるのでそっちに追加する。余っていた太古の無線LAN子機で接続しているので適当にルータの管理画面を見ながら
# 以下を追記 interface wlan0 static ip_address=192.168.0.10/24 static routers=192.168.0.1 static domain_name_servers=192.168.0.1
のように設定した。 これで再起動すれば、USB接続したHDDにscpできるようになった。httpでアクセスできるとより便利なので、nginxで適当にwebサーバを立ててディレクトリをたどれるようにする。(続く)
Rails5 Beta2を触ってみた
フレームワークを使って簡単なAPIサーバを立てる機会がありました。本当に軽いAPIだからSinatraとかで十分なんだけれど、せっかくだから使ってみようかと思いRails5を試してみました。
構成はこんな感じ
- サーバ: Heroku
- DB: PostgreSQL(9.5.0)
- アプリケーションサーバ: Puma
$ rails new test_app --skip-bundle --skip-test --skip-action-mailer --skip-action-cable --api -d postgresql
目玉機能の1つである action_cable ですが --skip-action-cable
にあるように今回は使っていません。API modeは使っています。
以下のようなファイルたちが生成されました。ActiveJobも使わないんだけどskipさせる方法がわからなかったので手動で消します。
$ tree ./ ./ ├── Gemfile ├── README.md ├── Rakefile ├── app │ ├── controllers │ │ ├── application_controller.rb │ │ └── concerns │ ├── jobs │ │ └── application_job.rb │ ├── mailers │ └── models │ ├── application_record.rb │ └── concerns ├── bin │ ├── bundle │ ├── rails │ ├── rake │ ├── setup │ └── update ├── config │ ├── application.rb │ ├── boot.rb │ ├── database.yml │ ├── environment.rb │ ├── environments │ │ ├── development.rb │ │ ├── production.rb │ │ └── test.rb │ ├── initializers │ │ ├── active_record_belongs_to_required_by_default.rb │ │ ├── application_controller_renderer.rb │ │ ├── backtrace_silencers.rb │ │ ├── callback_terminator.rb │ │ ├── cors.rb │ │ ├── filter_parameter_logging.rb │ │ ├── inflections.rb │ │ ├── mime_types.rb │ │ └── wrap_parameters.rb │ ├── locales │ │ └── en.yml │ ├── puma.rb │ ├── routes.rb │ └── secrets.yml ├── config.ru ├── db │ └── seeds.rb ├── lib │ └── tasks ├── log ├── public │ ├── 404.html │ ├── 422.html │ ├── 500.html │ ├── favicon.ico │ └── robots.txt ├── tmp │ └── cache ├── tree └── vendor 20 directories, 39 files
app/views が作られていません。新たにscaffold等でgenerateすると、controller側でActiveRecordのインスタンスを返すようになっています。今回はこれで問題ありません。またviewがないのでsprocketsやturbolinksも自動的にskipされているのが確認できます。500や404はhtmlのまま残っているので修正が必要そうです。
rails_api がRails本体に取り込まれる前と同様に、ApplicationControllerは ActionController::API
を継承したものになっていますね。
class ApplicationController < ActionController::API end
config/application.rb
にも api_only
が true
になっています。
# 省略 module TestApp class Application < Rails::Application config.api_only = true end end
継承のことで言うと、ユーザーが追加するmodelが今までは ActiveRecord::Base
の子クラスとして生成されていましたが、Rails5では ActiveRecord::Base
を継承した ApplicationRecord
の子クラスとして生成されます。1つ抽象クラスが間に入った形になりますので、複数モデル間で共通のメソッドはここに定義しておくことができます。ファットモデルを避けるためにService層なんかを導入するやり方がありましたが、それに近いものが標準で提供されました。
class ApplicationRecord < ActiveRecord::Base self.abstract_class = true end
次にアプリケーションサーバです。4.2まではデフォルトのアプリケーションサーバはWebrickでした。これはシングルプロセスなのですが、ActionCableは余っているプロセスを使ってwebsocketを提供するものなので、Webrickでは利用できないことになります。なのでデフォルトでPumaが入るように変更されました。Rails5.0.0.beta1 Release に詳しく書かれています。Herokuおすすめの設定 に変更。
workers Integer(ENV['WEB_CONCURRENCY'] || 2) threads_count = Integer(ENV['MAX_THREADS'] || 5) threads threads_count, threads_count preload_app! rackup DefaultRackup port ENV['PORT'] || 3000 environment ENV['RACK_ENV'] || 'development' on_worker_boot do ActiveRecord::Base.establish_connection end
$ rails server
でPumaが立ち上がります。
$ bundle exec rails server => Booting Puma => Rails 5.0.0.beta2 application starting in development on http://localhost:3000 => Run `rails server -h` for more startup options => Ctrl-C to shutdown server Puma 2.16.0 starting... * Min threads: 0, max threads: 16 * Environment: development * Listening on tcp://localhost:3000
localhost:3000
にアクセスするとこんなページが表示されます。
Rails5からロゴが変わりましたね。 特に問題なくここまで来れました。
ここにRSpecやFactoryGirlを入れたりして今までと同じようにコードを動かしていましたが、ところどころで5.1では完全に使えなくなるよというwarningが出てきます。 やはりBeta版ということもありまだ対応できていないライブラリもあるので、注意が必要です。
(修正) ここにコードを置いておきます。
Scrap Challengeに参加した
mixi Scrap Challenge
簡単に内容を説明すると、わざと脆弱性を盛り込んだmixiのクローンサイトに対してあんなことやこんなことをしてスコアを競う形式のイベントです。
Scrap Challenge | 株式会社ミクシィ 学生向けエンジニアイベント
インターン先でWebアプリケーションを触っている割にはあまりセキュリティに関して詳しくないので、セキュリティの勉強のきっかけにでもなればと思い参加しました。
内容
最初のほうにチュートリアルとしてXSSやCSRFを一緒にやってみて、昼食をとった後にそれぞれのチームに別れてクラックしていくという形式でした。 お題がいくつかあってそれぞれに解いたときの得点が振られているのですが、一定時間が経つとヒントが提供される代わりに得点が下がっていきます。
自分のチームは3人いて、それぞれが分担してお題にあたっていくスタイルで解いていきました。 詰まったときは相談して一緒に解決したりして、なかなか良いペースでお題を消化していくことができました。
作業中はmixi社員の方に様々なBGMを流していただきました。こちらは前半ずっと流れていた素晴らしいBGMです。ぜひ聴いてみてください。他にもよく知らない外国の歌とかMADみたいのとか日常とかゆるゆりとかのんのんびよりとかラ!とかきんモザとかとか作業妨害がいっぱいありました。
結果
3位になれました :clap: :clap:
2問解けなくて残念でした。ヒントがたくさん出ていて得点も下がっていたので、解けても3位でしたが...
何か1言と言われて緊張してしまい、本当に1言だけしか喋れませんでした。どうしてこうなってしまったのか。
そのあと、MarsOneの候補者として来年から訓練に向かう方のいい話を聞いたりしていました。超カッコイイです。
懇親会もしました。昼と合わせて2食も出ました。貧乏学生には嬉しい限りです。
最後に
今まであまり理解していなかったWebサイトの脆弱性についての知見が深まって大変良かったです。
徳丸本も買いました。モチベーションが高まっている今のうちに読んでおきたいですね。 (ここから買っていただくとぼくが喜びます)
知らない人たちとハッカソンに参加した話
この記事は CAMPHOR- Advent Calendar 2014 16日目の記事です。
こんにちは、ワタオリです。 普段は東京で大学に通いつつエンジニアをしています。 さっき上海から帰ってきて爆速で記事を書いているので誤字とか多いと思います。きにしないでください。
@invendu ヒィィ今帰ってるので!もう六本木にいるので!
— ワタオリ (@cotton_ori) 2014, 12月 15
↑煽られている様子
少しでもCAMPHOR- に関係ある記事を書こうと思ったので、今回はCAMPHOR- HOUSEに遊びに行ったときの話を書きます。
京都に遊びに行きました
10月の初め頃、一緒にインターンで働いていたCAMPHOR- 代表の @kouhei18 にハッカソンに誘われました。リンク( クックパッド開発コンテスト24 @CAMPHOR- HOUSE : ATND )を投げられただけなのですが、京都行くのもなんか楽しそうだなーとそのまま夜行バスをとりました*1。
京都について2日間リモートでインターンをして、その後でクックパッド社の開催していた 開発コンテスト24 というハッカソンに参加しました。
これは与えられたテーマに沿ってプロダクトを24時間で開発・提出するというものです。人生初のハッカソンになりました。リモートで一緒に仕事してた@kouhei18 は家族旅行で消えました。参加すると思っていたのでびっくりしました。
朝9:00にテーマが発表なので、万全の体制で挑むためにぼく含め何人かはCAMPHOR- HOUSEで仮眠をとっていたのですが、結局誰も起きることができず10:30くらいにテーマを知りました。そこからコーヒーをいれたりご飯食べにいったりで結局16:00くらいまで何もしなかった。万全の体制で挑むには準備が必要ですからね。
ぼくはRuby on Railsがチョットデキル*2のでバックエンドを担当して、@morishinがiOS側の実装、もう1人の方(名前忘れてしまった、、、)がデザインをするということになりました。
早く終わらせてビールをキメるはずだったのですが、なぜかエナジードリンクをキメて朝まで開発してしまいました。さらにデプロイでrbenv地獄にハマったりログイン処理が未完成だったりで締め切りの翌朝9:00に間に合いませんでした。*3 それでもCAMPHOR- の方々はあたたかくアドバイスをたくさんくれたし、得る物はメチャクチャありました。
みんなで畳の部屋に集まってわいわい開発したり、豆からコーヒーをいれてみたり、少し遠くまでラーメンを食べにいったり、プロジェクターを起動してへんなスクリプトを動かして見せたりと、居心地がよかったし超楽しかったです。
ワタオリ完全に馴染んでいる。 pic.twitter.com/Hhy9tqoJ76
— こへにゃん (@kouhei18) 2014, 10月 16
(中央右のチェックシャツがぼく)
たまに京都に行くのですが次行くときはCAMPHOR- にも遊びに行きたいと思います。 ただ早く行かないと知ってる人何人か卒業してしまう、、
明日は pepoipod です!(誰だ...)