環境
- mac Yosemite
- vagrant1.6.5(centos 6.5)
ググってもなかなかひっかからないのでメモ
sudo yum erase nginx
これだけです。
まあ確かにnginxを削除する機会は少ないですね。インフラのCIってまだあんなり一般的じゃないのかな。
ググってもなかなかひっかからないのでメモ
sudo yum erase nginx
これだけです。
まあ確かにnginxを削除する機会は少ないですね。インフラのCIってまだあんなり一般的じゃないのかな。
chefをいじっているとrubyのコードを読まないといけないことが多々あります。
けど、普段のwebアプリやAPI開発ではあまり利用しないコードが結構見られます。
ということで良くchefの中で見る子コードの勉強。
カレントディレクトリを出力
puts ENV['PWD'] # /Users/{username}/Documents/study/ruby
puts Dir::pwd   # /Users/{username}/Documents/study/ruby
URLやパスを結合する
puts File.join("https://test.com", "name=yamada")  # https://test.com/name=yamada
puts File.join("https://test.com/", "name=yamada") # https://test.com/name=yamada
スラッシュが勝手に保管されます。
以上。また気になるコードを見つけたらのせます。
前回の続き。今回はcakephp2と格闘
アプリを動かすにはapp/Config/bootstrap.phpを修正する必要がある。
編集しなくてはいけない三つの定数は、 ROOT 、 APP_DIR 、 CAKE_CORE_INCLUDE_PATH
if (!defined('ROOT')) {
    define('ROOT', DS . 'var' . DS . 'www' . DS . 'html' . DS . 'test');
}
/**
 * The actual directory name for the "app".
 *
 */
if (!defined('APP_DIR')) {
        define('APP_DIR', 'test');
}
define(
    'CAKE_CORE_INCLUDE_PATH',
    ROOT . '/Vendor/cakephp/cakephp/lib'
);
PHP Warning: include(Cake/Console/ShellDispatcher.php): failed to open stream: No such file or directory in /var/www/html/test/test/Console/cake.php on line 43
上記のエラーが発生。このままでは動かないので、以下の設定を変える。
まずはConsole/cake.phpを修正する必要がある。
        $root = dirname(dirname(dirname(__FILE__)));
        $appDir = basename(dirname(dirname(__FILE__)));
        //$composerInstall = $root . DS . $appDir . DS . 'Vendor' . DS . 'cakephp' . DS . 'cakephp' . DS . 'lib';
  $composerInstall = $root . DS . 'Vendor' . DS . 'cakephp' . DS . 'cakephp' . DS . 'lib';
$appDirがあるので、これは不要。削除してやると動作する。
でもこのままではまだエラー。
さらに続きます。
前回の続き
/etc/init.d/mysqld start
    CREATE DATABASE `cakephp`;
    GRANT ALL ON `cakephp`.* to test@localhost IDENTIFIED BY 'passtest';
    FLUSH PRIVILEGES;
// apache install sudo yum -y install httpd // launch sudo /etc/init.d/httpd start cd /var/www/html/ // を記述 sudo touch phpinfo.php
http://192.168.33.10/phpinfo.phpでアクセスを確認。
しかし、検索するとwindows環境の設定ばかりがひっかかる。開発Linux用のまとめを自分で作成しないと時間の無駄でダメだこりゃ。
面倒臭くなってきたw。準備が長いって。railsは偉大だ。。。
// プロジェクトフォルダをDocument rootに移動 sudo mv test/ /var/www/html/
http://192.168.33.10/test/test/でアクセス。なんかWarning: strtotime()とかでてる。
php.iniをいじってdate.timezone = Asia/Tokyoにすればいいらしい。
php --ini Configuration File (php.ini) Path: /etc Loaded Configuration File: /etc/php.ini Scan for additional .ini files in: /etc/php.d sudo vi /etc/php.ini // 変更 date.timezone = Asia/Tokyo // 再起動 sudo service httpd restart
うまく表示された。でも、まだDebugKit is not installed.とかいう警告がある。プラグインが必要らしい。というわけでさらに続きます。
参考サイト
1.回答
class String
  def world
    self << "world"
  end
end
puts "hello".world
参考メタプログラミングrubyP38
2.回答
str = "hello" def str.world self << "world" end puts str.world 参考メタプログラミングrubyP150
3.回答
puts "hello".class # String 参考メタプログラミングrubyP47
4.回答
puts String.class # Class 参考メタプログラミングrubyP47
久しぶりにphpを使わなければいけなくなりました。といっても少しですけど。
普段はjava, objective-c, swift, ruby使いなのですが、phpでCI環境を整えることになったので色々と学習&メモ。
ちなみにぼくが最後にphpで開発したのはverson4の最後の時です。php好きじゃないんだけど、まあ、仕方ないっすねー(棒)。rubyは素晴らしい言語だけど、使える人が本当に少ないのが弱点。結局両方用意しないといけなくなってしまう。(愚痴なので気にしないでくださいw)
せっかくなのでrubyの視点からみたphpの感想もちょこちょこ記載していきたいと思います(怒らないでねw)
開発はvagrantのcentos6.5で行います。macに入っているphpはext-mcryptとかいうライブラリがなくてシンボリックリンクはったり面倒なんで。
まずはchefを使わないで普通にinstallして基礎から学習します。php久しぶりなんで。
(chefを使った管理は多分あとで書きます。どうせやる必要あるんで)
// yumを最新にupdate sudo yum -y update // epelのリポジトリを追加 sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm // remiのリポジトリを追加 sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm // php install sudo yum install --enablerepo=remi --enablerepo=remi-php55 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php -v PHP 5.5.19 (cli) (built: Nov 13 2014 07:52:05)
install完了。次。
Composerをinstall
パッケージ管理ツールです。rubyでいうbundler、javaでいうgradle, movenのようなものです。
install
まずはchefを使わないで普通にinstall。勉強勉強。
curl -sS https://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...
Composer successfully installed to: /Users/{username}/Documents/study/php/test/composer.phar
Use it: php composer.phar
OK、次。php composer.phar install
php composer.phar install
Composer could not find a composer.json file in /Users/{username}/Documents/study/php/test
To initialize a project, please create a composer.json file as described in the http://getcomposer.org/ "Getting Started" section
composer.jsonというファイルが必要らしい。アプリのフレームワークにはrailsをインスパイアしたフレームワークcakephpを使います。
{
    "name": "example-app",
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear.cakephp.org"
        }
    ],
    "require": {
        "cakephp/cakephp": ">=2.4.9"
    },
    "config": {
        "vendor-dir": "Vendor/"
    }
}
cakeのサイトの説明をそのまま使います。もう一度実行。
php composer.phar install
Loading composer repositories with package information
Initializing PEAR repository http://pear.cakephp.org
Installing dependencies (including require-dev)
  - Installing cakephp/cakephp (2.5.6)
    Downloading: 100%         
Writing lock file
Generating autoload files
Vendor以下に色々ある。まだよくわからないけど次。
bakeコマンドでプロジェクトを作成。railsコマンドと同じかな。なんでcakeじゃないんだろうか。
Vendor/bin/cake bake project test // something
warningでてるけどProject baked successfully!だからOKなのかな?無視して次。
testフォルダを発見。中に色々フォルダがある。うまくいったっぽい。でも、設定を変える必要があるらしい。
define(
    'CAKE_CORE_INCLUDE_PATH',
    ROOT . '/Vendor/cakephp/cakephp/lib'
);
準備完了。DBはmysqlを使います。
rpm -qa | grep mysql mysql-libs-5.1.73-3.el6_5.x86_64 php-mysqlnd-5.5.19-1.el6.remi.x86_64 // delete mysql5.1 sudo yum remove mysql-libs-5.1.73-3.el6_5.x86_64 // add rpm yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm // install mysql yum install mysql mysql-devel mysql-server mysql-utilities mysql --version mysql Ver 14.14 Distrib 5.6.21, for Linux (x86_64) using EditLine wrapper
OK。長すぎるので分割して続きます。
参考サイト
androidでsqlite3のunit testを実施する場合、通常のテストを実施すると既存のdbを上書きしてしまいます。
なので、 androidにはテスト用にRenamingDelegatingContextというクラスが用意されているので、このクラスでテストDBを作成してテストします。
こうすることにより、本番用のDBを操作しないでテストを行うことができます。
サンプル
    public void testIsFaceboookAuthentication_true() {
        Context context = new RenamingDelegatingContext(mActivity.getApplicationContext(), "test_");
        // テストデータ登録
        TestUserHelper.registerTestUser(context);
        assertTrue(User.isFaceboookAuthentication(context));
        // テストデータ削除
        User.delete(mActivity.getApplicationContext(), null);
    }
Context context = new RenamingDelegatingContext(mActivity.getApplicationContext(), "test_")を使うことでテスト実行時に、プレフィックスに指定した「test_」が付加された「test_xxxxx.db」というファイル名としてDBが作成されます。こちらのDBを利用することで、各テストケース実行時に毎回クリーンなDBの状態で開始できます。
参考サイト
本屋に立ち寄って思わず衝動買い。パラパラとめくっただけで良い本だなと思ったので。
菜根譚とは今から400年前に中国で書かれた本である。野村克也氏だけでなく、巨人をV9に導いた川上哲治氏も愛読していた本だという。
Google worksの次に手に取った本だが面白かった。時代が変わっても不変な考え方は多い。
例えば、googleのミッションステートメント「邪悪になるな(Don't be evil)」は、菜根譚の「心のこもった言葉が人の気を動かし、組織の基礎になる」を具現化している。
なぜなら、googleはミッションステートメントを守るために巨大な中国市場から利益を無視して撤退した。googleは中国400年前の金言をしっかり守ったわけだ。
撤退した市場が中国市場とは皮肉な話であるが。
主に経営者とか管理者だと思う。でも、組織に属していないフリーのエンジニアが読んでも得られることは多いと思います。
少し紹介します
早熟は晩成にはかなわない。
これは確かにそうですね。年齢を重ねて学べば学ぶほどに己の無知が理解できるし、心も頭も体も鍛錬しなければいけないことに気づきますね。勢いだけでなく、理論で物事をコントロールできるようになると調子の波が減ります。
小さなことにも手を抜かない。
当たり前のことだけど、なかなかできないことです。一流であればあるほど基礎を重視し、小さなことにも手を抜かない傾向がありますね。
一つのことをまっとうすることで得られるものは多い。
本当にその通りです。何をやってもうまくいく人は、たいてい本質を見抜くことができる人です。
生まれつき本質を見抜く能力が高い人もいますが、たいていの人は後天的に身につけていきます。その一番確実な方法は得意を極めることですね。
素質は平凡でも非凡な努力で道を極める。
これは島田紳助さんも言っていた気がしますね。才能と努力をかけたものがその人の総合的な能力だと。
才能が平凡な3でも努力が5できればなんとかなると。さすがに才能が1だと無理みたいですがw
400年前にこんな優れた本が書かれていたとは素晴らしいですね。人間の寿命なんてたかだか100年程度なので、やっぱ道を極める人の思考は似るんですね。
optionalの理解が曖昧なのでまとめました。
Forced unwrapping
optional型を強制的に非optional型にする。変数に!を付加する。
class Goku {
    func talk() -> String {
        return "ossu"
    }
}
var goku :Goku? = Goku()
println(goku!.talk()) # "ossu"
!を付加しないとコンパイルエラーが発生する。
Optional Chaining
optional valueのあとに?をつけて呼び出す。optional chainingを呼び出した結果は常にoptional valueである。
class Goku {
    func talk() -> String {
        return "ossu"
    }
}
var goku :Goku? = Goku()
println(goku?.talk()) # Optional("ossu")
Implicitly Unwrapped Optional
変数をImplicitly Unwrapped Optional型で宣言する際には、?ではなく、!を使う
class Saiyajin {
    
    var version: Int {
        return 1
    }
}
var saiyajin: Saiyajin! = Saiyajin()
saiyajin.version # 1
ついでにForced unwrappingとOptional Chainingの場合
var saiyajin2: Saiyajin? = Saiyajin() saiyajin2?.version # Some[1] saiyajin2!.version # 1
出力する結果は同じです。
nilの使い方
class Saiyajin {
    
    var version: Int {
        return 1
    }
}
var saiyajin: Saiyajin! = nil
saiyajin.version # ランタイムエラー
scalaを組んだことないと慣れるまでちょっと大変かもしれませんね。
参考サイト
mac Yosemiteでandroid studioを動かすと「java se6のランタイムをインストールする必要があります」というエラーメッセージが表示されるのでその対策方法です。
まずはmacのjavaのバージョンを確認。
java -version java version "1.7.0_55" Java(TM) SE Runtime Environment (build 1.7.0_55-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)
普通のjavaです。ただ残念なことに、IntelliJ IDEAをはじめとするJetBrainsのIDEはデフォルトでAppleのJava6を必要とします。
そうしないと、フォントのサブピクセルレンダリングが働かないためフォントが幾分汚く見えたり、エディタ領域のピンチイン・アウトでのズームイン・アウトも効かなくなるそうです。公式サイト説明
なので、Java for OS X 2014-001を導入します。
上記のjavaをinstallすればandroid studioは正常に動作するようになります。
また、IntelliJ IDEAをJava 6で動作させてもJava7、Java8、またJava9アプリケーション開発には問題ないそうです。
以上
chefでのディレクトリ作成方法(mkdir)。webアプリを配置するときなどに良く利用するのでメモ。
# web app root create
directory "/var/www/rails/public/app_web" do
  owner "root"
  group "root"
  recursive true
  mode 0755
  action :create
  not_if {File.exists?("/var/www/rails/public/app_web")}
end
  
not_ifがないと、再実行時にもう一度作成しようとするので注意。recursiveはそのまま再帰を意味します。
以上
参考
今更ながらrubyのmoduleのまとめ。
    railsでのアプリ開発作成数も10を超えたので、もう一度足元から固めるための再学習メモ。
    まさかこんなにrubyを長く使うようになるとは思わなかったなあ。chefを含めると、javaより利用してる時間長いです。
Basic sample. Good Method.
 
    # coding: utf-8
    module Test
      def test
        puts 'test'
      end
      def self.test1
        puts 'test1'
      end
    end
    class ModukeTest
      include Test
    end
    modukeTest = ModukeTest.new
    modukeTest.test
    # test
    
    Basic sample. Module instance is not able to create.
 
    test = Test.new
    test.test
    undefined method `new' for Test:Module (NoMethodError)
    
    Basic sample. Module class method is not able to call.
 
    modukeTest = ModukeTest.new
    modukeTest.test1
    undefined method `test1' for # (NoMethodError)
     
    includeは上記の通り。extendはクラスメソッドしてモジュールを使えるようになる。
 
    # coding: utf-8
    module Test2
      def test2
        puts 'test2'
      end
    end
    class ModukeTest
      extend Test2
    end
    ModukeTest.test2
    # test2
    
    色々なオープンソースを読んでいる人はわかると思いますが、extendはほとんど使われていない。80%くらいはinclude。よくある実装パターンは以下のような感じ。
 
    # coding: utf-8
    module Test
      def test
        puts 'test'
      end
      class Taro
        def introduce
          puts "may name is taro"
        end
      end
    end
    class ModukeTest
      include Test
    end
    taro = ModukeTest::Taro.new
    taro.introduce
    # may name is taro
    
    railsなんかはこういったパターンでよく記述されていますね。