2014年11月23日日曜日

Nginx uninstall

環境

  • mac Yosemite
  • vagrant1.6.5(centos 6.5)

ググってもなかなかひっかからないのでメモ


sudo yum erase nginx

これだけです。
まあ確かにnginxを削除する機会は少ないですね。インフラのCIってまだあんなり一般的じゃないのかな。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

Ruby for chef

環境

  • ruby 2.1.2

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

スラッシュが勝手に保管されます。

以上。また気になるコードを見つけたらのせます。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年11月18日火曜日

ruby使いが手を動かして学ぶphp その3

前回の続き。今回はcakephp2と格闘

環境

  • mac Yosemite
  • vagrant1.6.5(centos 6.5)

アプリのパスを設定

アプリを動かすにはapp/Config/bootstrap.phpを修正する必要がある。

編集しなくてはいけない三つの定数は、 ROOT 、 APP_DIR 、 CAKE_CORE_INCLUDE_PATH

  • ROOT には、アプリのフォルダが含まれているディレクトリのパスを設定
  • APP_DIR には、(訳注:相対的な)アプリのフォルダ名を設定
  • CAKE_CORE_INCLUDE_PATH には、CakePHPライブラリフォルダのパスを設定


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'
);

Console/cakeを動作させるための設定


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があるので、これは不要。削除してやると動作する。
でもこのままではまだエラー。

さらに続きます。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年11月17日月曜日

ruby使いが手を動かして学ぶphp2

前回の続き

環境

  • mac Yosemite
  • vagrant1.6.5(centos 6.5)

mysql起動


/etc/init.d/mysqld start

データベース作成


    CREATE DATABASE `cakephp`;

    GRANT ALL ON `cakephp`.* to test@localhost IDENTIFIED BY 'passtest';

    FLUSH PRIVILEGES;

apacheをinstall


// 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用のまとめを自分で作成しないと時間の無駄でダメだこりゃ。

プロジェクトをapacheのドキュメントルートに移動

面倒臭くなってきた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.とかいう警告がある。プラグインが必要らしい。というわけでさらに続きます。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年11月16日日曜日

Ruby メタプログラミング 基礎トレーニング

  1. Stringオブジェクト”hello”に"world"を追加するworldメソッドをオープンクラスを用いて実装せよ。
  2. Stringオブジェクト”hello”に"world"を追加するworldメソッドを特異メソッドを用いて実装せよ
  3. Stringオブジェクト”hello”のclassを答えよ
  4. Stringクラスのclassを答えよ

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

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年11月15日土曜日

ruby使いが手を動かして学ぶphp

久しぶりにphpを使わなければいけなくなりました。といっても少しですけど。
普段はjava, objective-c, swift, ruby使いなのですが、phpでCI環境を整えることになったので色々と学習&メモ。

ちなみにぼくが最後にphpで開発したのはverson4の最後の時です。php好きじゃないんだけど、まあ、仕方ないっすねー(棒)。rubyは素晴らしい言語だけど、使える人が本当に少ないのが弱点。結局両方用意しないといけなくなってしまう。(愚痴なので気にしないでくださいw)

せっかくなのでrubyの視点からみたphpの感想もちょこちょこ記載していきたいと思います(怒らないでねw)

環境

  • mac Yosemite
  • vagrant1.6.5

開発はvagrantのcentos6.5で行います。macに入っているphpはext-mcryptとかいうライブラリがなくてシンボリックリンクはったり面倒なんで。

php5.5のinstall

まずは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

Composer

パッケージ管理ツールです。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フォルダを発見。中に色々フォルダがある。うまくいったっぽい。でも、設定を変える必要があるらしい。

CAKE_CORE_INCLUDE_PATH を相対パスに変更


define(
    'CAKE_CORE_INCLUDE_PATH',
    ROOT . '/Vendor/cakephp/cakephp/lib'
);

準備完了。DBはmysqlを使います。

Mysql5.6をinstall


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。長すぎるので分割して続きます。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年11月12日水曜日

android sqlite3 unit test

androidでsqlite3のunit testを実施する場合、通常のテストを実施すると既存のdbを上書きしてしまいます。
なので、 androidにはテスト用にRenamingDelegatingContextというクラスが用意されているので、このクラスでテストDBを作成してテストします。 こうすることにより、本番用のDBを操作しないでテストを行うことができます。

環境

  • android:minSdkVersion="14"
  • android:targetSdkVersion="21"
  • andoid studio 0.8.14

サンプル


    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の状態で開始できます。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年11月9日日曜日

野村克也の「菜根譚」感想

本屋に立ち寄って思わず衝動買い。パラパラとめくっただけで良い本だなと思ったので。

菜根譚とは

菜根譚とは今から400年前に中国で書かれた本である。野村克也氏だけでなく、巨人をV9に導いた川上哲治氏も愛読していた本だという。

ITエンジニア(時代に)が読むべき本?

Google worksの次に手に取った本だが面白かった。時代が変わっても不変な考え方は多い。
例えば、googleのミッションステートメント「邪悪になるな(Don't be evil)」は、菜根譚の「心のこもった言葉が人の気を動かし、組織の基礎になる」を具現化している。
なぜなら、googleはミッションステートメントを守るために巨大な中国市場から利益を無視して撤退した。googleは中国400年前の金言をしっかり守ったわけだ。
撤退した市場が中国市場とは皮肉な話であるが。

読者ターゲット

主に経営者とか管理者だと思う。でも、組織に属していないフリーのエンジニアが読んでも得られることは多いと思います。

心に残った言葉

少し紹介します

早熟は晩成にはかなわない。

これは確かにそうですね。年齢を重ねて学べば学ぶほどに己の無知が理解できるし、心も頭も体も鍛錬しなければいけないことに気づきますね。勢いだけでなく、理論で物事をコントロールできるようになると調子の波が減ります。

小さなことにも手を抜かない。

当たり前のことだけど、なかなかできないことです。一流であればあるほど基礎を重視し、小さなことにも手を抜かない傾向がありますね。

一つのことをまっとうすることで得られるものは多い。

本当にその通りです。何をやってもうまくいく人は、たいてい本質を見抜くことができる人です。
生まれつき本質を見抜く能力が高い人もいますが、たいていの人は後天的に身につけていきます。その一番確実な方法は得意を極めることですね。

素質は平凡でも非凡な努力で道を極める。

これは島田紳助さんも言っていた気がしますね。才能と努力をかけたものがその人の総合的な能力だと。
才能が平凡な3でも努力が5できればなんとかなると。さすがに才能が1だと無理みたいですがw

まとめ

400年前にこんな優れた本が書かれていたとは素晴らしいですね。人間の寿命なんてたかだか100年程度なので、やっぱ道を極める人の思考は似るんですね。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

Swift optional

  • xcode6.1

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を組んだことないと慣れるまでちょっと大変かもしれませんね。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年11月8日土曜日

mac Yosemiteでandroid studioを動かす

mac Yosemiteでandroid studioを動かすと「java se6のランタイムをインストールする必要があります」というエラーメッセージが表示されるのでその対策方法です。

  • mac
  • android studio mac 0.8.14

まずは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 for OS X 2014-001

上記のjavaをinstallすればandroid studioは正常に動作するようになります。
また、IntelliJ IDEAをJava 6で動作させてもJava7、Java8、またJava9アプリケーション開発には問題ないそうです。

以上

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

chef ディレクトリ作成

chefでのディレクトリ作成方法(mkdir)。webアプリを配置するときなどに良く利用するのでメモ。

環境

  • box centos6.5 on vagrant 1.6.5
  • chefDK 0.3.0

# 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はそのまま再帰を意味します。

以上

参考

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2014年11月1日土曜日

ruby moduleのまとめ その1

今更ながらrubyのmoduleのまとめ。
railsでのアプリ開発作成数も10を超えたので、もう一度足元から固めるための再学習メモ。
まさかこんなにrubyを長く使うようになるとは思わなかったなあ。chefを含めると、javaより利用してる時間長いです。

  • mac
  • ruby 2.0.0

Moduleとは

  • クラスと同じくメソッドを定義できる。
  • オブジェクトは作成できない
  • クラスメソッドが利用できない

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

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なんかはこういったパターンでよく記述されていますね。

参考

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加
Related Posts Plugin for WordPress, Blogger...