WindowsにRails開発環境を立てる(Vagrant+rails-dev-box+RubyMine)
__2016/3/8追記__
結構アクセスあるみたいなので追記しますが、あらかじめ言っておくとUnixネイティブ程には追いつけないです。
特にjavascriptの差分ビルド関連が遅かったりするので、可能である限りおすすめしません。私はあきらめました。
動機
これからやることの概要
手順
Vagrant、VirtualBox、RubyMineのインストール
それぞれダウンロードしてインストール
WindowsにUnixライクなターミナルエミュレータとgitを導入
既に使用している方は大丈夫です。
私のおススメはcmder(導入参考リンク: 開発者がSurfacePro3を買ったらまずやること - Qiita)
git for Windowsはcmderのgit bashに付属しているのでこの方法が楽です。
個別に入れる場合はこちら: Redirecting Git for Windows' homepage...
rails-dev-boxからgit cloneし、OSイメージをダウンロード
rails-dev-boxからcloneします
$ git clone https://github.com/rails/rails-dev-box.git
cloneされたディレクトリに移動して、仮想マシンを立ち上げます
その際にOSイメージがダウンロードされるので少し時間がかかります(モバイル回線非推奨)
$ vagrant up
この時点で3000番ポートにはアクセスできることが確認できます
railsプロジェクトがある場合はホスト側(Windows)からlocalhost:3000でアクセスできるのが確認できます
~~インストール済のpythonの以下のコマンドを叩くことでも確認ができます~~
rubyの以下のコマンドでもサーバを建てることができます
$ ruby -run -e httpd . -p 3000
※Rails4.2を使用している場合、通常のrails serverコマンドではWebrickが従来の0.0.0.0ではなく127.0.0.1で起動しポートフォワードされないため、-b 0.0.0.0とオプションで指定する必要があります
RubyMineから接続する
RubyMineを起動し、新規プロジェクトを作成します
作成後にVagrantfileを指定するため、作成場所はどこでも問題ありません。RubyMineProjects下に置くのが良いでしょう
プロジェクト作成後は以下の手順でVagrant内と接続します
- File>Settings>Languages&Frameworks>Ruby SDK and GemsからRuby処理系側の+ボタンを押し、New remoteを選択
- Configure Remote Ruby Interpreter画面が開かれるので、Vagrantにチェックを入れ、Vagrant Instance FolderにはVagrantfileのあるディレクトリを、Ruby interpriter pathは/user/bin/rubyのままでOKを押します。するとVagrant内と接続をしてRubyを読みに行きます。鍵の発行をしていなかった場合ここで発行を促されるかもしれません
- File>Settings>Build, Execution, Deployment>Developmentから+ボタンを押し、リモートサーバを追加します。TypeはSFTPを選択し、hostは127.0.0.1、Portは2222、UsernameとPasswordはともにvagrantを入力し、Root pathがAutodetectで成功すれば成功なので、OKで閉じます。この際、Mappingからサーバ側のプロジェクトルートを設定することで同期範囲を限定することができます
- Tools>Deployment>BrowseRemoteHostで、Vagrant内のファイルが確認できます。Alt+1でProjectメニューを表示し、右クリック>Deployment>Download from [サーバ名]を選択し、サーバ内容をローカルに複製します
- 通常のリモート開発と同様の環境を再現することができました。syncすることで手元の編集事項がサーバに反映されたり、サーバでたたいたコマンドの変更結果を手元に反映させたりできます。
(自動同期については後日追記します)
RubyMineでの開発
RubyMineは非常に多機能で、調べながらでもまだまだすべての機能をつかいこなせていません
RubyMineAdventCalendar2014という非常に便利な情報源があるのでそちらを参考にすると良いです
またRubyMine内臓のshellからvagrant sshすることで、さながらローカルで開発しているのと同様の環境で開発できます(上で説明したcmderを使うよりも便利)
rubyで同一の変数に対して複数の対象と比較したい時の処理
プログラムを書いているとこのようなコードを書く場面にそこそこ出くわすと思います。
if hoge == :next || hoge == :end
このコードでは変数hogeは:nextか:endに一致するかを判定したいのですが、なんだか無駄な書き方な気がします。(DRYでない感じがします。)
2つならまだいいですが3つとなると少し厳しいです。
例えばcase文では複数要素を指定できるので、
case hoge when :start # 処理 when :next, :end # 処理 end
とすることができます
ただし、:nextと:endのみにマッチすればよい(:startは必要無い)ときにcase文を使うのも気持ち悪いです。
caseを使わずDRYでもない書き方として、以下のように書くことにしました。
if [:next, :end].include?(hoge)
日本語の考え方だと難しいですが、英語的に見ればまあ納得な感じかと思います。
hoge.included?([:next, :end])の方がぱっとわかりやすいのですが。
他に簡潔な方法がなく読みにくいわけでもないのでこの書き方を使ってみようと思います。このようなことを書いている方が何人かいたのですが、有名な書き方ではないので悪しからず……。
近い未来にrubyにincluded?のようなものが実装されることを祈っています。
RailsでWebアプリを作るまでに使ったベストプラクティスっぽいgemのまとめ(2014)
先日、わこつAdvebtCalendar2014ことわこつ日記をリリースしました。
デザイン面で時間はかかったものの、コーディングの時間はほとんどかかっていません。が、開発する過程でベストプラクティスっぽいgemはどれだろうというのを調べ、今まで曖昧だった部分についてはっきりとさせました。
最低限これだけあれば最低限まともそうなwebアプリになるだろうというgemをリストアップして今年の学びの締めくくりとしたいと思います。
ユーザ管理関連
devise (ユーザ管理)
ユーザ登録の際のメアド管理やらパスワード管理やらまでしてくれます。パスワードも開発者が気にせずとも一方向性関数で安全に扱ってくれています。
後述のomniauthを使うことでのTwitterログインも継承クラスを少し書くだけで実装できるのでとても便利。
セッション管理も行ってくれ、簡単にログインユーザの情報を取り出せるメソッドも用意されています。
sessions_controllerは書かなくても処理されるので、SNSログインを使う場合は後述の通り、認証のコールバック内で処理を行うのがスマートそうです。
devise自体はとても大きく読み解くのも大変なので、あまり依存しすぎないようにはしたいです。
omniauth, omniauth-twitter (Twitterログイン)
TwitterのOAuth認証を簡略化してくれるgemです。
DeviseのOmniauthCallbacksControllerを継承してコールバックの処理を書くことができるので、そこで認証のレスポンスからユーザ名やID、APIトークン等を簡単に取り出せます。
コールバック内にセッション操作やDB操作の処理を書くことでスッキリします。いろいろな書き方の記事がありますが恐らくこれが正解みたい……?
Devise+Omniauthについては以下の記事がとても良いと思います。
Rails - devise gemを使ってtwitter認証の設定 - Qiita
ビュー関連
simple_form (フォーム)
フォームをすっきりさせると共に、フォームでの入力エラーの表示もバリデーションから簡単に行えるようになります。
Railsのgemフォームコードをすっきりさせる simple_form - Rails Webook
kaminari (ページャ)
ページング表記をする際の処理が格段に簡単になります。
モデルの読み込み数を指定すればその個数ごとにページが区切られ(これだけでpageパラメータでアクセスできるようになり)、さらにページャリンクのヘルパーも自動で対応されます。
twitter-bootstrap-rails, less-rails, therubyracer (デザイン、css、less)
おなじみのBootstrapのgemです。私のようにデザインを専門にやっていないエンジニアの方は使っている方が多いと思います。
railsではassets pipelineという仕組みでjs、css開発を最適化している都合上、bootstrapにおいては不具合の原因となりやすくなっています。(何度となく直面している。)
このgemはrailsに最適化されているため、そのような問題をあまり意識することなく利用できます。また多様なヘルパーも用意されているため、erbテンプレートの場合煩雑になりがちなhtmlが非常にすっきりします。
部分的にbootswatchテーマを使用する場合はgemを入れるのではなく、/vendor/assets/stylesheets/bootswatc以下に配置し、bootstrap_and_overrides.css.lessにimport文を追記しましょう。
@import "bootswatch/variables.less"; @import "bootswatch/bootswatch.less";
ちなみにログインウィンドウをモーダルで実装した際に、bootstrapとbootswatchで競合してしまったため 、以下のサイトのような解決策が必要となります。
[rails][bootstrap]Rails4.1でBootswatchを試すと variable @zindex-modal-background is undefined エラーが発生 | hello-world.jp.net
bootswatchを使う場合はそのテンプレートベースで使用する前提でtwitter-bootswatch-railsを使うのが良さそうなのですが、パーツ利用にとどまる場合はこのようにするのがよさそうです。
参考
Ruby - twitter-bootstrap-railsでbootswatchを使う - Qiita
なお、lessを使用する場合はless-railsが必要になります。bootswatchがlessで配布されていることや、可読性、編集の容易さからlessを推奨します。(簡単な編集であればless初心者でもすぐに理解できます。)
上記のsimple_formと合わせてbootstrapの使用を紹介したこちらのページがとても良いです。
RailsにTwitter Bootstrapの導入と簡易な使い方 - Rails Webook
コントローラ関連
設定関連
デバッグ
pry
pry自体はirbコマンドを使いやすくしたものなのですが、コード中にbinding.pryと記述することで実行中にそこで一時停止し、pryを起動することができます。
pryが起動した時点での変数の確認や、メンバ変数、使用可能な関数を確認できるlsコマンド等便利なコマンドがあります。一時停止した地点から一行ずつ処理を進めるnextコマンドというものもあり、バグ解消に非常に便利です。
またrails cコマンドでコンソールを起動した際にもirbの代わりにpryが起動されるようになります。
pryはrailsでの開発に限らず、rubyでのスクリプト記述や他のフレームワークでも役に立つため特にオススメのgemです。
Better Errors
Railsのエラー画面をリッチにします。エラー発生時点での変数の状態を確認できるため、pryと合わせてバグ究明に役立ちます。
アプリケーションサーバ
unicorn
rials sコマンドで立ち上がるサーバ(Webrick)は簡易的なもので本番環境での利用は推奨されないため、一般的には別のものを用意します。
アプリケーションサーバのunicornをnginxと組み合わせて使うのが高速で最近の流行だそうです。ここまでの中だとサーバ側の環境を整えるのが一番重そうですが、nginxの設定もそこまで難しくはないと思います。(apache+passengerよりは面倒でなかった。unicornの場合passengerと違い複数アプリを動かすことができる。)
サーバ側の設定はコード化しておくと楽です。この辺りはchef等でぐぐってください……。
他にもunicornの起動やnginxごとの再起動も自動化するスクリプトを書いておくと楽そうです。
……とは言ったものの、最近ではRaptorがいいというのも見るので、こちらも触ってみたいところです。
Ruby - 「RaptorはどのようにしてUnicornの4倍、Puma, Torqueboxの2倍の速度を達成したのか」を読んでまとめてみた - Qiita
これらのgemを有効活用すれば、最低限まともに見えるwebサービスが1人日程度で準備できてしまいます。Railsって怖いですね。
本当にRailsは怖いので、これらgemによる開発の効率化も良いのですが、仕組みを理解しないまま使うことを推奨するわけではありません。
参考
今すぐ辞めて欲しい、「Ruby on Rails勉強してます」「CakePHP勉強してます」
プログラミング初心者の落とし穴「Ruby on Rails勉強してます」「CakePHP勉強してます」 - カレーなる辛口Javaな転職日記
来年もRailsとうまい付き合い方をしていきたいものです。それではよいお年を。
rubyの簡単なスクリプトでファイル・文字列操作 〜MH4Gのお守りファイル処理を例に〜
ハンター的なお話(前置き)
私はモンスターハンター4Gにはまっています。スキルシミュレータ(泣)さんで装備を組ませていただいています。
そこで大事になるお守りなのですが、お守りの管理ってしっくりくるものがなく困っていたところ、(泣)さんでお守りのインポート/エクスポートができるようになりました。
ので、rubyで簡単なスクリプトを書いてソートしたのですが、思ったより色々やったのでファイル操作について書いておきます。
お守りデータの解釈
エクスポートされたお守りはこのような形です
,3,乗り,8 ,2,溜め短縮,6 ,1,納刀,6,属性解放,6
一番前にあるコロンはおそらく区切りでしょう。最後ではなく最前に持ってくる記法ですね。
ちなみに構成は、[,スロット,第1スキル名,第1スキルポイント(,第2スキル名,第2スキルポイント)]という形です。
このようなエクスポートされたお守りファイルをamulets.txtとして保存してあるとして、まずはこれを開いて解釈するスクリプトを書きます。
path = 'amulets.txt' file = File.open(path) amulets = Array.new file.each_line do |line| arr = line.chomp.split(',') amulets << arr end
File.openでファイルを開き、each_lineで各行ごとに、改行文字を取り除いた上でカンマで区切り1つのお守りの情報を配列とし、それをさらに配列amuletsに格納します。
次に見やすくすることが目的なので、スキル1とスキル2のスキル値の大きい方を前にするように入れ替えます。
amulets.each do |amu| if amu[4] && amu[5].to_i > amu[3].to_i amu[2..5] = amu[4], amu[5], amu[2], amu[3] end end
まず最初にamu[4](スキル2)が存在するかを確認した上で、スキル1とスキル2のスキル値を比較します。存在を確認しないで比較すると、存在しない場合にエラーになります。
比較する際に、元の要素は文字列であるため、整数型にキャストしてから比較します。(文字列の場合'10'<'2'となる。これは後述のソートの際も同様の理由でキャストが必要。)
スキル2の方が大きい場合は入れ替えるのですが2要素がセットなので代入で入れ替えます。配列に複数代入するのにrubyではこの書き方ができます。
ソートの順序を定義する
このままでもソート自体はできるのですが、文字順になってしまい使い勝手が悪くなってしまいます。
そのためここでは、スキルシミュレータのスキル順序でソートのルールを定義します。
まず定義するためにシミュレータページからセレクトボックスの中身をいただいてきます。(個人利用なのでここには内容は載せません。)
セレクトボックスなので、以下の形式になっているはずです。
<select> <option value="スキル名">スキル名</option> <option value="スキル名">スキル名</option> <option value="スキル名">スキル名</option> <option value="スキル名">スキル名</option> </select>
ここから正規表現でスキル名をこの順序で取り出します。最終的にはスキル名をキー、優先度を表す整数をバリューとしたハッシュを吐き出します。
まずは上記のソースからoption部分だけど切り出し、これをskills.txtとします。取り方にもよるのですが、私の場合インスペクタからだと改行されていなかったので、その前提で処理します。
require 'yaml' path = 'skills.txt' file = File.open(path) hash = Hash.new # 正規表現でスキル名を切り出し skill_regexp = /<option\svalue=".*?">(.*?)<\/option>/ keys = file.scan(skill_regexp).map{|key| key[0]} size = keys.size # Hashの要素を追加 keys.each.with_index do |key, i| hash[key] = size-i end #YAMLファイルに出力 File.open('skills.yml', 'w') do |f| YAML.dump(hash, f) end
正規表現は、.*では最長で検索され全体がマッチしてしまうため、最短検索の?をつけ.*?とします。括弧でくくった部分がマッチ結果として配列で返され(この場合は一箇所のみのため要素1つの配列)、scan関数で結果を配列に格納します。
そのため結果が2次元配列となってしまうが、keysを2次元配列にするべきではないためこの時点でmapで対処。(flattenでも同様になるが意味を明確にするためにmapを使用。)
ソートを降順で行うため、降順でハッシュにし、YAMLファイルへ出力。100要素をハッシュのためYAMLで外部に出力するのが適切かと思います。
実際にソートを実行する
require 'yaml' path = 'amulets.txt' file = File.open(path) amulets = Array.new file.each_line do |line| arr = line.chomp.split(',') amulets << arr end amulets.each do |amu| if amu[4] && amu[5].to_i > amu[3].to_i amu[2..5] = amu[4], amu[5], amu[2], amu[3] end end # 出力したYAMLを読み込む。Hash。 skills = YAML.load_file('skills.yml') amulets.sort_by! do |amu| [skills[amu[2]], amu[3].to_i, amu[1].to_i] end amulets.reverse! out_amulets = amulets.map{|amu|amu.join(',')} File.open('out_amulets.txt', 'w') do |f| out_amulets.each{|amu| f.write("#{amu}\n")} end
sort_by!はブロック引数でソートする破壊的メソッドです。配列で渡された場合は前からの優先度でソートします。
ここではamu[2]をキーとしたバリュー(つまりスキル名に対応した通し番号)、第1スキルポイント、スロット数の優先度でソートします。数値比較のため文字列は整数型にキャストしています。
このソートは降順で、昇順にするためには本来はreverseすれば良いのですが、複数項目を指定する場合は降順昇順が混在することはできません。そのため、降順に揃えます。
最後は元と同じようにカンマで繋げ、各行ファイル出力することで完了となります。
このような簡単なスクリプトでソートツールを自作できるわけです。が、今回は最適っぽいのを調べていたら時間がかかってしまいました。Rubyなので簡単な処理ほど別の記述の仕方がありそうという気がしてしまいます。
あまりファイル操作っぽい話ではなくなってしまいましたが、スクリプトっぽいのは書けたと思いますので今回はこれにて。明日はRailsについて書いて今年の締めとします。
Macの再セットアップの際に行ったツール導入や環境構築【Ruby系エンジニア向け?】
Macbookを新しく購入し、クリーンな状態から再びいろいろ導入したので記録しておきます。
新規購入でなくてもOSアップデートの際にクリーンインストールすることもあるかと思うので何かの役に立てば。
GUI環境はオレオレ感強いですが他は一応最低限って感じだと思います。
作業環境(あると便利)
(これらのツールの一部は前回説明したhomebrew-caskでもインストールできます)
Alfred
Spotlightの代替として。いろいろできます。
Google Chrome
必須級。インスペクタが便利。
Better Touch Tool
必須級。画面分割をアシストします。キーボードに操作を割り当てることも。
iTerm2
使いやすいターミナル
開発環境
homebrew
ほぼ必須のパッケージ管理システム。MacPortは廃れたらしい。
以下の1行で導入。
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
以下はbrewで導入するパッケージ群。だいたいbrewで済みます。
Macに元から入っているものでも最新バージョンを保つ為、また管理しやすくするためにbrewで再度導入します。
homebrew-cask
brewど同じパッケージ管理システムでGUIアプリケーションも管理しようというもの。google-chromeやvagrant、virtualbox等がコマンドラインから導入できるため、コード化して残す/コードからまとめて導入することが容易になる。前回の通り私は結局使うのをやめました。
rbenv ruby-build
rubyの管理システムです。複数バージョンを管理できます。
rbenv install #{version}でバージョンを指定しrubyをインストールされ、rbenv global #{version}で指定したバージョンを適用します。
同様の手順でpythonをpyenvで、perlをplenvで導入できます。node.jsについてはnodeenvより後述のnodebrewが推奨らしい。
git
バージョン管理ツール。
mysql
データベース。
imagemagick
rubyで画像処理などを扱う際に必要。gemのrmagickやcarrierwaveと合わせて簡単に画像アップロードを。
fish
勧められて入れたシェル。もともとカスタマイズされていて補完が使いやすいのでbashrc/zshrcをあまりカスタマイズしてない人にはおすすめ。かわいいです。
nodebrew
nodeの管理システム。nodeとnpmを入れます。詳しくは以前の記事を参照。
nodebrew install stableで安定版がインストールされ、node brew use stableで適用します。パッケージ管理システムのnpmも同時にインストールされます。
npmではcoffee-scriptなどを入れました。用途に応じて。
ざっと書きましたがrubyおよびruby on railsの開発にはだいたいこれくらいで大丈夫なのではないかと。
昨日リリースしたわこつアドベントカレンダー(http://yutaszk.gehirn.ne.jp)はこの環境で問題なく開発できました。どうにかクリスマス前までにリリースしようと23日に思い立ってぱぱっと作った物なのでもう少し作ります。
近いうちに最低限まともなrailsアプリを作るのに使ったgemや実装について(オレオレにならないように)少し書いて今年を締めくくりたいと思います。
homebrew-caskを使おうとしてやめたお話
homebrew-caskとは
Macユーザの皆さんはhomebrewでパッケージ管理をしている方も多いかと思います。
しかしよく使われるDropboxやChromeはbrewでは提供されておらず、従来では.dmgファイルをWeb上からダウンロードしてきて展開しインストールするという手順をとっていました。
そのようなアプリケーションのインストールを開発環境導入と同様にコード化し、簡単にコマンドで再現できるようになるのが、homebrew-caskです。(boxenにも見られた動きですね。)
導入
homebrew(Homebrew — OS X用パッケージマネージャー)は入っているものとします。
$ brew tap phinze/homebrew-cask $ brew install brew-cask
caskと併せてAlfredを使用する際の問題点と解決策
Alfredはシンボリックリンクを読みにいってくれないため、上記の/opt/homebrew-cask/Caskroom/をにある本体を見に行くように設定に追記するか、Alfred自体をcaskで導入している場合は以下のコマンドで設定を変更できます。
$ brew cask alfred link
なぜか私の手元ではほぼクリーンなMacにもかかわらず実行できなかったため、この時点でほぼ諦めてしましました。
不満点
linkがなぜかできない
上記の通り。設定ファイルも存在しているのにalfred linkが行えませんでした。うーん
Caskで導入できるSublimeTextのバージョンが2
3を使用しているため、最新バージョンが使えないのではあまり……という感じがしました。
AppStoreにあるものはそちらで管理したい
Alfredをはじめとして、AppStoreからインストールしたものはそちらの方が更新が通知されるので便利そうであるため。
特にこの理由からAlfredをAppStoreからインストールした場合Caskroom以下へのリンクは手動になりますし、中途半端にばらけるくらいならdmgでインストールしても同じかなあ、と。
結論
私はこのような理由からcask導入を断念しましたが、開発環境構築をコード化する必要度が高い場合はcaskを導入するべきかと思います。
特にvagrant等のように開発環境構築に必須級かつ、コマンドからのみしか呼ばないものならばあまり弊害がなく導入できるのではないでしょうか。(とはいえ、vagrantを使うのであればvagrant内の環境構築コードにいろいろ書けばいいため、結局vagrantだけ手動で入れればいい気も。)
結局boxenも管理コストに見合わないという形で流行が過ぎ去ったため、個人で使う分にはdmgからインストールしても管理できるので、caskを使うほどでもないかなあと感じました。
caskの今後によっては使うことになるかもしれませんが、まずはSublimeTextが3にならないと、パッケージ管理している意味があまり……という感じでした。
手元のガジェット類を手放します。買い手求む。
金策のライフハック(?)として、手元で使っていないガジェット類を手放したいと思います。
複数人希望者がいる場合は手渡しできる方(主に大学関係者の方)を優先とさせて頂きたいと思います。また手渡し可能な方は現物を見せての確認も可能です。なお郵送の場合は送料はご負担頂きます。
対象は大学、仕事での知り合いもしくは各種SNSでのフォロー関係にある方のみとさせて頂きます。(横から失礼しないでください。)
中古相場を踏まえての価格提示となりますが、場合によっては価格交渉応相談です。タイミングの都合で売約済、取り置き、確認次第で購入、という方が出てきてしまった場合には申し訳ないのですが順を追ってとなります。ご了承ください。
我が家で眠っているガジェットと私のさらなるガジェット活動のためにもぜひともお願いします。
Macbook Air 13inch mid '13(MD231J/A) \80,000
最小構成(ストレージ128GB/core i5/メモリ4GB)をメモリ8GBにカスタマイズしたモデル
=> ストレージ128GB/core i5/メモリ8GB
状態: 目立つ傷無し。良品。OS X 10.9 Mavericks
購入日: 2013年6月末日
ケースもしくはバッグのPC収納スペースに入れて持ち運んでいたため良品とします。なお背面に頂きもののシールを貼っていたため、はがし跡が多少残る場合がございます。
メモリ8GBということですので、そのような用途で使われる方に特におすすめとなります。通常のプログラミング用途では特に困ることはありません。現在でも満足に正常動作しています。
現行のEarly'14モデルとはCPUがHaswell Refleshに変わったことと、値下げのみとなりほとんど変わりはありません。こちらの記事の通り、性能面も微々たる変化ですので、おおよそのスペックとしては現行モデルとほぼ変わらないとみて頂ければ。
参考: MBA13(early'14)メモリ8GB構成新品価格 => \108,600円(税抜)
Lenovo Miix2 8 32GBモデル(59404411) \15,000
状態: 画面保護フィルム無しで使用、目立つ傷無し。角に一か所削りキズあり。office無し。
購入日: 2014年2月後半
Windows8.1搭載タブレットで正常動作します。艦隊コレクションをはじめFlashが公式にサポートされており動作するタブレットになります。PDFリーダーとしても是非。
購入日は2月ですが、5月以降持ち運び度合・使用頻度ともに大きく減っています。ここ数か月は使用していません。キズの度合いについて確認希望の方はご連絡ください。可能な場合は直接現物で確認できます。
Y!mobile Nexus5 (SIMフリー) レッド 16GB 白ロム \25,000
状態: 普通(画面: 美, 背面: 傷アリ) Android5.0 Lollipop更新済
購入日: 2014年3月中旬
一括購入済白ロムです。ついこの間まで画面フィルムを付けて使用していましたが、ボロボロになったためはがしました。その後はほとんど持ち歩いていないため画面状態は美としています。
ケースを付けていなかったため、背面は使用感のある傷がついていますが、落下等はないため通常の使用傷程度です。
Softbank AQUOSPHONE Xx mini 303SH レッド 白ロム \11,000 (確認待)
状態: 普通(画面: 美, 背面: 傷アリ)
購入日: 2014年6月
一括購入済白ロムです。ケース無し保護フィルム無しで使用していましたが、使用期間が短いため美品です。背面が傷つきやすいそざいのため、使用感のある傷が見られます。
IGZOディスプレイ、防水の小型端末です。
欲しい、現物か写真で確認したい、値段交渉したい、という方がいましたら、プライベートな手段(LINEやメール、SNSのDM/メッセージ等)でご連絡ください。お待ちしております。