Objective-Cのプロトコルというもの
Qiitaから転載します。
前提
基本的に勉強中です。
Objective-CのプロトコルはJavaのインターフェース相当とか結構いろいろなところに書いてあるので、こんな感じかなとあんまり実用性のない例で書いてみました。
プロトコルTalk
#import <Foundation/Foundation.h> @protocol Talk <NSObject> @required -(void)talk; @end
クラスCat
#import <UIKit/UIKit.h> #import "Talk.h" @interface Cat : NSObject <Talk> @end
#import "Cat.h" @implementation Cat -(void)talk{ NSLog(@"ニューー"); } @end
クラスDog
#import <Foundation/Foundation.h> #import "Talk.h" @interface Dog : NSObject <Talk> @end
#import "Dog.h" @implementation Dog -(void)talk{ NSLog(@"わうん"); } @end
MainとしてクラスViewController.mで実行
#import "ViewController.h" #import "Cat.h" #import "Dog.h" @interface ViewController () { NSMutableArray <Talk> *objects; } @end @implementation ViewController - (void)viewDidLoad { objects = [@[] mutableCopy]; Cat *cat = [[Cat alloc] init]; Dog *dog = [[Dog alloc] init]; [objects addObject:cat]; [objects addObject:dog]; for (int i = 0; i<[objects count]; i++) { [objects[i] talk]; } } @end
2014-05-20 22:23:34.009 abdcfgl[67806:60b] ニューー 2014-05-20 22:23:34.009 abdcfgl[67806:60b] わうん
<Talk>
とか書いてあるけれど、Talkプロトコルと関係ないオブジェクトも配列に追加できて、talkメソッド無いと実行時エラーになった。そもそもジェネリックスではないだろう!と。
全然まだまだだけど。なんとなく、少しわかった。
TypeScriptリファレンス Ver.1.0対応を購入
といういことで、紙のやつはまだ先らしいので、
紙のやつも買うのかもしれませんが、
先行で購入しました。 TypeScriptについては何も知りません。
マイクロソフトってことすら知りませんでした。
1からですが、パラっと見た感じでは相当に内容が濃いので、
期待して読み進め、書き進めしたいと思います。
VagrantのCentOS6.5にRedmineをインストールする
↓最近Qiitaに書くことにしているのですが、
VagrantのCentOS6.5にRedmineをインストールする - Qiita
QiitaについてはエディタはKobitoで書いてそのままアップしています。
はてなBlogにもMarkDownで書けるので、
その内容を以下のようにコピペでほとんど同じになるわけです。
要するに何が言いたいかというと、MarkDownは完璧に身につけよう自分ということです。
前提環境
ソフトウェア | バージョン |
---|---|
MacOS | 10.9.2 |
Vagrant | 1.4.3 |
VirtualBox | 4.3.4 |
今からインストールするもの
ソフトウェア | バージョン |
---|---|
MySQL | 5.1.73 |
Apache | 2.2.15 |
Passenger | 4.0.41 |
rbenv | 0.4.0 |
Ruby | 2.0.0 |
基本
Redmine 2.5をCentOS 6.5にインストールする手順
上記リンクを実行していきます。 いくつか変えたり、Vagrantだからなのか、ちょっとエラー出たりとかあったので、一応全部たどってみます。
参考記事のままインストールするとMySQLとかもわりと古いものが入りますが、 動かないとなんですので、参考記事に沿った手順でインストールしました。
Mac上での作業
CentOS6.5のBoxを追加する
vagrant box add centOS65Box https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
追加の確認
$ vagrant box list centOS65Box (virtualbox)
Vagrant初期化
任意のディレクトリで以下のコマンド
ここでは
~/Documents/VagrantVM/redmineVM
ディレクトリで、
$ vagrant init
します。
VagrantFileができていれば、OK
$ ls -la total 16 drwxr-xr-x 3 teru1 staff 102 5 1 13:30 ./ drwxr-xr-x 9 teru1 staff 306 5 1 13:17 ../ -rw-r--r-- 1 teru1 staff 4606 5 1 13:30 Vagrantfile
VagrantFile編集
以下のように設定を変更(自分でbox addした時につけた名前です)
#config.vm.box = "base" config.vm.box = "centOS65Box"
VM起動&ログイン
vagrant up
vagrant ssh
$ uname -a Linux vagrant-centos65.vagrantup.com 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
ログイン後VM環境での作業
selinux設定
参考記事では
エディタで /etc/sysconfig/selinux を開き、 SELINUX の値を disabled に編集してください。
とありますが、もうdisabledになっていたので、そのままとします。
OS言語設定
/etc/sysconfig/i18nファイルを開き、以下のように設定する
LANG=”ja_JP.UTF-8” SUPPORTED=”ja_JP.UTF-8:ja_JP:ja”
Vimインストール
Vim使いたいのでインストールします。
sudo yum install vim
ホームディレクトリに.vimrcを作成し以下の内容を追加
:set encoding=utf-8
iptablesの設定
参考記事では/etc/sysconfig/iptablesの設定と再起動をしています。今回のBoxからインストールした環境では/etc/sysconfig/iptablesも存在せず、iptablesの設定がなされていないようなので、とりあえず、練習なので、このまま何もしません。もちろん運用する場合はそのまま運用など断じてしないでください。きちんと設定する必要があります。
EPELリポジトリの登録
http://dl.fedoraproject.org/pub/epel/6/x86_64/repoview/epel-release.html
↑こちらにあるパッケージのリンクURLをコピーして以下のコマンド
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
レポジトリの登録確認
$ yum repolist Failed to set locale, defaulting to C Loaded plugins: fastestmirror, versionlock Determining fastest mirrors * base: mirror.fairway.ne.jp * epel: ftp.jaist.ac.jp * extras: mirror.fairway.ne.jp * updates: centos.ustc.edu.cn repo id repo name status base CentOS-6 - Base 6367 epel Extra Packages for Enterprise Linux 6 - x86_64 10737 extras CentOS-6 - Extras 14 updates CentOS-6 - Updates 864 repolist: 17982
これでEPELリポジトリからのパッケージインストールも可能となりました。
いろいろインストール
開発ツール(Cコンパイラ等)のインストール
sudo yum groupinstall "Development Tools"
RubyとPassengerのビルドに必要なヘッダファイルなどのインストール
sudo yum -y install openssl-devel readline-devel zlib-devel curl-devel libyaml-devel
MySQLとヘッダファイルのインストール
sudo yum -y install mysql-server mysql-devel
Apacheとヘッダファイルのインストール
sudo yum -y install httpd httpd-devel
ImageMagickとヘッダファイル・日本語フォントのインストール
sudo yum -y install ImageMagick ImageMagick-devel ipa-pgothic-fonts
この辺は参考記事ままです。
Rubyインストール
ここなんですが、rbenv使ってインストールしていきます。 参考記事に沿って、ソースからやったんですが、うまく動きませんでした。 大方、私が悪いのでしょうけれども。まぁ、rbenv使って管理したほうが良いですしね。
rbenvとRuby本体
こちらを参考にしてほぼそのままです。 rbenv を使って ruby をインストールする(CentOS編)
2.1は使えないようですので、2.0.0の最新をインストールします。 参考記事との差異としては、 インストールされるrbenvが少し新しいこととインストールするRubyのバージョンも新しいものにするということくらいです。 Rubyのインストールまでは全て同様に。
ruby:2.0.0-p451が最新なのでRubyのインストールから設定までは、以下のようになります。
$ rbenv install -v 2.0.0-p451 $ rbenv rehash $ rbenv global 2.0.0-p451 $ ruby -v ruby 2.0.0p451 (2014-02-24 revision 45167) [x86_64-linux]
bundlerのインストール
gem install bundler --no-rdoc --no-ri
bundlerのパス設定
ここでは.bash_profileに書き込んで、再読み込みします。
$ echo 'export PATH="$HOME/.gem/ruby/2.0.0/bin:$PATH"' >> ~/.bash_profile $ source ~/.bash_profile $ bundle -v Bundler version 1.6.2
MySQLの設定
参考記事そのままですので、省略します。 sudoつけてやらないといけないコマンドはsudoつけて実行してください。
Redmineのインストール
ようやく本体です。
本体インストール
以下から最新の安定版をダウンロード http://www.redmine.org/projects/redmine/wiki/Download
ここでは、今日現在(2014年5月2日)2.5.1です。
ここではHomeディレクトリ(/home/vagrant)にダウンロード
curl -O http://www.redmine.org/releases/redmine-2.5.1.tar.gz
ダウンロード確認
$ ls redmine-2.5.1.tar.gz
展開
tar xvf redmine-2.5.1.tar.gz
アプリケーションの配置(/var/lib/redmineへ配置)
sudo mv redmine-2.5.1 /var/lib/redmine
データベースへの接続設定
/var/lib/redmine/configにdatabase.ymlというファイルを作成し、以下のように設定します。
production: adapter: mysql2 database: db_redmine host: localhost username: user_redmine password: ******** encoding: utf8
passwordはMySQL設定で指定したものを書きます
設定ファイルの作成(configuration.yml の設定)
参考記事 基本的にこちらの参照先サイトではmail設定をしてます。 mailサーバたててこの設定することで、Redmineからメールが送れるようです。
ここでは簡易的にgoogleのサービスを使ってやってみます。 ↓参考 Redmineを設定する
/var/lib/redmine/configにconfiguration.ymlを作成 以下のように設定
production: email_delivery: delivery_method: :smtp smtp_settings: enable_starttls_auto: true address: "smtp.gmail.com" port: 587 domain: "smtp.gmail.com" authentication: :plain user_name: "************" password: "************" rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf
Gemパッケージのインストール
/var/lib/redmine(Redmineインストールディレクトリ)で
bundle install --without development test
Redmineの初期設定とデータベースのテーブル作成
/var/lib/redmine(Redmineインストールディレクトリ)で
bundle exec rake generate_secret_token RAILS_ENV=production bundle exec rake db:migrate
Passengerのインストール
Passengerこれです。
gem install passenger --no-rdoc --no-ri
PassengerのApache用モジュールのインストール
passenger-install-apache2-module
対話形式になります
Which languages are you interested in? Use <space> to select. If the menu doesn't display correctly, press '!' ⬢ Ruby ⬡ Python ⬡ Node.js ‣ ⬡ Meteor
今回はRubyだけ選択して、Enter
Warning: some directories may be inaccessible by the web server! The web server typically runs under a separate user account for security reasons. That user must be able to access the Phusion Passenger files. However, it appears that some directories have too strict permissions. This may prevent the web server user from accessing Phusion Passenger files. It is recommended that you relax permissions as follows: sudo chmod o+x "/home/vagrant" Press Ctrl-C to return to the shell. (Recommended) After relaxing permissions, re-run this installer. -OR- Press Enter to continue anyway.
ワーニングが出たので、中断して以下のコマンドで権限与える
sudo chmod o+x "/home/vagrant"
もう一度
passenger-install-apache2-module
Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-) https://www.phusionpassenger.com Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
OKのようなメッセージが出ているのでOKかと思います。
Apacheの設定
/etc/httpd/conf.d/にpassenger.conf を作成し以下のコマンドの実行結果を記載する。
$ passenger-install-apache2-module --snippet LoadModule passenger_module /home/vagrant/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.41/buildout/apache2/mod_passenger.so <IfModule mod_passenger.c> PassengerRoot /home/vagrant/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.41 PassengerDefaultRuby /home/vagrant/.rbenv/versions/2.0.0-p451/bin/ruby </IfModule>
この内容をpassenger.confに記載します。
このような感じになります。
# ここにpassenger-install-apache2-module --snippetの結果を設定します LoadModule passenger_module /home/vagrant/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.41/buildout/apache2/mod_passenger.so PassengerRoot /home/vagrant/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.41 PassengerDefaultRuby /home/vagrant/.rbenv/versions/2.0.0-p451/bin/ruby # Passengerが追加するHTTPヘッダを削除するための設定(任意)。 Header always unset "X-Powered-By" Header always unset "X-Rack-Cache" Header always unset "X-Content-Digest" Header always unset "X-Runtime" # 必要に応じてPassengerのチューニングのための設定を追加(任意)。 # 詳しくはPhusion Passenger users guide(http://www.modrails.com/documentation/Users%20guide%20Apache.html)をご覧ください。 PassengerMaxPoolSize 20 PassengerMaxInstancesPerApp 4 PassengerPoolIdleTime 3600 PassengerHighPerformance on PassengerStatThrottleRate 10 PassengerSpawnMethod smart RailsAppSpawnerIdleTime 86400 PassengerMaxPreloaderIdleTime 0
Apache起動&自動起動設定
sudo service httpd start sudo chkconfig httpd on
起動確認
$ ps aux | grep httpd root 8046 0.2 0.7 186572 4440 ? Ss 08:49 0:00 /usr/sbin/httpd apache 8066 0.0 0.4 186704 2664 ? S 08:49 0:00 /usr/sbin/httpd apache 8067 0.0 0.4 186704 2664 ? S 08:49 0:00 /usr/sbin/httpd apache 8068 0.0 0.4 186704 2664 ? S 08:49 0:00 /usr/sbin/httpd apache 8069 0.0 0.4 186704 2664 ? S 08:49 0:00 /usr/sbin/httpd apache 8070 0.0 0.4 186704 2664 ? S 08:49 0:00 /usr/sbin/httpd apache 8071 0.0 0.4 186704 2664 ? S 08:49 0:00 /usr/sbin/httpd apache 8072 0.0 0.4 186704 2664 ? S 08:49 0:00 /usr/sbin/httpd apache 8073 0.0 0.4 186704 2664 ? S 08:49 0:00 /usr/sbin/httpd vagrant 8086 0.0 0.1 8360 752 pts/0 S+ 08:50 0:00 grep httpd
Redmine実行設定
/var/lib/redmineの所有者を変更
sudo chown -R apache:apache /var/lib/redmine
参考記事 では、3パターンが紹介されています ここではパターン2で設定します
sudo ln -s /var/lib/redmine/public /var/www/html/redmine
/etc/httpd/conf.d/passenger.confに以下を追加
RackBaseURI /redmine
再起動します
sudo service httpd restart
Macに戻って作業
VagrantFileを以下のようにコメントをはずします
#config.vm.network :private_network, ip: "192.168.33.10" ↓ config.vm.network :private_network, ip: "192.168.33.10"
Vagrant再起動
vagrant halt vagrant up
Redmineにアクセス
URLアクセス
ログイン
デフォルトでadminユーザがいるので、adminでログインします 右上のログインリンクから
ログイン:admin パスワード:admin
でログイン
デフォルト設定ロード
とりあえず管理画面で
メール送信の確認
設定ファイルconfiguration.ymlで設定したgmailのアドレスを設定します。
メールを送信するユーザのメールアドレス設定(ここではデフォルトのadminユーザ)
テストメールを送信します
メールが送信されれば、OKです。
使用方法
おいおいです
買うやつ
- 作者: 澤登亨彦,樋口大輔,クリエーションライン株式会社
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2014/04/25
- メディア: 大型本
- この商品を含むブログを見る
Chef実践入門 ~コードによるインフラ構築の自動化 (WEB+DB PRESS plus)
- 作者: 吉羽龍太郎,安藤祐介,伊藤直也,菅井祐太朗,並河祐貴
- 出版社/メーカー: 技術評論社
- 発売日: 2014/05/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化
- 作者: David Farley,Jez Humble,和智右桂,高木正弘
- 出版社/メーカー: アスキー・メディアワークス
- 発売日: 2012/03/14
- メディア: 大型本
- 購入: 24人 クリック: 567回
- この商品を含むブログ (51件) を見る
- 作者: ポール・M・デュバル,スティーブ・M・マティアス,アンドリュー・グローバー,大塚庸史,丸山大輔,岡本裕二,亀村圭助
- 出版社/メーカー: 日経BP社
- 発売日: 2009/08/06
- メディア: 単行本
- 購入: 18人 クリック: 388回
- この商品を含むブログ (37件) を見る
いろいろいい本ありますね。少しずつしか進めませんね。
買うやつ
これと
チーム開発実践入門 ~共同作業を円滑に行うツール・メソッド (WEB+DB PRESS plus)
- 作者: 池田尚史,藤倉和明,井上史彰
- 出版社/メーカー: 技術評論社
- 発売日: 2014/04/16
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
- 作者: Brad Green,Shyam Seshadri,牧野聡
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/04/18
- メディア: 大型本
- この商品を含むブログを見る
は買わないといけないかなと思っているので、買う?
呼ばれるということ
今とあるクライアントさんは足し算がしたいようです。足し算はクライアントさんの責務ではないようです。よって、クライアントさんは足し算の責務を持っているクラスを探して、そのクラスのオブジェクトにメッセージを投げることにしました。
探していたら以下のAddクラスがありました。
Add
package org.kijitoraneko; public class Add { public int addLogEn(int i, int i2){ System.out.println("start!"); System.out.println("足します"); int result = i + i2; System.out.println("end!"); return result; } public int addLogJa(int i, int i2) { System.out.println("はじまりです!"); System.out.println("足します"); int result = i + i2; System.out.println("おわりです!"); return result; } }
クライアントさんのコード
public class TestCode { @Test public void testAdd1() { Add add = new Add(); int result = add.addLogJa(5, 5); assertThat(10, is(result)); } @Test public void testAdd2() { Add add = new Add(); int result = add.addLogEn(5, 5); assertThat(10, is(result)); } }
出力結果
はじまりです! 足します おわりです! start! 足します end!
ここでは、足し算をしたいために足し算のクラスAddに処理を委譲しています(これをメッセージ送信などといったりします)Addクラスの責務は「足し算をすること」です。ここでは抽象レベルの話はしません。場合によってはCalcクラスにするかもしれませんよね(他の計算ロジックも含むなど)。その辺はその時々の設計の問題ですね。
Addクラスにはメソッドの前後にログ出力があります。これはこのクラスの責務ではありませんが、こういう処理はオブジェクト指向では解決できなかったりします。いろいろなパターンのログを出力したい場合には足し算をするという本来の責務はひとつであるにもかかわらず、メソッドがどんどん増えてしまいませんか?
あらかじめログ内容は決まっておらず、使用する側がログの内容をそのつど決定したい場合もあるかもしれません。
あくまでここでは簡単な具体例を出していますが、「このような具体例とは違うこのような状況」はいろいろ考えられるのではと思います。
で、どうしましょうということですが。
こんなんでしょうかね。
ILogBinder
package org.kijitoraneko; interface ILogBinder { void beforeLog(); void afterLog(); }
AddAop
package org.kijitoraneko; public class AddAop { public int add(ILogBinder calc, int i, int i2) { calc.beforeLog(); System.out.println("足します"); int result = i + i2; calc.afterLog(); return result; } }
クライアントさんのコード
@Test public void testAddAop() { AddAop addAop = new AddAop(); int result = addAop.add(new ILogBinder() { @Override public void beforeLog() { System.out.println("自分でカスタマイズできます スタート!!!!!!!!!!!!!"); } @Override public void afterLog() { System.out.println("自分でカスタマイズできます END !!!!!!!!!!!!!"); } }, 5, 5); assertThat(15, is(result)); }
出力結果
自分でカスタマイズできます スタート!!!!!!!!!!!!! 足します 自分でカスタマイズできます END !!!!!!!!!!!!!
この基本を応用すれば、私が出くわした、Connectionのクローズをすべての開発者に課すということもなくなると思います。 というか、Java8のラムダとかではもっと違う感じで書けるのかもしれませんが、私の知識がまだ追いついていません。
その前に、そもそも、ログ処理やトランザクションなどのいわゆる横断的な関心事に関してはAOPフレームワークを使うべきですよね。
結論
「よく調べよう!」
ターミナル作業 sedで一括でバックアップファイルを作成
$ ls -la total 0 drwxr-xr-x 5 teru1 staff 170 1 21 20:40 . drwx------+ 16 teru1 staff 544 1 20 21:56 .. -rw-r--r-- 1 teru1 staff 0 1 21 19:09 aaa.sh -rw-r--r-- 1 teru1 staff 0 1 21 19:09 bbb.sh -rw-r--r-- 1 teru1 staff 0 1 21 19:09 ccc.sh
$ mkdir BK; ls -1 *.sh | sed 's/.*.sh/cp & `pwd`\/BK\/&.BK/' > backupExec; sh backupExec && rm -f backupExec
terubookAir:shell teru1$ ls -la total 0 drwxr-xr-x 6 teru1 staff 204 1 21 20:41 . drwx------+ 16 teru1 staff 544 1 20 21:56 .. drwxr-xr-x 5 teru1 staff 170 1 21 20:41 BK -rw-r--r-- 1 teru1 staff 0 1 21 19:09 aaa.sh -rw-r--r-- 1 teru1 staff 0 1 21 19:09 bbb.sh -rw-r--r-- 1 teru1 staff 0 1 21 19:09 ccc.sh $ ls -la BK total 0 drwxr-xr-x 5 teru1 staff 170 1 21 20:41 . drwxr-xr-x 6 teru1 staff 204 1 21 20:41 .. -rw-r--r-- 1 teru1 staff 0 1 21 20:41 aaa.sh.BK -rw-r--r-- 1 teru1 staff 0 1 21 20:41 bbb.sh.BK -rw-r--r-- 1 teru1 staff 0 1 21 20:41 ccc.sh.BK