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

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年半の熟成の後にようやく開けて電源に繋いだ。やったことをメモ程度にかく。

手頃な容量の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を試してみました。

構成はこんな感じ

$ 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_apiRails本体に取り込まれる前と同様に、ApplicationControllerは ActionController::API を継承したものになっていますね。

class ApplicationController < ActionController::API
end

config/application.rb にも api_onlytrue になっています。

# 省略
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 にアクセスするとこんなページが表示されます。

f:id:wata_ori:20160207154112p:plain

Rails5からロゴが変わりましたね。 特に問題なくここまで来れました。

ここにRSpecやFactoryGirlを入れたりして今までと同じようにコードを動かしていましたが、ところどころで5.1では完全に使えなくなるよというwarningが出てきます。 やはりBeta版ということもありまだ対応できていないライブラリもあるので、注意が必要です。

(修正) ここにコードを置いておきます。

github.com

Scrap Challengeに参加した

mixi Scrap Challenge

簡単に内容を説明すると、わざと脆弱性を盛り込んだmixiのクローンサイトに対してあんなことやこんなことをしてスコアを競う形式のイベントです。

Scrap Challenge | 株式会社ミクシィ 学生向けエンジニアイベント

インターン先でWebアプリケーションを触っている割にはあまりセキュリティに関して詳しくないので、セキュリティの勉強のきっかけにでもなればと思い参加しました。

内容

最初のほうにチュートリアルとしてXSSCSRFを一緒にやってみて、昼食をとった後にそれぞれのチームに別れてクラックしていくという形式でした。 お題がいくつかあってそれぞれに解いたときの得点が振られているのですが、一定時間が経つとヒントが提供される代わりに得点が下がっていきます。

自分のチームは3人いて、それぞれが分担してお題にあたっていくスタイルで解いていきました。 詰まったときは相談して一緒に解決したりして、なかなか良いペースでお題を消化していくことができました。

作業中はmixi社員の方に様々なBGMを流していただきました。こちらは前半ずっと流れていた素晴らしいBGMです。ぜひ聴いてみてください。他にもよく知らない外国の歌とかMADみたいのとか日常とかゆるゆりとかのんのんびよりとかラ!とかきんモザとかとか作業妨害がいっぱいありました。

いつもキミをまもりたいから - YouTube

結果

3位になれました :clap: :clap:

2問解けなくて残念でした。ヒントがたくさん出ていて得点も下がっていたので、解けても3位でしたが...

何か1言と言われて緊張してしまい、本当に1言だけしか喋れませんでした。どうしてこうなってしまったのか。

そのあと、MarsOneの候補者として来年から訓練に向かう方のいい話を聞いたりしていました。超カッコイイです。

http://www.mars-one.com/

マーズワン - Wikipedia

懇親会もしました。昼と合わせて2食も出ました。貧乏学生には嬉しい限りです。

最後に

今まであまり理解していなかったWebサイトの脆弱性についての知見が深まって大変良かったです。

徳丸本も買いました。モチベーションが高まっている今のうちに読んでおきたいですね。 (ここから買っていただくとぼくが喜びます)

知らない人たちとハッカソンに参加した話

この記事は CAMPHOR- Advent Calendar 2014 16日目の記事です。

こんにちは、ワタオリです。 普段は東京で大学に通いつつエンジニアをしています。 さっき上海から帰ってきて爆速で記事を書いているので誤字とか多いと思います。きにしないでください。

↑煽られている様子

少しでもCAMPHOR- に関係ある記事を書こうと思ったので、今回はCAMPHOR- HOUSEに遊びに行ったときの話を書きます。

京都に遊びに行きました

10月の初め頃、一緒にインターンで働いていたCAMPHOR- 代表の @kouhei18 にハッカソンに誘われました。リンク( クックパッド開発コンテスト24 @CAMPHOR- HOUSE : ATND )を投げられただけなのですが、京都行くのもなんか楽しそうだなーとそのまま夜行バスをとりました*1

京都について2日間リモートでインターンをして、その後でクックパッド社の開催していた 開発コンテスト24 というハッカソンに参加しました。

これは与えられたテーマに沿ってプロダクトを24時間で開発・提出するというものです。人生初のハッカソンになりました。リモートで一緒に仕事してた@kouhei18 は家族旅行で消えました。参加すると思っていたのでびっくりしました。

朝9:00にテーマが発表なので、万全の体制で挑むためにぼく含め何人かはCAMPHOR- HOUSEで仮眠をとっていたのですが、結局誰も起きることができず10:30くらいにテーマを知りました。そこからコーヒーをいれたりご飯食べにいったりで結局16:00くらいまで何もしなかった。万全の体制で挑むには準備が必要ですからね。

眠い 昼寝 あんちぽ 眼鏡 全然効率的でない ペパボ kentaro antipop 実写

ぼくはRuby on Railsがチョットデキル*2のでバックエンドを担当して、@morishiniOS側の実装、もう1人の方(名前忘れてしまった、、、)がデザインをするということになりました。

早く終わらせてビールをキメるはずだったのですが、なぜかエナジードリンクをキメて朝まで開発してしまいました。さらにデプロイでrbenv地獄にハマったりログイン処理が未完成だったりで締め切りの翌朝9:00に間に合いませんでした。*3 それでもCAMPHOR- の方々はあたたかくアドバイスをたくさんくれたし、得る物はメチャクチャありました。

みんなで畳の部屋に集まってわいわい開発したり、豆からコーヒーをいれてみたり、少し遠くまでラーメンを食べにいったり、プロジェクターを起動してへんなスクリプトを動かして見せたりと、居心地がよかったし超楽しかったです。

(中央右のチェックシャツがぼく)

たまに京都に行くのですが次行くときはCAMPHOR- にも遊びに行きたいと思います。 ただ早く行かないと知ってる人何人か卒業してしまう、、

明日は pepoipod です!(誰だ...)

*1:日程を間違えたのでキャンセル料をけっこうとられて悲しい気持ちになった

*2:本当にごめんなさい

*3:このへんはデスマ明けの亀岡くんとか宮崎くんにかなり助けてもらったのに申し訳無いと思ってる