ドコモスマホ(Xperia A2)のバッテリーを自力で交換しました

所有しているドコモスマホXperia A2)のバッテリーが75%ぐらいから急に0%になってシャットダウンする状態が続いたため、バッテリーを交換することにしました。

f:id:yosshy79:20161001213304j:plain

Xperia A2は裏蓋が開かない機種で、ドコモ窓口に持っていくと10日ほど預ける必要があり、費用も9000円ほど係ります。

預けるのはいいのですが、その間は代替え機で過ごす必要があるのですが、普段使っているアプリを入れ直したり、今まで撮った写真をバッグアップしたり、Lineのトークをバッグアップから移したりするのはかなり面倒に思えました。

ドコモの店頭に並んで、あれこれ手続きするのも面倒です。 そこで時間短縮のため、裏蓋を開けて、自分でバッテリー交換をすることにしました。どうせ2、3年は使ってきていて保証も切れています。 他の人のブログ記事も参考にして、自力でのバッテリー交換に挑戦してみました。

バッテリーが交換できないXperia[エクスペリア]を自力で交換する方法(ただし保証外) http://www.okuta.com/blog/yoshiaki_wakae/2016-02-19/xperia_battery/

分解手順(一部省略)

まずは裏蓋を開けます。裏蓋は、黒くて細い両面テープのようなものでシールされているので、裏蓋の隙間に薄いカードなど差し込んで丁寧に開いていきます。 両面テープが剥がれやすいように、ドライヤーも使いましたが、気休め程度でしょうか、吸盤を使うと楽という意見もあったのですがなしで頑張りました。

一箇所、スマホの下側が太い両面テープで固定されている箇所があってなかなかカードが差し込まれず、手間取りましたが基本、丁寧にゆっくり剥がしていきました。  

f:id:yosshy79:20161001213537j:plain

バッテリーはスマフォ上部、左側のネジを外して、またスマフォ下部のバッテリーのコネクタをピンセットなどで外せば取り外しできます。 スマフォ上部のNFCの端子部分は、繋がっていないので、丁寧に外せば外れました。

取り外したバッテリーにNFCのアンテナがシールでくっついているので、QUOカードなどの薄いカードを差し込んで、丁寧にはがしていきます。

f:id:yosshy79:20161001220908j:plain

交換したバッテリーをスマホに収めて、NFCのアンテナを新しい両面テーブで貼り直して固定します。

f:id:yosshy79:20161001224648j:plain

NFCアンテナの接続端子を軽く固定している銀色の留め具が一回外れちゃったんですが、上から押し込んでもはまりません。フックに引っかかるよう斜めにして下から引っ掛ける感じです。 留め方がわからなくなるのでいっそ、丁寧に外しましょう。

f:id:yosshy79:20161001221743j:plain

バッテリーの接続端子は、純正品に比べるとちょっと丈が長いです。蓋を閉めた時に浮きやすいので、ピンセットなどで丁寧に押し込みます。 他の人のブログ記事では、端子が斜めになっているケースもあるようなので、その頃に比べればやりやすく改良されているようです。

端子を接続したら、一旦電源入れて確かめてみましょう。蓋を閉めてからもう一回、開け直すのは面倒ですから。 f:id:yosshy79:20161001221438j:plain

蓋を閉める前に、蓋を開ける時に接着していた、黒い両面テーブをケースに沿って這わせていきます。 f:id:yosshy79:20161001225343j:plain

角はピンセットなどで丁寧に。 f:id:yosshy79:20161001224808j:plain

実は、他の人のブログを参考に、Amazonで2mmの両面テープを、交換バッテリーと一緒に注文していたのですが、間違って5mmが送られてきたので、蓋を開ける時にシールされていた両面テープを再利用するしかなかったのです。 両面テープはかなり細いので、1mmのものでもよかったかもしれません。

ただし、下記のURLの3Mの両面テープは、もともと使われていたものと同一製品かどうかは私にはわかりません。防水性能があるのかもわかりませんので、バッテリ交換後はどちらにせよ防水性能は期待しない方が良さそうです。

1 mm * 50 メートル 3M 9080 Hi-Temp 両面テープ LED 液晶パネル用接着剤 https://www.amazon.co.jp/dp/B00FU09OP2

最後に蓋を閉めて完成。両面テープで圧着し直す感じです。 f:id:yosshy79:20161001224948j:plain

防水性能は期待できなくなりましたが、3000円に満たない費用と、数時間の手間でバッテリ交換することができました。 これで、お昼でバッテリーが切れて、他と連絡がつかなくなったりする問題もなくなります。 ドコモの窓口で10日間お預けしている間、代替機にデータを移す手間を考えたら、時間短縮できてよかったです。

Sato Commerce Xperia Z1f LIS1529ERPC 互換バッテリー ( SO-02F ) 3.8V 2300mAh https://www.amazon.co.jp/dp/B01688KMQE

準備するもの

  • 薄っぺらいカード (QUOカード
  • 精密ドライバー
  • ピンセット
  • 交換用バッテリー
  • 1mm幅の特殊用途の両面テープ
  • 見えない状況に対応する適応力
  • 失敗を恐れる心とそれでも進む勇気
  • 自己責任という確約

想定されるリスク

  • 蓋をはがす時に、無理にはがそうとして蓋を変形、破損させてしまう。
  • ドライヤーで温めすぎて電子部品を故障させる。
  • 交換したバッテリがまた不良品。
  • バッテリ交換後、防水性能を失った状態で水没させてしまう。
  • データのバッグアップを取っていない為、データ完全に消失する。
  • 他、上記以外の3つ以上のリスクが自分で思い浮かぶこと。

「納品のない受託開発」を語る会 から2年余

このブログを書き始めるきっかけになった、2013年の「納品のない受託開発」を語る会 から2年余り

yosshy79.hatenablog.com

 

2年前の当時は、『終わりのない受託開発』とでも命名してもいいような、「要件定義が出来ないから、何の合意も約束もないまま、丸投げされた、名ばかりのアジャイル開発」にアサインされていました。それを1年ぐらいかけて乗り切ったあとは、Web案件を離れて未経験のWindowsタブレットで動作する地理情報フレームワークの開発をするという過去に比べてとても平和な案件の日々を1年ぐらい過ごしてました。

 

普段の生業は、客先へフルタイムで常駐して働く、フリーランスプログラマなので、「納品を目指して、納期を守る為に、時間単価計算」で働くのを日常としています。

 

自分はなぜ「納品のない受託開発」に切り替えないのか?

2015年の7月、Rubyビジネスフォーラム に参加してに「納品のない受託開発」の話をもう1度聞いて、あらためて、そう考え、「常駐の仕事にやりかたに馴染んでしまった」事が制約になっていると結論づけました。

それでその制約を乗り越えるにはどうすればいいかを考えていると、「納品のない受託開発」をやりたい理由も、常駐の仕事をやり続けている理由も、それは「安定したキャッシュフロー生む」という、自分の中ではどちらも同じ方向を向いていることに気がつきました。

 

f:id:yosshy79:20160404024618p:plain

 

つまり、「納品のない受託開発」でも「常駐の仕事」も自分の中ではどっちでもやりたいことが出来る可能性があると気づき、「常駐の仕事」をやりながら「納品のない受託開発」の思想を取り入れ、ある程度割り切った仕事のすすめかたをして来ました。

 

私の仕事は、「納品を目指して、納期を守る為に、時間単価計算」で契約しています。

「納品」は区切りですが、その先にある「運用・サービス」をイメージしていますし、「ベストエフォート」で残業を押さえていますが、「納期」はだいたい守れています。「時間単価」での契約ですが、本当に売っているのは機能が提供する「価値」で、そこをお客様から評価してもらっていると思っています。

 

私はこれからも常駐型の仕事を続けていくと思いますが、少しづつでもいいので「時給で働く」ことから卒業して、「提供する価値」を評価される働き方にシフトしていって、契約も実態にそった形に切り替えていければいいですね。

 

プライベートウォール自作 設計

6月頃から、大人向けのクライミングウォール制作にとりかかり始めています。

 

最初に簡単な設計を行いました。

f:id:yosshy79:20150702004525j:plain

以前に作成した子供サイズのウォールの2倍のサイズになります。

骨組みの部分には、主に2440mm(8feet)と1820mm(6feet)の2x4材を、壁には15mm厚の針葉樹合板を使います。

また、土台は安定させる為に、枕木を使いたいところですが予算の兼ね合いもあり、まだ検討中です。

 

大人用なので、スラブ壁を反転して105°の傾斜壁にしています。

また壁を支える柱となるトラス部分は、8feetと6feetの2x4材を左右3本づつ使って2重のトラス構造にして、強化するようにしました。

壁の厚さは、ホームセンターで手に入る12mm厚ではなくて、他の方の自作ウォールでも採用されている15mmの厚さにしました。(大阪市内の東野材木屋で購入)

また、骨組みのトラス部分の木材の接合には、M10、M8サイズの六角穴ボルトを使用します。

 

6月のうちに、骨組み部分の木材のカットや柱部分の加工は済ませましたので、まずは骨組みを自立させて、塗装をするところまでは進めたいですね。

6月は雨が多かったですが、週末は天気に恵まれました。毎週、材料が雨にぬれないようにブルーシートで覆って後片付けをするのは大変でした。

 

木材は寸法どおりに、手ノコでカットして、木口部分や木材の接合部分は塗装をすませました。後は組み立てた後で塗ります。

 

ジグソーを導入してもよかったかもしれませんが、細かい角度は手ノコの方が調整しやすかったかな。今回もソーガイドにおおいに活躍してもらいました。 

Z ソーガイドF鋸セット 30106

Z ソーガイドF鋸セット 30106

 

今回は木材のカット角度を75°、65°、40°(3つであわせて180°の三角形になります)で設計しました。しかし、ソーガイドは基本的に45°の傾斜までしか対応していませんので、40°の部分には苦慮しました。

 それよりも、クランプの締め付けが甘くて、後で気づいたら全部1°づつずれていたので、全部切り直しました。ですので、あんまり苦労の度合いには大差なかったです。

 

まずは骨組みの左右のトラス部分のみを組み立てます。

自立させた時に、がたつきがなく安定するように、しっかり固定した上で、接合部分を決めます。

 

トラス部分は鬼目ナットを埋め込み、100mmの長さのM8ボルトで接合します。

 

 

鬼目ナットは穴をまっすぐ空けないと、ボルトが入りません。

そこで今回は、簡易なドリルガイドを導入しました。簡易なものなので、当てにしすぎると穴1個分ぐらいは、ずれてしまいますが、それでも目測だけで慎重にやるよりは、楽に作業が進みます。

直径4mm〜12mmまで6つのアダプタで対応できます。 

SK11 ドリルガイドキット SGK-6

SK11 ドリルガイドキット SGK-6

 

 

それでも、この鬼目ナットを使ったボルト接合の過程で、用意していた鬼目ナットの半分はネジ穴を潰してだめにしてしまいました。

M8ボルトの鬼目ナットの下穴はφ11.5mmなのですが、φ11mmでは遊びが少なすぎた様で、まったくボルトが入っていきませんでした。

ドリルガイドを使ってφ12mmの大きさにした穴を広げ、ちょっとずつボルトを締めてかろうじて接合完了。

はやく自立させて塗料を塗ってしまいたい。モチベーションが続かん。

 

 

 

DevLove関西「TOCを初めて知ってみる」に参加してみた

devlove-kansai.doorkeeper.jp

6/26にDevLove関西の勉強会でTOC(制約理論)を勉強してきました。

 

TOCについては、「ザ・ゴール」の小説ではなくて、漫画版の方を読んだことがあっただけでしたが、目標を実現する為の思考スキームだという認識で参加しました。

 

セミナーに参加した目標は「ものごとを全体的に考えられるようになる」としました。

最近は仕事の事や子供の事で、ずっと考えがどうどう巡りをしていて結論がまとまらないことが多かった為です。

内容は、風が吹けば桶屋が儲かるというような、原因と結果のツリーを図表化するといったものが主でした。

ワークショップでは、自分のやりたい目標とそれが出来ない制約をテーマにして、ペアどうして図表をつくり、別のグループに説明するというものでした。

 

ポイントとしては「解決策を見つけようとしない」方が疲れなくてよいそうです。

たしかに制約を書き出していって矢印を引いて、紙に書き出すだけで考えが整理されていくので、それだけでも意味はある様です。

 

学んだ事をもとに、家に帰ってからも同じ手法でプライベートでやりたい事を図表化してみました。

f:id:yosshy79:20150630024332p:plain

まず、私はボルダリングが趣味なので、やりたいこと(目標)を「子供(幼稚園児)にボルダリングさせる」としました。(図表の赤色)

できていない理由は「クライミングジムは小学校高学年から入会できる」からです。

 

やっていると、最初に決めた目標とは違う、「子供が小学校にあがっても授業についていくことができる」という本当の目標が見えてきました。

 

最初の目標は「自分がやりたいこと」でしかなかったのですが、本当に目標としなければならなかったのは「家族みんなの共通のゴール」だったのですね。

それに気づいてからは家族で話し合って決めたことと、自分のやりたいことがどうつながっていくのか整理することに始終しました。

 

上に書いた図は、あとで家族にも見てもらったのですが、そこで子供の習いごとに対する新たな意見や思いも聞く事ができました。それに伴ってまた図表を更新しなければならないのですが、図表にすることで家族での意思疎通のコミュニケーションの道具としても利用出来る様です。

 

セミナーではほんのさわりしか学べませんでしたが、家に帰って実際にやってみて初めて少しずつ身に付いてきた様に思えます。

講師の方からはおすすめの書籍として下記のものをおすすめされたのですが、ワークショップでやったのはここで紹介されている「ブランチ」という手法の様です。

Amazon.co.jp: 考える力をつける3つの道具 電子書籍: 岸良 裕司, きしら まゆこ

 

セミナー後 、講師の東さんが「TOCは5歳児から使える」と行っていました、子供の場合は、文章の代わりに絵で説明したもので矢印を引っ張って図表化するそうです。

たとえば、子供が「おかしを食べたい」というやりたいことがあればお菓子の絵をかいて、それが出来ない制約として「夕食が食べられなくなるから」という説明にお母さんがおこっている絵や夕食の絵を書いたりするそうです。

 

 

自作クライミングウォール 組み立て

前回の続きで、大人向けのクライミングウォール作成の練習のため、ハーフサイズのスケールで子供向けのウォールを作成しましたので組み立てについて紹介します。

f:id:yosshy79:20150118111707j:plain

 

壁の下準備

壁には大人サイズでは15mmから18mmぐらいの厚さのものが必要らしいのですが、今回は練習なので、近くのホームセンターで手に入る12mmの厚さのものを使いました。

あらかじめ、木材カットサービスで、十字に4分割したものを用意して、これを大人サイズのサブロク板に見立てて作成します。

 

ボルトの穴は、サブロク板1枚に対して規則的に3×12=36個の穴を開ける想定で、子供サイズに4分割した板には、1枚あたり9個の穴が空きました。

10Mサイズの爪付きナットを取り付けるため、電動ドリルで12mmの穴を空けます。

バリやカケが出ない様にサブロク板の裏に不要な木材を当てて一緒に穴を空けました。

 

穴をあけたら、木材保護塗料を塗ります。

塗装には70mmの水性用刷毛と、細かいところは15mmの小刷毛を使いました。

また、ガレージを汚さないように養生には布マスカーテープと養生テープを使いました。

f:id:yosshy79:20141228135342j:plain

1度塗ったら乾かして、2度塗りしてまた乾かします。

 

乾いたら、爪付けなっとの取り付けを行います。

爪付きナットの取り付けは、どのブログでも騒音で近所迷惑でなるのを気にされていたので、裏に同じサイズのサブロク板を、表にも不要な木材を当てて、金槌でたたきました。

慣れてきたら、普通の金槌で軽くコンコンと打ち込んで、 1kgの石頭ハンマーで一撃いれたらすぐに済みます。

合板に取り付ける前に、1x4材の端材で練習しましたが、針葉樹合板は柔らかいのかもしれません。用意していた耳栓も使わずです。

 

f:id:yosshy79:20150118201905j:plain

なお、一緒に移っている端材は当て木に使用している端材ですが、別の1x4の端材を1枚、石頭ハンマーでまっぷたつに割ってしまいました。

当て木をしているとはいえ、くれぐれも、タイルばりの玄関とかでやらないことをおすすめします。私は駐車場のコンクリートの上でやりましたが当ブログでは責任持てません。

 

骨組みの作成

骨組みには1x2サイズ(1x4を半分かっとしたもの)のものを利用します。

近くのホームセンターでは、8フィート(2440mm)と6フィート(1820mm)の2x4材が取り扱っているので、大人サイズではこれを使う事を想定します。

今回は練習なので、半分のスケールでそれぞれ、1220mm、910mmでカットしたものを材料として用意します。

 

f:id:yosshy79:20150102083410j:plain

 

まず、縦方向の柱部分を作りました。左右ぞれぞれ、1220mmと910mmの1x2材をそれぞれ20度づつ傾斜させて接合できる様にカットして、木工ボンドで仮止めした上でコーススレッドで接合します。

 

カットは手ノコで正確に切断する為に道具を使いました。

岡田金属工業所 ソーガイドF

傾斜壁の微妙な角度に対応できるように、角度フリーのものにしました。

C型クランプもあわせて使う事で、木材とガイドが固定され、かなり楽に木材のカットができたと思います。

 

接合には65mmのコーススレッドを使いました。端材を使って練習したところ、下穴無しだと木材にヒビが入ってしまいました。

65mmの下穴あけに必要な長さの木工ドリルビットを急遽用意しにホームセンターへ。下穴径は3mmにしました。 

垂直に下穴を空けられるように何度も端材で練習しています。

また、木の固定にクランプが活躍しました。

クランプを使って固定することで、作業がかなり楽でした。

 

 

f:id:yosshy79:20150112054653j:plain

裏から見ると骨組みがよく解ります。未塗装の部分は後から追加で補強を入れたのですが、この時点でペンキは使い果たしていました。

 

壁の取り付け

下側の壁から32mmのコーススレッドで取り付けていきます。

壁を取り付け終わったら、ホールドを取り付けて完成。

2歳児向けのサイズになりました。

f:id:yosshy79:20150118111509j:plain

 

ふりかえり

一番下の中央のホールドに体重をかけるとしなるので、そこのホールドは外してあります。ここにも水平方向に梁を追加したいと思います。

また、前面の壁はそれ自体が耐力壁となって横方向に強いのですが、後ろで壁をささえている側の柱は横向きの力に弱いです。壁の左上、右上の角に体重をかけて揺らすと骨組み自体が多少揺れます。後ろ側の柱に筋交いを入れる事で強度をアップしたいと思います。

それが出来たら、年中組の娘には少しものたりないようなので、上方向に伸ばして壁を拡張したいと思います。

ちなみに大人用の壁は、このままの設計では作れないです。骨組みを裏返して前傾壁にしたいのですが、後から追加した後ろ側の柱に渡した水平方向の補強が邪魔になってしまいます。

 

考えはあるのですが、どうにも大掛かりなものになりそうなので、シンプルなやりかたを探っているところです。

いきなり前傾壁をつくるのではなく、まずは垂直壁を作ってみるほうが気軽に始められるかも知れません。

 

自作クライミングウォール(設計・材料について)

DIYでクライミングウォールを作成したので紹介します。

今回作成したのは高さ1メートルぐらいの子供向けのものです。

f:id:yosshy79:20150118111546j:plain

 

目標としては2メートル半ぐらいの大人向けのものを作りたいのですが、木工工作の経験も無いので、まずは子供向けのものを作ってみようと思いました。

 

DIYをするにあたって、以下の方針ですすめていくことにしました。

 

*加工や調整のしやすい木工工作で作成する

*材料はできるだけホームセンターや東急ハンズなど身近なところでそろえる。(ネットも利用する。)

*大人の丁度半分のサイズで子供用のウォールを作る

*壁は屋外に設置する(雨風に対する耐候性を考える)

*壁は自立式にして、家の壁等に穴をあけたりしない。

 

 

設計について

最初は100均で買ってきたストローを使って模型を作ってみます。

 

f:id:yosshy79:20150118113241j:plain

90度の垂直壁では面白くないので、やや前に110度ぐらい前傾させて、その上で自立させたいと思いました。

ただし、子供向けはスラブ壁の方が遊びやすいと思ったので、これを前後にひっくり返して70度の傾斜壁で作成します。

 

 

 

材料について

*2X4材、1X4材

近くのホームセンターで1820mmのサイズが手に入れやすいのでこれを基本的な材料にします。

 

f:id:yosshy79:20141122150259j:plain

 

大人向けのウォールは2X4材で作るつもりなので、子供用のウォールは半分のサイズを1X4材を、さらに半分のサイズにカットして1X2のサイズにしたものを骨組みに利用します。

木材カットはホームセンターのサービス(1カット30円)を利用しました。

「数ミリの誤差はでますので了承ください」と言われ、実際にその通りでしたが、まあ木材のそりとかもあるようです。

 

*針葉樹合板

コンパネなどを利用する壁部分には、針葉樹合板にしました。

北零WOODによると、接着剤にフェノール樹脂を使用していて、シナベニヤ等の合板に比べて耐久性が高いとの事でした。

壁は屋外に設置するので、これを採用しました。

また、ホームセンターでは厚さ12mmが置いてありました。

これを木材カットサービスで十字に4分かつしたものを、サブロク板に見立てて使います。

これに、屋外用の水性木材保護塗料を塗って利用します。

 

*コーススレッド

木の接合にはステンレス製のコーススレッドを使い、骨組みには主に長さ65mm、壁の取り付けには長さ32mmのものを利用しました。

 

*ゴムシート 厚さ3mm

骨組みの足の部分に、滑り止めや傷防止の為に、ゴムシートを貼りました。

 

主な材料だけで5000円位かかりました。

 

内訳は下記の通り。

ホームセンター(コーナン

1x4材 (1820mm)  4本 940円

針葉樹合板(1820x910x12mm)1380円

水性木材保護塗料 (0.7L スプルース)1380円

ステンレスコーススレッド(長さ65mm 40本+長さ32mm 80本) 800円

ゴムシート(厚さ 3mm接着剤付き)   400円

 

ホールドについて

ホールドはブッダホールドを用意しました。

B級品で25個セット18,000円。

ボルトと爪付きナットのセットが2,500円ぐらい。

 KingHolds〜クライミングホールド専門店で購入しました。

 

f:id:yosshy79:20141210214521j:plain

 

また、短い長さ40mmサイズ程度のボルトを12本500円ぐらいで、コーナンで追加購入しました。

 

こうしてまとめると、ホールドが一番お金がかかりますね。

今後はFRP用のポリエステル樹脂を利用しての自作ホールド作りも考えたいと思います。

 

また、高さを考えるとマットも必要ですがこれも、あまり自作している人もいなく、ボルダリング用のマットを購入するとピンキリですが、1万〜4万ぐらいはかかる様です。

 

また、これ以外に木工工作の工具類を揃えるのにもお金がかかっていますが+1万円ぐらい!?、別の機会にまとめたいと思います。

 

CodeIQのカラオケマシン問題を解いた

ソニックガーデン社員によりCodeIQに出題されたカラオケマシン問題のベストコード発表会がUstreamで7/8に放送されます。

http://sonicgarden.doorkeeper.jp/events/12901

 

CodeIQの締め切りは既に済んでいたけれど、問題がブログで公開されていたので遅れながらも解答してみました。

 

※注意 以下の文章は、まだ上記のカラオケマシン問題を解くつもりで、解いていない人にはネタバレとなってしまいます。

 

以下に最初に作った解答コードを掲載します。 

# coding: utf-8

class KaraokeMachine
  TONES = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
	
  def initialize(melody)
    @melody = melody
  end

  def transpose(amount)
    melody = ""
    sharpFlag = false
    @melody.reverse.chars {|tone| 
      if tone == "#" then
        sharpFlag = true
        next
      end

      if sharpFlag then
        tone += "#"
	sharpFlag = false
      end

      index = TONES.index(tone)
      unless index.nil? then
        index += amount
	index %= TONES.length
        tone = TONES[index].reverse
      end
      melody += tone
    }
    return melody.reverse

  end
end

 

rubyの文字列操作の処理しやすさを活かしたとすると、今の私ではこれぐらい。

アルゴリズムを簡素化するために、データを後ろから処理するようにした。

 

上記のコードを見直してみたものを以下に掲載します。

他のブログに、解答例を公開している人がいたので、それも参考にしました。

 

# coding: utf-8

class KaraokeMachine
  TONES = %w(C C# D D# E F F# G G# A A# B)
	
  def initialize(melody)
    @melody = []
    melody.chars {|tone|
      if tone == "#" 
        @melody[-1] += "#"
        next
      end
      @melody.push(tone)
    }
  end

  def transpose(amount)
    melody = ""
    @melody.each {|tone| 
      if i = TONES.index(tone)
        i = (i+amount) % TONES.length
        tone = TONES[i]
      end
      melody += tone
    }
    return melody

  end
end

基本的なデータ構造とアルゴリズムは、参考にした他者のブログの解答コードともはや同じです。

これならば、データ後ろから処理する工夫も必要もない。また、分岐を減らすためelse句を極力使わない工夫は残しました。

これを超えるアイデアで根本的にコードを奇麗にするのは私には無理かな。

ベストコードの発表が楽しみになってきた。

 

 7/8追記

放送を視聴した上で、もう一度リファクタリングしたコードを以下に掲載します。

正規表現を使うアイデアで見直しました。

rubyの標準APIを駆使してハッシュで変換テーブルを使うアイデアが紹介されていましたが、ruby実務経験が無い私には難しかったかもしれません。性能改善の観点でも良さそうですね。

またrubyの文化ではreturnはあまり書かないそうです。

 

# coding: utf-8

class KaraokeMachine
  TONES = %w(C C# D D# E F F# G G# A A# B)
	
  def initialize(melody)
    @melody = melody
  end

  def transpose(amount)
    @melody.gsub(/[A-G]#?/){|tone| 
      i = (TONES.index(tone) + amount) % TONES.length
      TONES[i]
    }
  end
end

勉強になりました。

プロジェクトの地獄天国を分ける要因の一つはコードの簡潔さだと改めて思いました。