稼働率99.9%

稼働率99.9%

春日井市でiPhoneアプリの開発を行っています。iPhoneを使い出してからそれに伴って開発環境もWindowsからMacへと移行しました。MacやiPhoneだけでなくIT全般について日々感じた事や思った事を備忘録として記録する事を目的としたブログです。

Amebaでブログを始めよう!

あるパーティションの容量を増やすには

「CentOS」で予め想定した範囲内の容量で足りれば問題は無いわけですが、後からHDDを追加してあるパーティションの容量を増やすには、どうすれば良いか?

この問題を解決する方法として「LVM」という機能があります。
※予め「LVM」で構成していないといけません。LVMで構成されていない場合は、OSのインストールから行う必要があります。

LVMとは

要するに複数のHDDを一つの記憶装置として見なして管理する機能です。
LVMでは、以下の構成から管理を行います。
1.物理ボリューム(PV:Physical Volume)
 物理HDDを小さなブロック(数MB~数十MB)で分割する 物理エクステント(PE)
2.ボリュームグループ(Volume Group)
 1.で作成した物理エクステントを寄せ集める
3.論理ボリューム(LV:Logical Volume)
 2.で作成したボリュームを各パーティションでマウントする



最終的にサーバ上の記憶領域として意識するのは、論理ボリュームになります。
(「/」や「/usr」といった通常のパーティション領域)

実際に論理ボリュームの容量を増やす

VirtualBox上に構築したCentOSで行ってみます。
まずは、HDDを1台の状態でOSをインストールした後にHDDを追加し論理ボリューム(今回は、「/」の容量を増加させます。)

1.初期構成
  「/」の容量は、36GB割り当て済み
# df -lh
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-lv_root
                       36G  1.9G   32G   6% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm
/dev/sda1             485M   33M  427M   8% /boot

2.PV作成
 追加したHDDデバイスを指定します。
# pvcreate /dev/sdb

3.2.で作成したPVを確認する
[root@localhost ~]# pvdisplay                                                                                      
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               VolGroup
  PV Size               39.51 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              10114
  Free PE               0
  Allocated PE          10114
  PV UUID               g3x6ki-TaBt-2V5J-FzyT-fJaI-AdS2-UNKiaZ
   
  "/dev/sdb1" is a new physical volume of "39.99 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb
  VG Name               
  PV Size               39.99 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               F5zxAf-hthA-UBBQ-jHAJ-u2Lz-9z3n-mLh1sz

4.VGに追加する
 ※必ず同じVGに追加する必要があります。異なるVGに追加されたPVは使用できない。
vgextend VolGroup /dev/sdb
5.VGのサイズを確認
  VGを照会する場合、「vgdisplay」コマンドを使用します。
[root@localhost ~]# vgdisplay                                                                                      
  --- Volume group ---
  VG Name               VolGroup
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               79.50 GiB
  PE Size               4.00 MiB
  Total PE              20352
  Alloc PE / Size       10114 / 39.51 GiB
  Free  PE / Size       10238 / 39.99 GiB
  VG UUID               pPlYvB-MZHe-u3WE-YeXE-3wHN-bwkw-vKA5nm

「Free PE / Size」が割り当て可能な容量になります。
上記の場合、「39.99GB」割り当て可能です。
6.論理ボリュームのサイズを変更
 使用するコマンドは、「lvresize」コマンドになります。
  今回は、「/」パーティションへ全て割り当てします。
lvresize -L +39.99G /dev/VolGroup/lv_root
「/dev/VolGroup/lv_root」は論理ボリュームパスになります。
7.ファイルシステムの拡張
 6.により論理ボリュームのサイズは変更されましたが、ファイルシステムの容量はそのままなので最後に拡張します。
resize2fs /dev/VolGroup/lv_root

8.確認
# df -lh
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-lv_root
                       74G  1.9G   69G   3% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm
/dev/sda1             485M   33M  427M   8% /boot

以上で容量が「36GB」から「74GB(増加分39GB)」増加しました。
今回は、容量を増やしましたが逆にパーティションを削除して別のパーティションに割り付けたりする事もできます。

最後に

CentOSで50GB以上のHDDで自動パーティション構成をした際に「/」に50GB割り付けられ「/home」に残りの容量が割り当てられてしまっているという事をサーバ構築後に気づき再インストールする事なくどうにか出来ないか調べてこの機能について知りました。

とあるレンタルサーバを借りた際に「/home」の容量が大きく割り付けられている事もあり、なぜこんな割り付けするのか気になっていた事が解決できました。

簡単にメールを送信するには

バックアップ等のエラー時に自動的にメールを送信する方法を採る事があります。

そのサーバ内に「SMTPサーバ」が稼働していれば単純に、
mail -s "件名" "red-ozemi@gmail.com" < message.txt 
とすれば内部のサーバを利用してメールを送信する事ができます。

※メーラーによっては文字化けするから対策が必要かも。
※mailコマンドはCentOS5とCentOS6で動作に互換性が無いようです。
にわかSEの独り言 CentOS 5のmailコマンドをCentOS 6で使えるようにする方法 
「SMTPサーバ」がサーバ内に無い場合にどうするかというのが本題です。

mailコマンドを拡張した「mailx」を使用する

CentOSを最小構成でインストールしているとmailコマンドが無いので
# yum install mailx
でインストールします。
SMTP-Authで送信させるには、「.mailrc」に設定します。
「.mailrc」はユーザディレクトリに配置するか(~/.mailrc)
またはmailコマンド実行時に環境変数でファイル指定をする事も可能です。

mailrcを設定する

以下の内容を「.mailrc」に記述します。
#メールサーバ
set smtp=smtp://[SMTPメールサーバ]:[送信ポート]
#認証方式
set smtp-auth=login
#SMTPユーザ名
set smtp-auth-user=[ユーザ名]
#SMTPパスワード
smtp-auth-password=[パスワード]

メールを送信する

メールを送信するには、
mail -s "件名" "送信先アドレス" < [メッセージファイルパス]
例.
mail -s "バックアップエラー" "red-ozemi@gmail.com" < message.txt

mailrcを別名ファイルで渡す場合、
env MAILRC=[.mailrcパス] mail -s "件名" "送信先アドレス" < [メッセージファイルパス]
例.
env MAILRC=mail.conf mail -s "バックアップエラー" "red-ozemi@gmail.com" < message.txt
これ以外にも添付ファイルを加えたり(-aオプション)する事ができます。

これを知る前は、perlベースで作成していましたが、色々とモジュールを入れないといけなかったりと設定が手間でした。
これなら、手軽にメールで通知できるのではないでしょうか。

参考サイト

hiro aki » Blog Archive » smtpサーバー使ってbashでメールを送る方法
Linuxのメモメモ [がらくたネット]
mail(1) manページ
mailx.1

Webデザインとその課題

昨今のWebアプリ開発において従来のPCサイトだけのみならず、スマホやタブレットといた端末への対応も要求される事があります。

フィーチャー・フォン時代と比較すればスマホやタブレットは機能的にはほとんどPCと遜色ないUIを実装できますが、ある程度のカスタマイズが必要になります。

しかし、気の利いたUIが作れたり、全体のデザインを統一できるのはデザイナーさんだったり、そのような資質を持った人にとって雑作も無い事なのかもしれません。
単なるプログラマでも素敵なUIが作れないかとこの課題に対して数週間、解決策を模索していました。

という事でこの課題に対してプログラマ視点から各解決方法についての感想をまとめました。

一から全てコーディングする方法


うーんさすがに無いかな。
「ムリ」、「ムダ」、「ムラ」がありすぎる。
というのもそもそも、
  • デザインが分かって無いんだから、「ムリ」。
  • デザイナーじゃないけど知ってれば損は無いけど道のみが長すぎる、「ムダ」。
  • IE、chrome、FireFoxにスマホやタブレットまで全ての挙動を把握って、絶対に自分の嗜好ブラウザに偏る、「ムラ」。

現状の作りを知ってからでも遅くはないのかな。

jQuery UI


クライアント側の処理は「jQuery」に頼っているので順当にいけばこれだね。
プラグインも豊富にあるし・・・動作しないですけど。何かエラーが出るんだよね。
そう、プラグインによってはjQueryで廃止されたメソッドを呼び出している場合があります。
そうなると自分で修正しないと使えないかもしくは「jQuery」本体のバージョンを下げる必要がある。
嫌だ、新しい機能を使いたいんだ。便利なんだ。このメソッドがいっしょじゃないと俺だめなんだ。
まあ、ある程度バージョンを絞るしかないのかな。でも今は作り始めだから最新で使いたい。

あとレイアウトが難しい。コンポーネントは豊富にあるのですが、この配置が絶妙に難しい。
そう、上記の「一から全てコーディングする方法」とそんなに変わらない。
いやコンポーネントが揃っている分はまだまし。

Kendo UI

悟りました。
全て揃ってそうなそんな素敵なUIフレームワークがあればいいじゃん。
あるんだなこれが。
モバイルにも対応して何て素敵な・・・って有料かい。
国際化にも対応している点が素敵すぎ。買えない事も無いお値段。


公式:Kendo UI - jQuery HTML5 framework for desktop, mobile app development, HTML5 data visualization

Twitter Bootstrap


Twitter社から提供されているUIフレームワーク。
そのまま使えば下手にデザインするより、今風というかそれなりの見た目のサイトが
構築できてしまう。
「グリッドシステム」と呼ばれるグリッドレイアウトによりある程度レイアウトはしやすい。
  • レスポンシブWebデザイン対応
  • jQuery対応

これで決まりかいやいやまだあるでしょう。

公式:Bootstrap

Initializer


今ならHTML5にも対応したい所です。
そんなHTML5に対応したサイトのテンプレートを生成できるWebサービスです。
「Classic H5BP」、「Responsive」、「Bootstrap2」のいずれかから選択し、
カスタマイズを指定していき、最後に必要なファイルをまとめてダウンロードできます。
  • レスポンシブWebデザイン対応
  • jQuery対応
  • Twitter Bootstrap2対応

公式:Initializr - Start an HTML5 Boilerplate project in 15 seconds!

まとめ


結局、部分的にはスタイルシートは改変する事はできてもサイトやシステム全体に及ぶデザイン構成となるとテクニックが必要となります。
そしてこのテクニックを一から習得するにはあまりに時間が掛かると思います。
※だって他にも色々やりたいから。

当面は、Initializer(Bootstrap2)というかデザインは全面的にBootstrap2を習得した方が近道になるのかなと思っています。

はじめに


前回の更新から大分日が経ちましたが、最近になってようやく色々と分かってきたのでちまちまとまとめてみます。
既に1.9がリリースされており、2.0がリリース段階にあるようですが、Jquery 1.8.3を使用しています。特に理由はありませんが。

FileAPIとXML


HTML5対応のブラウザを利用する事で従来は対応していなかったローカルファイルの取り扱いができるようになります。
バイナリ形式でもテキスト形式でも読み込み、JavaScriptで取り扱う事が可能です。
<input type="file" id="loadButton" value="読込"/>
複数のファイルを読み込みたい場合は、「multiple」を指定します。
<input type="file" id="loadButton" value="読込" multiple/>
$(function() {
    $('#loadButton').bind('change', loadButtonClick);
});
function loadButtonClick(e) {
    var file = e.target.files[0];
    var reader = new FileReader(); 
    reader.onload = function(data) {
        $('#view').text(data.target.result);
    };
    reader.readAsText(file,'UTF-8');
}


上記は読み込んだテキストファイルをそのまま表示しているだけですが、
これまでサーバへファイルをアップロード後に内容をチェックしていた処理も
ローカル側で事前にチェックする事もできるようになります。
また、Jqueryを利用すればXMLファイルも簡単に取り扱う事が可能です。
例えば、ファイル読み込み後の処理で
    reader.onload = function(data) {
        var xml = $.parseXML(data.target.result);
        $(parseXML).find('内容').each(xmlParse);
    };
    
function xmlParse() {
   ~要素を処理~
}

簡単に取り扱う事が可能です。

グローバル変数と関数


    var test;
    
    window.test = 'OK';
    
    alert(test);

一見すると上記コードの結果は「undefined」と表示されそうですが、
実際は「OK」と表示されます。
知っている人にとって当たり前なのですが。
この場合の変数「test」はグローバル変数ですが、
実際は、グローバルオブジェクトのプロパティになるそうです。
グローバルオブジェクトは「window」になります。
※厳密には異なるようです。
 詳細は、Window オブジェクトは厳密には Global オブジェクトじゃない? - フリーフォーム フリークアウト

なので「window.test」も「test」も指し示す物は同じという事。
関数定義も同じ事になります。

即時関数


やりたかった事は$.ajaxでレスポンス取得時に共通処理を行った後にコールバック関数を呼び出すという事を
数ヶ月前に悩んで諦めていた事がようやく解決しました。
それがこの「即時関数」。
名前のとおりすぐに実行される関数なのですが、例えば下記のようなコードです。
    (function() {
        alert('ok');
    })();

定義された式「(function(){alert('OK')})」を「();」処理しなさいという事で
式を処理しているだけです。
これが下記のコードであると処理される事はありません。
    (function() {
        alert('ok');
    });

当然、引数を渡す事も可能です。
    (function(message) {
        alert(message);
    })('OK');

冒頭に記述した悩みも
var test = (function(callback) {
        return function() {
             callback();
        };
    })(hoge);

function hoge() {
   ~処理~
}

とすると、変数「test」の内容は、
    function() {
        hoge();
    };

となります。
もっと賢いやり方があるのかもしれませんが、コールバック先の中でコールバックを呼ぶには即時関数を
利用するのも一つの手です。
もちろん、コールバックだけでなく予め値を渡しておきたい場合も同様です。
参考:

知ってて当然?初級者のためのJavaScriptで使う即時関数(function(){...})()の全て - 三等兵

(function(){})() と function(){}() - IT戦記

モジュールパターン(module pattern)とクロージャーパターン(closure pattern) - 放浪するエンジニアの覚え書き

長い事忘れていましたが・・・


忘れていましたが当時調べていた際にかなりはまって半年以上たってしまい、つい最近新しいAPI「Sync API」が公開されたようですね。
という事で自分の復習を兼ねて記載します。
当時、1.23だったSDKも1.33が最新になっていますが、基本は変わっていないのかな。
動作確認環境
Xcode:4.6
Dropbox SDK:1.33

サンプルコードにはまる


Dropbox SDKに含まれているサンプルがあるのですが、動作させるには「App Key」等の発行が必要になります。登録方法は、こちらの記事を参照
XcodeでDropboxに付随するサンプルを開きます。
2箇所ほど発行された自分のアプリ用の「App key」と「App secret」および「アクセスレベル」を記述します。
まず、1箇所目は[DBRoutetteAppDelegate.m]です。
「root」変数には、アプリ登録時に指定したアクセスレベルを指定します。

「全てのアクセスを許可する」を選択した場合
NSString *root = kDBRootDropbox
「アプリ固有のフォルダのみアクセスを許可する」を選択した場合
NSString *root = kDBRootAppFolder

を指定します。
2箇所目は、「DBRoulette-info.plist」になります。

ここで注意しないといけないのは、初期状態で「db-APP_KEY」となっているので「db-」を付けた自分のアプリの「App key」を指定しないといけません。
私は、最初「db-」を指定しておらずにエラーに悩まされました。
エラー内容は、「DropboxSDK: unable to link; app isn't registered for correct URL scheme (db-[自分のアプリのApp key]」になります。
とりあえず、これでサンプルで変更する点は以上になります。

サンプルアプリを実行してみる


上記の内容は、とりあえず英語のドキュメントを読めば何とかこんな感じかなぐらいで切り抜けれるのですが、サンプルがなぜか動作しない。
SDKに付属しているサンプルの内容は、「認証」、「DropboxにアップロードされているJPGファイルのランダム表示」ができるアプリです。
このJPGファイルの表示の所で当初、どのフォルダへJPGファイルをアップロードすればいいのか分かりませんでした。
というよりもアプリ固有のフォルダも自前で作成した覚えがあるのですが、現行のSDK?Dropbox側?どちらかが変更されたのでしょうか。アプリの許可さえすれば自動的に「アプリ」フォルダが作成されます。※公開した時にユーザにアプリフォルダを作成させるなんて事はありえないので私の勘違いかもしれませんが。なおかつ、その当時「Apps」というフォルダ名でしたが、現在は「アプリ」になっています。

アプリを起動すると上記の画面が表示されます。
「Link Dropbox」ボタンを押下すると、

認証画面になります。
認証に成功すると該当アカウントのDropbox上に

「アプリ」フォルダが作成されこの下に「アプリ名」のフォルダが作成されています。
このフォルダへ任意のJPGファイルをアップロードする事でアプリ側に画像が表示されます。
うーん、サンプルを動かすだけでこんなにもはまるとは思ってもみませんでした。私が、ばかなだけかもしれませんが、ドキュメントを読んでも全然意味が分かりませんでした。

アクセスレベルについて


アプリ登録した際のフォルダへのアクセス権限は以下のようになります。