HalLab

春ルートのWEBアプリ開発のためのブログです。主に教材の内容とかを忘れないように残していきつつ、紹介したいと思います。

Rubyて10パズル

友人の結婚式や台風などなどで正直あまり時間の確保ができず、チュートリアルも1章飛ばしてしまったせいでエラーが発生してしまい
なんともなーと思って惰性で体を動かしていました。

友人とのドライブ中、対向車や前の車のナンバープレートで10を作って遊んでいたのですが、
ふと、4桁の数字で10を作るプログラムとか作ってみよう、と思い立ちました。
簡単に作ってみるまでをまとめておきます。

1.調査


この10を作る遊びが何なのかと調べてみたところ、10パズルというそうです。
(参考 Wikipedia https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%B3%E3%83%91%E3%82%BA%E3%83%AB
日常的に3桁や4桁の番号って結構溢れていて、マックの整理券なんかも3桁だった気がします。
普段はパット見で10を作れるか否かを判断して遊んでいたのですが、
10を作れるパターンをプログラムで総洗いできるんじゃないかと思いました。

2.プログラム
色々調べる前にどういうアプローチでやろうかなと自分だけで考えてみました。
単純な方法では4桁と四則演算の組み合わせ全てで計算して、その結果を評価することでできるかなと思います。
あとは自分なりのアプローチとして次のような感じで考えたりしました。
4桁の数字を1:3、2:2,3:1といったふうに区切って10が作れる簡単な組み合わせにできないかと考えて遊んでいます。
例えば「1234」という数字だった場合、
1.「123」と「4」に分割
2.「4」が10となる簡単な組み合わせは「6」を足すこと
3.「123」で6を作れないか確認する
4.「1+2+3」で6となる
5.「1+2+3+4」で10の完成
というふうに考えていたので、これを形にしてみるとどうなるかと考えてみました。

ex.自己流ルール


1.利用できる計算式は四則演算のみ
2.数字の順番は入れ替えられない
3.原則数字は4桁(1000~9999)

 

3.自己流アルゴリズム


入力された4桁の数字「abcd」を
1.X「a」とY「bcd
2.X「ab」とY「cd」
3.X「abc」とY「d」
に分解し、それぞれの組み合わせで10になるように計算を行う。
XとYこの2つの組み合わせで10になるパターンは
1.1+9,2+8...,9+1
2.11-1,12-2,...,19-9
2.1*10,2*5(入れ替え含む)
3.90/9,...,10/1
上記パターンに当てはまる組み合わせを洗い出し、答えに格納。
最後に溜まった組み合わせを吐き出す。
といったふうに考えて見ました。

 

4.逆ポーランド記法


プログラム上で「演算子」を一時的に「文字列」とし格納して最後に「文字列」から「演算子」になおして計算する方法、
というのを調べているうちに「逆ポーランド記法」というものが見つかりました。
(参考 https://ja.wikipedia.org/wiki/%E9%80%86%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95
細かい詳細はWikipediaに投げるとして、計算式を文字表現に直しかつプログラムで処理しやすい形に変換されていました。
そして、残念なことにこちらを調べていく過程で10パズルの回答も見つけてしまいました。
上記のアルゴリズムの実装は一時的においておいて、逆ポーランド記法を使ったプログラムの処理を簡単に見てみました。
(参考 http://sekai.hateblo.jp/entry/2013/09/15/203432
参考元のプログラムを見たところ、難しそうな逆ポーランド記法があっさりと処理に落とし込まれていて勉強になりました。
数字の入れ替えがあるので明確には自己流ルールから外れてしまうのですが、
そこは柔軟にルールを考え直すことで、正解としました。(自分を曲げました)

 

5.今回勉強したもの


逆ポーランド記法という概念
こちらは、プログラムで計算式を処理する際に一度文字列に直すことができるので個人的には非常に式の分岐がやりやすく便利な方法だと思いました。

 

6.得られたもの


モチベーションがちょっと上がりました。

 

7.発展


こちらをベースに、発展的なものとしては「自己流ルール厳守」「四則演算だけでなく累乗などを含める」などルールの追加でより高度なプログラムが作れそうです。
世の中の役に立つかどうかで言えば、アプリにして自分で楽しむ範囲に収まるかなと思います。

 

 

 

Ruby on rails tutorial ここまでの整理(5章、6章、7章)

概要

現在Ruby on rails tutorialの学習を進めています。現段階で7章まで進みましたので、ここで一度自分の中で整理をしておきます。各章のおおまかな内容を書いて、2周目以降の学習で復習できるようにして置こうと思います。

 

5章 レイアウトを作成する

レイアウトのデザイン。WEBアプリでもっともユーザーが重要な「UI」に関する部分がこちらに載っています。

Twitter社の作った「Bottstrap」というのも利用して手間なく洗練されたデザインが使えるということでした。

今回は指示の通りすすめただけなので「自分の使いたいデザイン」を使うにはどうするか、というところではいまいち理解できていないので、2周目で自分の使いたいデザインを使ってみようと思います。

これとは別に一般的なページに有る「ヘッダー」「フッター」などもここでデザインしました。

Tutorial後に開発するアプリでは、洗練されたデザインをより意識しつつ、ユーザーが使いやすいデザインにできればと。

6章 ユーザのモデルを作成する

この章では「WEBアプリ」に「ユーザーを登録」する動きについてコーディングしました。

これは多分極一般的な動作について仕組みなので、2周目ではよく確認する必要があるとともに、ツイッターやアマゾンアカウントを使った認証についても調べて置こうと思います。

モデルそのものについてはDBの知識があったのですんなりと吸収できました。また、ユーザーの要素に必要なパスワードについて「どうセキュアに管理するか」ということでハッシュ化の方法などもここで学習しました。

簡単にまとめると、ユーザー登録その後に、みたいなキャッチコピーが付きそうです。

 

7章 ユーザー登録

ここでついにユーザー登録できるところができました。色々と活用できる基本的な機能なので、2周目で全体を理解できるようにしておきます。ミックスインの機能なんかもありましたが、「あ使い回せるのか」程度の理解です。甘い。

ユーザーの登録フォーム、そしてそれらのデータを管理するモデルとDBやパスワードの管理など、非常に重要な基礎的な内容が詰まっていました。

 

またデバッグメソッドについてもここで初めて言及がありました。デバッグ自体はtutorialでガシガシ使う機会がないので、アプリの作成に入った段階で色々と試してみようと思います。

また、この章で改めて「開発環境」「テスト環境」「本番環境」の3つについて言及がありました。

初めて出てきたワードとしては「Gravatar」がでてきました。プロフィール画像を扱うものっぽいのですが、いまいちわかりません……

 

Flash変数っていうものを扱って一時的な表示(例えばログインできました!とか)についても個々に記載がありました。

 

これら処理について大まかな説明もあり、ユーザー登録の全貌について簡単に学べたように思えます。

ついでにSSLも適用しました。

 

今後の課題

セキュリティ関連についてはあまりtutorialだけでは得られなさそうなので、別途サーバー周りを考える際に環境について考えようと思います。

Ruby on rails tutorial ここまでの整理(3章と4章)

概要

現在Ruby on rails tutorialの学習を進めています。現段階で7章まで進みましたので、ここで一度自分の中で整理をしておきます。各章のおおまかな内容を書いて、2周目以降の学習で復習できるようにして置こうと思います。

3章 ほぼ静的なページの作成

ここでは、アプリの開発に向けてページの作成をすすめていきました。静的なページ(人やタイミングによって変わる要素が無いページ、一般的なサイトで言う概要とか)と動的なページ(何かしらの要因によって変化するページ、ツイッターでいうとログイン後のユーザーページとか)を作成していきました。ぶっちゃけこれらのページについては、ここで1番重要ではありませんでした。

個人的に一番重要だと思ったのは「テスト駆動開発」です。

考えとしては「こういう仕組みにしたい」となった場合に、その内容をコーディングする(今まで自分が習ってきたプログラミング)ではなく、

「こういう仕組みにするから、こういう結果のテストが成功しないとだめ」という考えです。これを見たときは目からウロコでした。

よく、問題解決なんかでAs is と To Beなんて話がありますが、「To Be」を受けてそれに必要なテストを先に用意する。そしてそのテストに通るようにコーディングとテストを繰り返す、というものでした。

・今までの自分の開発思考「要件通り動くプログラムかいたろ」

でやってました。当然のことながらリリース後に不具合とか割とありました。

ここで学んだテスト駆動開発の考えがあれば、割とそういった不具合も減らせるなと思います。反省してこう。

””テスト駆動開発では「red ・ green ・REFACTOR」サイクルを繰り返す””

これを念頭に置いて開発していきます。イェイ。

 

改めて振り返ると、内容的にはあまり重いものはなくサクッと学べました。初学者にとっては割と分かりやすい章なきがします。必要知識もあまり多くなかったですし。

4章 Rails風味のRuby

 

ここでは改めてRuby on railsとはなんなのか、ということとRubyとはなんだ?ということが勉強できました。Ruby については事前に簡単に勉強しちょっとしたプログラム作ったりはしていたので、基礎の基礎の導入ぐらいの知識はあったので割とすんなりクラスなどの知識は入ってきました。

ただ、細かい操作などメソッドなどは都度都度調べる必要はあります。

VBAなどではくっっっっっっっっっっそめんどくさかった配列的な構造がめっちゃくちゃやりやすいのが個人的にはめちゃくちゃ最高ですね。いやまぁ、多分今どきの言語なら当たり前なんでしょうけど化石みたいなVBAコードで開発保守運用してたら、新鮮。

そういえばVBAをRPAっていうと単価が倍になるそうですね、僕の給料も倍になってください。VBAならDB含めてある程度の作業員として動けますよ!!!!!給料倍にして!!!!!

あ、Rubyは割とVBAではなかった概念が多くあったのでほぼいないと思いますが自分と似たような境遇と知識の人は楽しいと思いますよ。全くいないと思いますが。

 

とりあえず簡単に振り返ってみた3章と4章。

ここまでの時間は割とすんなり進んでいて1章あたり2時間もあれば案内通りの動きはできていました。

ただ、内容の理解についてはだいぶ足りていない自覚はあるので、2周目で深く捉えられるようにしましょう。

Ruby on rails tutorial ここまでの整理(2章まで)

概要

現在Ruby on rails tutorialの学習を進めています。現段階で7章まで進みましたので、ここで一度自分の中で整理をしておきます。各章のおおまかな内容を書いて、2周目以降の学習で復習できるようにして置こうと思います。

1章 ゼロからデプロイまで

 この章ではRails未経験者がひとまずRailsで何かを作るために必要な環境を構築することがかいてありました。それぞれ案内としては、

  • IDE(Cloud9)
  • 本番環境(Heroku)
  • ソース管理(Git 、Gitbucket)

がありました。

概ね案内のとおりに勧め、Cloud9などAWSに関しては1年間無料枠の範囲で行っています。本番環境はHeroku、ソース管理についてはGitをインストールした上でGithubを使っています。

Cloud9について

AWSのサービスの一つCloud9を使っています。ぶっちゃけ仕組みをよく理解していませんが、他のサービスと連動してつかえるクラウドIDE程度の認識です。何も気にせず案内のとおりにコーディングなどなどするだけで開発ができるのは偉大。何も考えてねえのにできてしまう。

Herokuについて

Herokuについてはぶっちゃけノー知識で案内にしたがって作りました。Cloud9から適当に案内通りpushしたらなんか動いているって認識です。サブドメインですが、アプリ環境を提供してくれている……?2周目までに正しく理解しようと思います。ただ、めんどくさいので実際の運用ではAWSでまとめて利用したいなと思っています。

gitについて

gitについては以前社内SEやってたときに次のシステムからはリポジトリ使うぞつって簡単に話はあって多少の前提知識はあります。ただ、実際の運用まではしてないですし、異動した今リポジトリ管理もする様子がないのでやらないのかなって感じですね。余談です。

大本の木から変更するたびに枝分かれして修正分をマージしたりするのはなんとなく理解しました。ただ、全体的にどこでどう使うのが効果的なのか、という部分に関してはまだ理解していません。こちらも2周目までに勉強しましょう。

 

ここまでが一章ですが、平日の2時間程度しか確保できていなかったことと内容があまりにも初めてのことが多かったこと、Ruby習いたてであったことが関係してかなり日数、時間がかかりました。2周めは大きく削減する場所になりそうです。

2章 Toyアプリケーション

2章では1章で作った開発環境全体を使ってRailsによるアプリの開発、ソース管理、本番へのデプロイを行いました。

MVCの概念についても説明とワークがあり、ここで概念自体は吸収できました。

ざっくりと噛み砕くと

  1. ユーザーからの問い合わせを受けてコントローラーが動く
  2. コントローラーから指示を受けてモデルがDBから必要情報を持ってくる
  3. 情報を元にページを作るようにコントローラーがビューへ指示をだす
  4. できたビューをユーザーに見せる

といったざっくりとした理解をしています。

また、実際にプログラムを始めたことで、Railsのコードや仕組みによってほぼ自動的に必要な素材などが作成される点がすげえと思いました。楽すぎる。

 

この記事での復習は一旦ここまでにしておきます。このあとは随時作成してまとめようと思います。

参考ページ

Ruby on rails tutorial

https://railstutorial.jp/chapters/

 

Ruby on rails Tutorial  1周目 進捗状況

進捗

Ruby on rails Tutorial は気づけば3章まで進みました。

思い切ってAWSの無料枠を使い切る前にWEBアプリを完成させることを目標にし、勧めています。Git hubとHerokuへの登録も済ませました。

請求こないようにアラートも設定しておきました。

1周目終わる頃にまとめてアウトプットしようと思います。

 

感想

まず第一に今の自分になかった概念が一つありました。多分1つ以上いっぱいあるんだけど今気づけたのは一つだけでした。

それがRails特有のテスト駆動開発という考え方。

今の理解でまとめると、

  • スタート時点で「こういうテストが成功する必要がある」としてテストを設計
  • テストとコーディングを繰り返して、エラーを排除する。
  • エラーが出なくなったらオッケー

こういったサイクルで回す、という発想自体がなかったのですごく新鮮です。

WEBアプリの特性上、デプロイしたら使えてしまうということもあってかこういった開発をするんだ、という話が何度も出てきた用に思います。

 

続いては4章に取り掛かっていこうと思います。

サンプルプログラムは青空文庫使って、適当に小説が表示されるアプリでも作ろうかな。

現時点のスキル

ジョジョ

ジョジョ好きなんですよね、特に7部。主人公二人の掛け合いとか友情の成長の仕方とかがものすごく好き。

ジョジョ特有のステータスみたいに、現状を分析してみようと思います。

 

スキル

今自分の持ってるスキルを冷静に考えてみる。

VBA

 社内プログラムがAccessだったせいで、保守してるうちに特に体系立てて教わってないけど覚えました。Accessだけで完結するアプリなら簡単に作れると思う。

 

SQLserver

 これも同じく社内プログラムの都合で覚えました。複雑に煩雑に絡み合ったテーブル郡はよくもまぁこんだけ動いてたなって感じ。

基本的な処理から、ちょっとめんどくさい処理なんかもできる。ただしこれも体系立てて覚えていないので、一般的な部分とすり合わせは必須かもしれない。

 

・HP絡み

 htmlについては中学時代から今に至るまでの経験でなんとかカバー。CSSはちょっと触る程度にはいけるけども、使いこなせるかと言うと怪しい。CSSは別途勉強いるかな。

 

・サーバー絡み

 ぶっちゃけ微妙。特にWEB系。オンプレミスのサーバーは結構いじっていたけど、AWSとかのあたりは今回のアプリ開発で勉強しようと思う。セキュリティの部分は重点的に。

 

・ネットワーク系

 YAMAHAルーターを何度も設置する機会があったので、基本的な設定はできる。YAMAHAの公式サイトは質問代わりと網羅されててめちゃくちゃ助かった。ただ、今回は直接活かす機会はないと思う。

 あと大きなものとしては支店と本社のVPN貼り直しをやった経験はかなり強い。ぶっちゃけ途中の原因不明の障害で死ぬと思ったけど。クモの巣状のVPNを本社に一本化した途端に全ネットワークに影響出るとか外部業者の人すら想定してなかったわ。

 

グループウェア

 これも直接活かす機会はないけども、某先生のグループウェアの導入と展開を行った実績はあるので、まぁなんかに使えるやろ。

 

ざーっとまとめてみたけどこんな感じ。あとはパソコンの大先生ごっこで生きてきたので一般人の困ったレベルのPC知識は余裕で回答できる。

 

よくもまぁこの3年間まともな教育なしにここまでできたな、と我ながら思います。

Rubyで円周率

円周率計算

プログラミングといったら計算。みたいなことはチャールズ・バベッジが言ってた。いや適当なんですけど。

そんな計算の中でも個人的に花形なのは円周率だと思うんですよね。無理数で無限に続くしそのくせ円とかいう図形の中でも特徴的なものに関連してますし。

 

Rubyでの計算

入門の更に入門程度の計算はしていたが、自分で考えてやったことはなかったので試しにやってみた。

まず詰まった点としてメソッドの書き方。わからん。def~ってかいてもエラーになるなぜ。ってレベル。PublicとかPrivateの概念が未だにつかめて無いんだと思う。

 

実際計算

自分自身の達成感のためだけに見様見真似でコードをコピーしてとりあえず計算をした。その結果が次の画像になります。

f:id:halroot:20190912000918p:plain

パイです

わかったことは何もまだわかっていないということ。

 

余談

VScodeを入れてみたんですがまだ使いこなせずただただテキストエディタとして使ってます。

ちゃんとこの中で実行とか諸々できるように設定します。

取り急ぎ今日はここまで。

円周率って今どこまで求められてるんだっけかと思って見てみたけど96年時点で100万桁言ってたんだ…