サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
iPad Air
blog.dakatsuka.jp
これはScala Advent Calendar 2016の5日目です。埋まっていなかったので1日遅れでしれっと書くよ。 Akka HTTPには AuthenticationDirective という認証のためのディレクティブが標準で用意されていて、Bearer Token を自前で認証したいケースで使える。使いかたはコードを見たほうが分かりやすいと思うのでサンプルを乗せた。 import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.headers.{HttpChallenge, OAuth2BearerToken} import akka.http.scaladsl.server.directives.{AuthenticationDirective, Auth
本当はローカルのMac OS X上に開発環境を構築したのだけど、メモを取り忘れていたので、改めてVagrantで起動したUbuntu 15.10上で開発環境を整えてみた。 まずシステムにOcamlとOPAMをインストールする。2016年1月時点ではOCaml 4.02.3が入った。 $ sudo add-apt-repository ppa:avsm/ppa $ sudo apt-get update $ sudo apt-get install ocaml ocaml-native-compilers camlp4-extra opam m4 git mercurial darcs バージョンを確認。 $ ocaml -version The OCaml toplevel, version 4.02.3 $ opam --version 1.2.2 OPAMを使うためには初期化が必要。こ
これはScala Advent Calendar 2015(Adventar版)7日目です。6日目はHiroyuki-NagataさんのScalatraとnon-blocking APIについてメモ - なんとな~くしあわせ?の日記でした。 さて、7日目はFinchというFinagleラッパーを紹介しようと思います。よくあるSinatraライクなマイクロフレームワークのひとつです。Hello Wordをブラウザに出力してはい終わりというのも味気ないので、MySQLに接続してレコードを取り出したり登録出来るところまで持っていきます。 はじめに# 今回は以下のエンドポイントを作ることにします(更新と削除は面倒になったので無し!ごめんなさい) GET /users GET /users/:id POST /users コードを書く前にMySQLにテーブルを作っておきましょう。 CREATE TA
どちらのgemもActiveRecordモデルにimportメソッドを生やそうとする。 いい感じに共存させる方法をググっていたら同じことをIssueで質問している人がいて、解決方法が書いてあったので助かった。config/application.rbでactiverecord-import側のメソッド名を変更する。 require File.expand_path('../boot', __FILE__) require 'rails/all' # https://github.com/zdennis/activerecord-import/issues/149 require 'activerecord-import/base' class ActiveRecord::Base class << self alias :bulk_insert :import remove_method
What’s http4s# RackやWSGIのScala版といったところ。公式サイトの説明も次のように書いてある。 http4s is a minimal, idiomatic Scala interface for HTTP. http4s is Scala’s answer to Ruby’s Rack, Python’s WSGI, Haskell’s WAI, and Java’s Servlets. まだまだ開発途中でドキュメントなどはあまり整備されていなくて、まともに使おうと思ったらソースコードを読む必要が出てきそう。次期Scalatraのバックエンドになるとかならないとか噂されているけどはてさて?もしかしたらAkkaやFinagleに押されて流行らずに終わる可能性もある。 ちなみにscalaz-streamが使われている。 Install# 最小構成で使う場合は http
CircleCIでElasticsearchの最新版とKuromojiを使うならDockerが便利だった。circle.ymlでwgetして頑張るよりは1こちらのほうがスマートだし、ここで用意したDockerfileはCI以外でも使える。 下記コードをcontainers/elasticsearch/Dockerfileに保存する。 FROM elasticsearch:1.7.1 RUN plugin install mobz/elasticsearch-head RUN plugin install elasticsearch/elasticsearch-analysis-kuromoji/2.7.0
ドメイン層(普通のScalaプロジェクト)とアプリケーション層(Play)でsbtプロジェクトを分けたい場合は、sbtのマルチプロジェクトを使うと良い。 完全にリポジトリごとに分けても良いのだけど、IDEのリファクタリング機能などの便利機能の恩恵を受けたいとか、開発初期でドメインの更新が頻繁にあるなら、同一リポジトリでマルチプロジェクト構成のほうがおすすめ。 ディレクトリ構成は下記のようにする。 sbtはサブプロジェクト内のprojectディレクトリを無視するので、Playのsbt-pluginなどはメインプロジェクトで読み込む。 project/pugin.sbt resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/" addSbtPlugin("com.typesafe.pl
CloudWatchやAuto Scalingのアラームは、Amazon SNSのTopicにPublishする仕組みになっていて、通常はこのTopicに通知先のメールアドレスを設定することが多いと思う。 メールでもあまり困らないんだけど、社内ではChatOpsを進めていてコミュニケーションツールにSlackを使っているので、ほとんどメールの出番がない。必然的にメーラーよりSlackを立ち上げている時間が長いので、通知系はSlackに集約したくなった。 こんな感じでチャットに流れてくるようになって満足度高い。 念のためメールアドレスにも通知するようにはしているけど、今のところSlackに通知が来なかったり遅れてくることはない。スマートフォンへのプッシュもSlack任せにしている。 仕組み# Amazon SNSから直接Slackにリクエストを送ることは出来ないので、中継サーバを立てる必要が
理想 $ sudo bundle exec rake 現実 $ sudo bundle exec rake sudo: bundle: command not found sudoで実行すると環境変数が初期化されているので当然の挙動ですが、システムワイドに入れていないrbenv環境下でもroot権限で実行したいことが稀にあります(docker-api使いたいとか そういう時はrbenv-sudoを使うと解決します。自分でパスを弄ったりしなくても良いのでお手軽。rbenvのプラグインなので~/.rbenv/pluginsにcloneするだけで使えます。 $ rbenv sudo bundle exec rake
Play framework 2.3 (Scala版)で開発しているアプリをTravis ProでCIしていたのだけど、ビルド時間がネックになってきたのでインスタンス性能が高いと噂のCircleCIに移行することにした。 CircleCIの対応言語の中にScalaは入っていないが、Javaが使えるので特に問題はない(何故かちょっと古いsbtが入っていたのでexperimental扱いなのかな?) circle.ymlは下記のようにしてる。 dependencies: cache_directories: - ~/.m2 - ~/.ivy2 - ~/.sbt override: - "./activator update" database: override: - cp ./conf/test.conf.circleci ./conf/test.conf test: override: -
Play2でDIをどうしようか悩んでいたところscaldiというライブラリが目に止まった。Playに組み込むためのライブラリをあるし、公式サイトも作り込まれているし、これは試すしかない。 ただし日本語の情報は無いに等しい。Guiceほどメジャーでもないし人柱感覚で使う必要がありそうだ。 インストール# build.sbtのlibraryDependenciesにscaldiを追加する。
前提条件# Vagrant BoxがファイルシステムにLVM + ext3/4を使っていること。今回はVagrantbox.esで配布されているDebian Wheezyを利用した。 仮想ディスクを拡張する# VMDK形式だとサイズを変更することが出来ないのでVDI形式に変換する必要がある。リサイズが完了したらVirtualBoxのVMの設定画面でHDDをVDIのほうに差し替えておく。 $ cd ~/VirtualBox\ VMs/vagrant_default_xxxxx_xxxxx $ VBoxManage clonehd box-disk1.vmdk box-disk1.vdi --format VDI $ VBoxManage modifyhd box-disk1.vdi --resize 20480 パーティションテーブルを変更する# ここからはゲスト側での操作。 fdiskで/
モデルの数がそれなりにあるプロジェクトに途中から参加すると、モデル同士の関連を把握するのに結構苦労するので、ER図の存在が重要になってくる。ActiveRecordならRails ERDというgemを使えばER図を生成してくれるのだが、MongoMapper用のツールは無さそうだったので作った。 こんな感じの画像を生成できる。 まだ One-To-Many だけで Many-To-Many や Embedded には対応していないのだけど、ひとまず全体を把握するのには役にたった。余裕があれば対応していきたい。Pull requestも待ってます! dakatsuka/mongo_mapper_diagram - GitHub ちなみにグラフの生成には@merborne氏のGvizを使いました。Rubyから簡単にGraphvizが扱えて便利だった。 使い方# Gemfileに追加。
サインアップフォームなどでユーザー名が取得可能かどうかAjaxで問い合わせるアレです。 愚直に実装するとkeyupイベントをキャッチして$.ajax()を使うだけですが、これだと1文字入力する毎にサーバのAPIを叩くことになってしまうので少し工夫。 Ajax通信をしたいテキストフィールドにデータ属性を作ってAPIのURLを書いておく。 <input type="text" id="user_username" name="user[username]" data-autocheck="/autocheck/username"> $(document).on("keyup", "input[data-autocheck]", function() { var elem = $(this); var data = { url: elem.data("autocheck"), value: el
無職から個人事業主にジョブチェンジしました。 自分でサービスの開発もしていきたいですが、当面は傭兵としてサーバサイドプログラミングやインフラ構築、マークアップエンジニア的なことをやっていく予定です。私は営業やセルフブランディングは苦手な方ですが、ありがたい事に数名の方々からお声を掛けて頂き、何とか無事に仕事をスタートさせています。 以下、あまり役に立たない備忘録。 銀行口座# 最寄りの三菱東京UFJ銀行で事業用口座を開設しました。別支店の個人用口座の中身を覗かれたりやたら時間がかかったりしましたが、無事に開設出来ました。 ところで、前々職でBizSTATIONというネットバンキングに発狂した経験があるのですが、個人用も事業用だとBizSTATIONなんですね。。。Macで使えないからとても渋い。 クレジットカード# 事業用口座から引き落とし出来るカードは、手持ちだとダイナースのビジネスアカ
前置き# Symfony2を構成するサービスはほぼDIコンテナの上に乗っているので、ドメインとデータベース、フレームワークがそれぞれ疎結合になっています。そのため、ドメインのテストを行う際はフレームワークの読み込みやデータベースに接続する必要はありません。依存部分はモックに置き換えてしまえば良いわけです。 とはいえ、コントローラやサービスは実際にデータベースに接続してテストを行っておきたいのが人情。モックで置き換えているユニットテストだと動いたけど、結合してみたら動かない…なんてよくある話ですから。 そしてSymfony2にはWebTestCaseというテスト用のクラスが用意されていて(中身はPHPUnitです)、これを継承したクラスを作ることでSymfony2が読み込まれた状態でテストをすることが可能になります。主にリクエストやルーティング、ビューのテストに使用するのが目的のようですが、
Facebookのほうでは2週間程前に告知していたのですが、2013年11月22日付けで株式会社オルトプラスを退職することとなりました。先週まで有給休暇を消化していて、今週の月曜日からは晴れて無職となっております。 今後はまだ未定です。時間はたっぷりあるのでゆっくり考えようかと。誰かお茶でもしませんか。
今まで惰性でWordPressを使い続けてきたが、ふと思い立ってMiddlemanで全面的に作り直すことにした。折角作り直すのだからブログのデザインもたまには自分でやってみようと思い、数年ぶりにHTMLやCSSを超時間触ることに。最近はネイティブアプリの案件が多く、JSONを吐く仕事ばかりだったので中々刺激的だった。 Middleman# MiddlemanはJekyllやOctopress同様、静的サイト生成ツールの類いだ。個人的にはMakrdownで記事が書けてGitで管理出来るのが条件だったのでJekyllやOctopressでも良かったのだが、それぞれをローカル環境で試用してみたらMiddlemanが一番しっくりきた。 用意されているヘルパーなどはRailsに共通しているところが多いし、Asset Pipelineなどの同様の機能もあるので、Railsに慣れ親しんでいる人なら簡単に
Symfony2にも採用されているMonologは、HandlerやFormatterを差し替えることでログの出力先やフォーマットを自由に変更することが出来ます。PSR3に準拠しているライブラリですので、今後デファクトスタンダードになっていく気がします。 デフォルトだとStreamHandlerを使って出力されますが、Handlerを自作してFluentdに出力されるように変更してみます。バックエンドにはfluent-logger-phpを利用しました。 MonologのHandlerはAbstractProcessingHandlerを継承して作ります。 <?php namespace Acme\Handler; use Fluent\Logger\FluentLogger; use Monolog\Handler\AbstractProcessingHandler; use Monol
PHPを仕事で使っているとis_nullとかissetとかemptyとか===とかの存在にイライラしてくる訳ですよ。そこでなんちゃってMaybeモナドの登場です。 なんちゃってモナドなので実用性は怪しいですが、以下のように使えます(注意:ネタ記事なので真に受けないように) <?php public function testLookupFunction() { $lookup = function($key) { return function(array $d) use($key) { return isset($d[$key]) ? Maybe::ret($d[$key]) : Maybe::ret(); }; }; $dictionary = ['a' => ['b' => ['c' => 10]]]; $result1 = Maybe::ret($dictionary) [$loo
PHPで range(0, 10000000); とかやるとメモリ不足で死んでしまうので、無限ループするイテレータを作ってみましょう。 <?php class Stream implements \Iterator { private $position; private $offset; private $limit; public function __construct($offset, $limit = null) { $this->position = $offset; $this->offset = $offset; $this->limit = $limit; } public function current() { return $this->position; } public function next() { $this->position++; } public
traitを使って何か作ってみようと思い立ち、読み取り専用の配列を実装してみました。配列として扱いたい(例えばforeachで回したいとか)けど外側からの変更は受け付けたくないというシチュエーションで使えます。 <?php trait ReadOnlyArray { private $items = []; public function offsetGet($key) { if (!array_key_exists($key, $this->items)) { throw new OutOfRangeException(); } return $this->items[$key]; } public function offsetSet($key, $value) { throw new BadMethodCallException(); } public function offset
ActiveRecord(Rails3だとActiveModel)は、自分自身(オブジェクト)のプロパティが変更されたかどうか、またどのプロパティがどのように変更されたのかなどを取得する機能が備わっています。 管理画面で操作ログなどを実装する時に役立ちそうです。 変更無し: @user = User.find_by_email("[email protected]") @user.changed? # => false @user.changes # => {} @user = User.find_by_email("[email protected]") @user.email = "[email protected]" @user.changed? # => true @user.changes # => {"email"=>["[email protected]", "[email protected]
前回に引き続き Chef に関するエントリです。このエントリではChef Serverのインストールと初期設定、更にNodeの接続までを書いていこうと思...
最近Backbone.jsを触っています。Backbone.jsをRailsで使いたいならパッケージで導入してしまうのが一番簡単でしょう。 Gemfileにrails-backboneを追加してbundle install source 'https://rubygems.org' gem 'rails', '3.2.8' gem 'mysql2' group :assets do ... end gem 'jquery-rails' gem 'rails-backbone' # <- 追加 Backbone.jsを組み込みます。 $ bundle exec rails g backbone:install insert app/assets/javascripts/application.js create app/assets/javascripts/backbone/routers
昨年辺りから開発を進めているNodeアプリが大変残念なパフォーマンスだったので、DTraceでプロファイリングしてボトルネックを探してみる作戦です。 DTraceはSolaris, FreeBSD, Mac OS X辺りに搭載されているのですが、Profiling Node.js を読むとMacでは動かない上に32bitじゃないと駄目、とだいぶ面倒な制約が付いています。ちなみにFreeBSDもNGのようです。 仕方がないのでOpenSolarisの後継?にあたるOpenIndianaをVirtualBoxで動かす事にしました。 Node.jsを入れる# OpenIndiana自体のインストール方法は割愛します。普通にF2キーを連打していればインストール出来ると思います。。。それにしてもSolarisを触るのなんて何年ぶりだろうか。 ひとまずインストール済みパッケージを最新版に上げて再起動し
EC2 で動かしている Ubuntu Server 11.10 に RabbitMQ クラスタを構築したのでその時の手順をブログに残しておきます。ホスト名の設定で若干手こずりました…。 RabbitMQをインストール# オフィシャルで配布されているパッケージを使うのがお手軽です。 cd /tmp wget wget http://www.rabbitmq.com/releases/rabbitmq-server/v2.8.1/rabbitmq-server_2.8.1-1_all.deb sudo apt-get install erlang-nox sudo dpkg -i rabbitmq-server_2.8.1-1_all.deb 下記コマンドでエラーが出なければ、正常にRabbitMQが起動しています。 sudo rabbitmqctl status RabbitMQの初期設定#
前回に引き続き Chef に関するエントリです。このエントリではChef Serverのインストールと初期設定、更にNodeの接続までを書いていこうと思います。自分のメモ書きを整理して書き出しているので、何かおかしな箇所があったら是非指摘してください! さて、作業を進めていく上で複数のマシンが出てくるので、便宜上、下図のようなネットワーク構成にしようと思います。192.168.50.100はグローバルIPだと思ってください。また、Chef Server, 各Nodeは全てUbuntu 11.10 Serverと仮定します(Debian squeezeでも大丈夫)。 Chef Server はパッケージシステムからインストールするのが無難# 前回の「Chefの仕組み」でも書いたように、自力で Chef Server をセットアップするのは骨が折れます。サーバの構築を自動化したいのに肝心のCh
最近 Chef というシステムの構成を自動で管理するツールを使い始めました。同様のツールとして Puppet が有名ですが、レシピを内部DSLで記述出来るほうが自分には合っていると思ったので、今回は Chef を採用しました。折角覚えたので復習も兼ねてエントリを起こしてみます。このエントリがChefの導入を検討している方への手助けになれば幸いです。 Chefの仕組み – 意外と依存関係が面倒なChef Server# Chefの基本的な仕組みは、サーバに設定を置き、クライアントがサーバに問い合わせるPull型のシステムです。クライアントはサーバからのレスポンスに従いパッケージのインストールなどを行います。しかし、Chef ServerはRuby(Merb), CouchDB, RabbitMQなど依存が多く、お世辞にもシンプルなシステムとは言えません。そのせいかネットで検索して出てくる情報
次のページ
このページを最初にブックマークしてみませんか?
『dakatsuka's blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く