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

とりあえずnull

プログラミングの勉強日記

3つの整数値の最大値を求める

アルゴリズムの勉強の基本中の基本。

考え方:

3つの整数値を比べ合いたい。x<y<zみたいな大小関係を作れたら良い感じ。最大値保存用の変数持っておけば現時点の最大値とそれぞれを比較するシンプルな構図になりそうなのでやってみよう。

流れ:

  • 3つの値を入れる変数a,b,cを用意する
  • 最大値を保存しておく変数maxを用意する
  • maxにとりあえず初期値としてaを設定し、aとbを比較。もしbが大きければmaxの値をbにする。
  • bとcを比較。もしbが大きければmaxの値をcにする。
  • 出力

コード

#include <stdio.h>

int main(void){
  int a, b, c;
  int max;

  printf("整数aの値:"); scanf("%d", &a);
  printf("整数bの値:"); scanf("%d", &b);
  printf("整数cの値:"); scanf("%d", &c);

  max = a;
  if(b > max) max = b;
  if(c > max) max = c;

  printf("最大値は%dです。\n", max);
  return 0;
}

出力結果:

$ ./list1-1
整数aの値:1000
整数bの値:40
整数cの値:20
最大値は1000です。

UIViewの基本的な使い方

UIViewはiPhoneアプリ等で画面表示を管理するクラスのことらしいです。とりあえずiPhoneアプリ作るとき、画面に表示させたいパーツとかはこのクラスから作られるっぽいです。ガンガン使えるようになりたいと思います。

でもその前に基本的なところから。

UIViewの基本的な使い方

UIViewを使うためにはいくつか準備が必要。

  1. メモリを確保し、インスタンス化する
  2. 初期設定で必要なパーツの幅や高さを指定してあげる
  3. self.view(画面におかえる一番下の地面みたいな部分)にのっける(出力させる)

ってことで上記の作業をコードでみていくことにします。

// 1. メモリを確保し、インスタンス化する
UIView *view = [[UIView alloc] init];

// 2. 初期設定で必要なパーツの幅や高さを指定してあげる
view.frame = CGRectMake(0, 0, 100, 100);

// 3. self.view(画面におかえる一番下の地面みたいな部分)にのっける(出力させる)
[self.view addSubview:view];

1と2をまとめて

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 30, 100, 100)];

といったふうに書くこともできる。

実験

背景赤のself.viewに背景白(幅:100, 高さ:100)のUIViewを表示させる

// hogeViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];
    
    // self.viewの背景を赤に設定  
    self.view.backgroundColor = [UIColor redColor];  
  
    // UIViewクラスのインスタンスを変数viewに設定。(メモリ確保+領域指定)  
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];  
  
    // 変数viewの背景を白に設定  
    view.backgroundColor = [UIColor whiteColor];  
  
    // self.viewの上にviewをのっける(表示させる)  
    [self.view addSubview:view];  
@end  

f:id:noriven:20150324082444p:plain

UIViewのサブクラス含めた基本的な作業の流れ

やはり

  1. メモリを確保し、インスタンス化する
  2. 初期設定で必要なパーツの幅や高さを指定してあげる
  3. self.view(画面におかえる一番下の地面みたいな部分)にのっける(出力させる)

となっており、例えばUIViewのサブクラスであるUILabelであったとしても、

UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake(0, 10, width, 30)];
name.text = @"hoge";
[self.view addSubview:name];

といったように1〜3の流れを周到しながら作業を進めていくことになる。

個人的な感想

いままでStoryBoard上でしかアプリ制作をしたことがなかったので、他者がコードオンリーで書いたアプリのソースコードなんかをみるとわけがわからない状態にあった。しかもいざ自分でコードオンリーでアプリを作ろうとすると領域指定していないとエラーだとか必要な設定がないからエラーだとか訳分からんままで理解ができなかった。なので当たり前なんだけど、特にiOS開発では初期の段階から正確な構造の理解が必要なんだなぁとしみじみ思いました。

RailsでControllerやActionを取得したい時に使えるメソッド

Rails開発しているとViewのほうでアクセスしているページのコントローラーやアクションを取得して、ビューで表示するものを変えたい、というケースがあったりします。

そんなときどうするかといいますと、

controller.controller_name
controller.action_name

で確認することができます。 条件分岐で使いたい場合などはこんな感じになるかと。

<% if controller.controller_name == "コントローラー名" && controller.action_name == "アクション名" %>
表示するもの。
<% end %>

ただビューでこんな長ったらしいもの書くのは嫌だなぁって方や、いくつかのビューで使いたいって方はこんな感じでhelper_methodにまとめておくといいかも。

ex) app/helpers/application_helper.rb

def check_page(controller_name, action_name)
  controller.controller_name == controller_name && controller.action_name == action_name
end

ex) app/views/items/show.html.erb

<% if check_page('items', 'show') %>
表示するもの。
<% end %>

スッキリしました〜!

よくわからなかったHomebrewについて

全くプログラミングのプの字も知らなかったころ、先輩エンジニアに「ソフトウェア入れるならMacportsじゃなくてHomebrewがいいよ」って言われて言われるがままにインストールしたことがあるHomebrewさん。未だによく理解していないので調べてみた。

 

要するに

ソフトウェアのインストールを単純化したものらしい。コマンド打つだけで欲しいソフトウェアがインストールできて、バージョン管理までできるやつらしい。素晴らしい。でもあんまりメリットを教授した感覚がない。

 

Macportsとの違い

Macportsと基本的には同じようなことをしてくれるのですが、Homebrewは至ってエコなシステム管理ツールという位置づけにあるらしい。Macportsの場合は既存のパッケージがあっても新しく同じパッケージをインストールしたりするなど、ちょいと時間がかかり無駄なことをしがちな子らしいです。一方Homebrewさんはそこらへんを美味くやってくれる非常にクルーな子らしいです。

 

MacOSX - パッケージ管理システム Homebrew - Qiita

Rails入門:初心者はまず始めに何から取り組めばいいのか?

Ruby on Railsウェブサービスを開発する上でとても威力を発揮するフレームワークです。そんなRailsを使ってウェブサービスをつくってみたいと考えている方はたくさんいるかと思います。でもRuby触ったことないし、っていうかそもそもちゃんとプログラミングしたことないし!という方のために、いくつかルートマップをつくってみました。参考になれば幸いです。

 

ステップ1:まずはガチャガチャと触ってみる

どんなゲームだって最初からすべて理解した上で触るのではなく、まずはどんなことができるのかを操作しながら覚え、攻略し、ストーリーを進めていくもんです。Railsだって同じです。まずはざっくりと全体感を踏まえた上でどんなことができるのか?をさぁーっと学習してみましょう。そこでお勧めなのが定番のドットインストール。

Ruby入門 (全22回) - プログラミングならドットインストール

Ruby on Rails 4入門 (全28回) - プログラミングならドットインストール

 

ステップ2:自分で作りたいものをつくってみる

ステップ1でRuby on Railsの基礎基本が学べたかと思います。次に自分の作りたいもの(例えばチャットサービスとか)をつくってみましょう。どんな仕様にするのか?どんな動作をするべきなのか考えて自分の力でつくるのが大事です。

ここがポイント!

相談できる人がいるかどうかです。Railsの構造を完全に理解していないと色々とつまづくことがあるかと思います。そんなときって何がわからないのかすらわからない場合が多いです。そこでつまづいた部分を相談できる人が身近にいるといいですね。というか、そういう環境を作りましょう。もはやここができないとなかなかその先に進めないと言っても過言ではないかと。。

 

 

ステップ3:理論や構造を復習しよう

ステップ1、ステップ2を通して大体Railsを使ってそれっぽい簡易的なウェブアプリを作れるようにはなったかと思います。しかし、さらに込み入った複雑な機能を実装するとなったとき、どんなコードをどこにかけばいいのか?という問題が生じます。そこで改めてRailsの理論や構造を復習しながら確認する必要があります。そこでお勧めなのが

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

Ruby on Rails Guides

 

これらのサイトでは丁寧にRailsについて解説しながらウェブサービスでよく使われるような機能を開発することができます。

 

全体を通しての心構え

つまづいたらググる。何がわからないのか、どこでつまづいていそうなのかを逐次推測し、そしてググり、解決策をみつけようと努力する姿勢を保つこと。これに尽きます。

わからないから続かない。わからないから作れない。これがプログラミングを独学する上で陥りがちな負のスパイラル。だからこそ、途中で述べた相談できる人がいるような環境をまずは作る事が大事ですし、なにより自分の頭でエラーの原因を推測してぐぐって解決する心構えをもつことが大事。誰も彼もがつまづき、開発速度が遅くなる経験を持っているはず。そう思えば気が楽になるでしょう。重要なのは学習速度をあげること。そのために「どこでエラーがでたの?なんでこうなったの?」とエラーの内容から原因を推測しトライしまくるしかありません。

 

諦めずに頑張りましょう!

そして自分の作りたいウェブサービスをつくっていきましょう!

 

Rails:メンテナンスしやすいフロントエンド設計の重要性

フロントエンドのメンテナンスってすごく難しい。複数人で開発していると、特にバックエンド専門の人がCSSをいじろうとし、HTMLにstyle=""で直書きしたりと「なんでやねん!」ってつっこみながら無駄な苦労を体験することもしばしばあるのではないでしょうか。そんなアプリケーションを運用していく中で生じるメンテナンスのだるさについて書いてみます。

 

運用してみてわかってくるメンテナンスの重要性

とあるスタートアップで開発やら運用やら行なっているのですが、開発者が複数存在し、だんだんとコードが増えていき、機能が増えてくるとどうしてもぶち当たってしまいがちな問題がメンテナンスコスト。今回は特にフロントエンドに関して書こうと思います。どっかのタイミングでリファクタリングなど行なうべきなのでしょうが、なにせ、スタートアップ。リファクタリングより価値検証が大事だという信念もあるためなかなかリファクタリング作業に本腰になれません(まぁ言い訳なんですが汗)。

 

しかし、開発・運用していくとアクセスログを見ながら小さな改善を頻繁に行なうようになりました。そこでぶち当たった壁がメンテナンスのしにくさ。特にRuby on Railsを使っているのでScssを用いているのですが、@extendやら@mixinやらバンバン使いまくっているわけです。実際にそのコードを書いた人は問題ないでしょうが、別の開発者(バックエンド専門の人だった場合は特に)が同じようにビューのUIやデザインを変更をしたいってなったときにすごく探しづらかったり、変更すると別の場所まで適応させてしまったりなどなど、Scssが便利すぎる反面、ちょいとやっかいなことが増えてきました。結果的にそのやっかいなタネはぼくらの時間と精神を貪りつづけ、デスマへと導くのでした。

 

実際に生じている問題

・前例に挙げた複数人で開発する際、Scssの全体的な構造を全員が把握できてないのでメンテナンスをすればするほどさらなるメンテナンスが必要になってくる。(Scssを編集してみたら、編集する予定じゃなかったところまで変更が適応されてた!)

・大まかなルールはあるものの、各人のルールでScssファイル構造でファイルを追加・編集しているので、メンテナンス時に編集しにくい。それが積もり重なって小さなメンテですら億劫になり改修・開発がめんどくさくなる。

 

個人的なベストプラクティス

  1. ビューのフォルダ構造に合わせてScssファイルを用意する
  2. @extendや@mixin、変数などを管理するファイルを用意する
  3. 開発者全体でファイル構造や編集の仕方などをまとめた資料を共有する

 

アプリケーションによって、もう少し詳細に定義することができるはずですが、一般論の範疇で書くなら上記3項でしょうか。特に最後の共通認識を持っているかどうかが運用を快適にするためのコツだと感じます。

 

やっぱり定期的に確認を踏まえた社内勉強会をするのが一番有意義かもですね。

Herokuで独自ドメインを設定する方法

こんな人にオススメ

・Herokuappに独自ドメインを指定したい人

・Herokuappにサブドメインと独自ドメインの両方を指定したい人

独自ドメイン設定で四苦八苦

これまでロリポムームードメインのコンボでしかドメイン設定なんてやったことなかったからHerokuでそれをやるのがとても大変でしんどい思いをしました。なのでこれ以上僕のようなしんどい経験をなくすためブログに残しておこうとおもいます。ちなみにぼくが利用したサービスはムームードメイン、その他3つのDNSサービスです。

 

これで独自ドメインが設定できる!?

「heroku 独自ドメイン」ってぐぐってみたところ、どうやらHerokuに独自ドメインを指定するのは至難の業とのこと。さらにぐぐってみるとHerokuのAdd-onにあるZerigo DNSというサービスでドメイン設定ができるみたい!

さっそく 「zerigo-dns - herokuで独自ドメイン - Qiita [キータ]」をよみながら設定!できた!

 

でもzerigoだとサブドメインしか指定出来ない。つまり http://example.com という(ルート)ドメインに指定したいのに http://www.example.com というふうにしかできない。これじゃ http://example.com にアクセスしてしまったユーザーにアプリケーションエラーを返してしまう結果になってしまう・・・月額7ドル払えば独自ドメインを設定できるっぽいけどドメインに7ドルは高いなぁ・・・と思い別の方法がないか再度調べることに。

 

結果:サブドメインしか設定できなかったので別の方法を探すことに

 

これで独自ドメインが設定できる!

どうしても独自ドメイン(しかもルート)で設定設定したかったから「heroku 独自ドメイン ルート」みたいな感じで調べていたらありましたよコノヤロー。

Express - herokuにルートドメインを無料で設定する - Qiita [キータ]

このページを読みながら再度設定を変更。できた!できたよ!本当に http://example.com でアクセスができたよ!!

ここで欲が出来てきました。サブドメインhttp://www.example.com)も設定してどのURL叩いてもアクセスできるようにしたい。

そうなってくるとgehirn DNSではどうやら無理っぽい。gehirnではルートドメインは設定することできるけど、サブドメイン(CNAME)を設定するのは無理とのこと(gehirnのヘルプページに書いてありました)。

 

なんだと・・・?

 

結論:ルートドメインもサブドメインも設定したいからまた新たなやり方を探すことに

 

 

ついに行き着きました。ルートドメイン・サブドメイン両方とも設定できる。なんだかんだAWSは素晴らしい

そしてぐぐりまくった末、ルートドメイン・サブドメイン両方とも設定できる方法をみつけました!

heroku で 独自ドメインを使う際の最善策を考えた | Workabroad.jp

AWSを使えばルートドメイン(http://example.com)とサブドメインhttp://www.example.com)両方とも指定することができる。

もう少し詳しく書くとサブドメインにアクセスするとそのまま利用することができて、ルートドメインからアクセスすると自動的にサブドメインに飛ばしてくれる。

なにはともあれこれでユーザーがドメインの関係でアプリケーションエラーページにアクセスすることがなくなった!ばんざい!

 

いやはや。かれこれ2週間ぐらいかかっていきつきましたが無事なんとかできたっぽい。AWSってすごいですなー。。