ラベル
2013/12/24
2013/09/21
2013/04/24
コードで英語を勉強する方法
とりあえず5文型を覚えれるように。
英文法の勉強は眠くなるのに、これだと結構覚えやすい。
main(); } /** * 文型について * http://blog.livedoor.jp/aritouch/archives/1470991.html * * S : Subject (主語) * V : Verb (動詞) * O : Object (目的語) * C : Complement (補語) * M : Modifier (修飾語) */ public function main() { $He = new Person(); $You = new Person(); $I = new Person(); // SV // He runs in the park. echo $He->run(); echo PHP_EOL; echo $He->run('in the peark'); echo PHP_EOL; // SVC // You look happy. echo $You->look(); echo PHP_EOL; echo $You->look('happy'); echo PHP_EOL; // SVO // I have a book. echo $I->have(); echo PHP_EOL; echo $I->have('a book'); echo PHP_EOL; // SVOO // I gave her a doll. echo $I->give(); echo PHP_EOL; echo $I->give('her'); echo PHP_EOL; echo $I->give('her', 'a doll'); echo PHP_EOL; // SVOC // I call the dog Pochi. echo $I->call(); echo PHP_EOL; echo $I->call('the dog'); echo PHP_EOL; echo $I->call('the dog', 'Pochi'); echo PHP_EOL; } } /** * Personクラス */ class Person { /** * TEST */ public $_test = 'test'; /** * TEST */ public function getTest() { return $this->_test; } /** * run * */ public function run($adverb = null) { return (is_null($adverb)) ? 'run' : sprintf('run %s', $adverb); } /** * look * */ public function look($complement = null) { return (is_null($complement)) ? 'false' : sprintf('look %s', $complement); } /** * have * */ public function have($object = null) { return (is_null($object)) ? 'false' : sprintf('have %s', $object); } /** * give * */ public function give($object = null, $object2 = null) { return (is_null($object)) ? 'false' : (is_null($object2)) ? 'false' : sprintf('give %s %s', $object, $object2); } /** * call * */ public function call($object = null, $complement = null) { return (is_null($object)) ? 'false' : (is_null($complement)) ? 'false' : sprintf('call %s %s', $object, $complement); } }
2013/04/23
google bloggerでソースコードを番号付きで表示する方法
main(); function main() { define('MAIL_PATH', 'C:\Users\c3po\AppData\Roaming\Thunderbird\Profiles\j0w66vt1.default\Mail\pop.mail.yahoo.co.jp\Inbox.sbd'); $urls = grepUrl(); $conv = convHtml($urls); outPut($conv); exit; } function grepUrl() { $preFile = file(MAIL_PATH. "\get_money"); foreach ($preFile as $k => $v) { if (preg_match('/http:\/\/dietnavi.com\/click.php\?cid=[0-9]+&id=[0-9]+&sec=[0-9a-z]+/', $v, $match)) { $ret[] = $match[0]; } } $uni = array_unique($ret); return $uni; } function convHtml($urls) { foreach ($urls as $k => $url) { $url = preg_replace('/\n$/', '', $url); $convs[$k] = sprintf('click_%s ', $k, $url, $k); } array_unshift($convs, ''); array_push($convs, ''); return $convs; } function outPut($convs) { $fp = fopen('conv.txt', 'w'); foreach ($convs as $k => $url) { fwrite($fp, $url. PHP_EOL); } fclose($fp); }
2013/04/22
平均、分散、標準偏差
データの特徴を1つの値から判断する方法(平均、分散、標準偏差)
データから度数分布表やヒストグラムを毎回作成するのは面倒なので、そんなことをしなくていいように、平均、分散、標準偏差がある。
- 平均
平均は簡単だ。データの和をデータ数で割ればよい。
- 分散
分散は各データが平均からどれくらい離れているか、散らばりやばらつきという数値である。
分散=(対象データ - 平均)の2乗の合計/データ数
- 標準偏差
分散=((対象データ - 平均)の2乗の合計/データ数)の平方根
2013/04/21
度数分布表
度数分布表のつくり方
- 最大値と最小値を見つける
データ群のなかでの最大値と最小値を見つける。
- 階級を決める
最大値と最小値がわかれば、その範囲をいくつに区切るかを考えます。この区切りのことを階級という。
- 階級に入るデータの数を数える
階級に入るデータの数を数えます。 階級に含まれるデータの個数を、度数という。
階級の真ん中の値を階級値というらしい。
2013/04/20
Google Application Engineでソースコードをダウンロードする方法
GAEの再利用
cronの実行を使うためにGAEを再度使うことに決めた。 2年ぶりくらいに利用するが、ハードディスクが壊れて、 以前作っていたアプリのソースがローカルにない。。。 GAEで閲覧できないか調べていると、昔はアップロードはできても、 ソースの閲覧や、ダウンロードはできなかったことを思い出しました。。。 困って調べてると、機能改善されてるみたいです。
https://developers.google.com/appengine/docs/python/tools/uploadinganapp?hl=ja#DownloadingSourceCode
appcfg.py download_app -A <your_app_id> -V <your_app_version> <output-dir>
このコマンドでダウンロードできるんですね。
当時設定していたcronが、当たり前ですが、2年間絶え間なく動いていました。 当時無料でしたが、よく読むと一定の容量を超えたら課金されるようです。 cronが容量を超えるような処理をしてなくてよかった。 (超えても利用ができなくなるだけで、ユーザーの判断を待ってから課金されるようです。 huluのように無料期間終了後、課金が勝手に始まって驚くことはなさそうです。)
2013/04/19
データサイエンティストを目指す
データサイエンティストについて
データサイエンティストのイメージ
企業に所属してのデータサイエンティストのイメージは、 マーケティング知識を有しているITエンジニアだろうか。 マーケティング知識による予測を大量のデータで、 裏づけをとるといったことを生業にし、 経営判断の指標を作る人だとおもう。
データサイエンティストの素養
ビックデータを駆使し、データマイニングすることができ、 また、そのデータを活かすための統計指標の知識が必要であり、 その作業が苦にならない人だと思おう。 データベースや大量のログを扱うITエンジニアには その素養があるだろう。
データサイエンティストに必要なスキル
サーバの知識、Hadoopの知識、データベースの知識、 そういったデータをさばくためにプログラミングの知識は必要だろう。 どのようなプログラミング言語でもよさそうだが、 R言語やpythonが向いているようである。 (R言語は統計用の言語のようだし、pythonには統計ライブラリがあるらしい。)
データサイエンティストのメリット
- 企業内でシステム開発以外で、エンジニアリング力が活かせる。
- 企業の利益に直接的に貢献することが可能である。
- データ解析力は、自分の副業としても活かすことができる。
データサイエンティストとして
これからデータサイエンティストとしてやっていくと決めた上で、 現状足りないと思われる能力。
- マーケティング知識
- ビックデータの知識
- 統計学の知識
2013/04/18
websocket javascript オンラインゲーム
node.js
【1】node.jsでの仮想通信
【期待】node.jsで複数のサーバを同時に起動し、仮想的にクライアントサーバ環境を作る。
- クライアントサーバ環境での通信のテスト環境を作る。
- これまでのサーバ間でのやり取りを実際に行うまで結果が出ることが無い非効率な状況を改善できる。
- 擬似環境で何度もテストすることで、オペレーションミスの減少、バグの早期発見につながる。
- また、1テストの消化時間が早くなれば、多くのテストを実施できるようになり、システムの品質向上につながる。
これまでの経緯
同じ環境を作るには、apache, tomcat, weblogicのようなサーバアプリをインストールする。
- 複数サーバを立てるにしてもポート解放などが面倒である。
- コンパイルされていて内部がなかなか見れることはない。
- 複数サーバを立てることでマシンに高負荷がかかり、他の作業ができなくなる。
- 結局は実サーバ(別PC)を使うことになる。
【2】node.jsでのwebsoket
従来のチャットアプリケーションを構築する場合 1. Aが投稿(messageをDBに保存) 2. Bが閲覧(messageDBを検索)
※この時Bがリロードせずに最新メッセージを取得するには、定期的(10秒間隔等)にDBを検索し、最新messageが投稿されていないかを確認する。(ポーリング)
※ポーリングには送信側が送信データを持っていても受信側から問い合わせがあるまで待機となるため、タイムラグが発生する。
- ロングポーリング
- XMLHttpRequest
新しいチャットアプリケーション
- Aが投稿(messageを複数に送信し、履歴用にDBに登録)
Bが閲覧(messageを受信)
※この時BはDBの応答を待たずにmessageを受信することになり、高速である。 ※違いはポーリングでやってることを、コネクション貼りっぱなしにしてメッセージを投稿されたタイミングで全てのコネクションにメッセージ送信できる点です。
※ 従来:コネクション接続→メッセージ取得→コネクション切断を繰り返し 現在:コネクション接続→メッセージ取得→待機 を繰り返し
node.jsの凄いところ - サーバからクライアントに対してプッシュができる。 - 専用のプロトコルでコネクションを維持し続けれる。
2013/04/17
websocket javascript
2013/04/16
Jenkins 導入事例
2013/04/15
機械学習ライブラリ Mahout Hadoop
機械学習におけるHadoopの利用
従来のデータ処理
- WEBサーバで収集したデータをDBへ集積
- DBのデータを元に分析サーバ上でプログラムが解析処理
- 分析結果を保持
- クライアントへ表示
高速化、機械学習、データ精度を加味した処理
- WEBサーバで集積したデータをクラウドストレージのKVSへ集積
- 解析、分析プログラムをHADOOPで分散処理
- 分析結果をクラウドストレージで保持
- WEBサーバでクラウドのKVSから結果を取得
- クライアントへ表示
ビッグデータになった場合、従来のRDBSでは処理完了までの時間が長くかかってしまう。
分散処理をしない場合
昨今のCPUの進化により処理速度は速くなっているが、 結局、RDBSのI/Oで時間がかかってしまうため、 従来のRDBSではCPUの処理性能を十分に発揮できない。
HADOOPなら
複数台のマシンに処理を分散させることができるため、 I/Oの時間のボトルネックは解消される。。。とのことだが、 正直どういうことかがまだわからない。。。
2013/04/14
機械学習ライブラリ Mahout
課題を解決するプログラムを開発するのではなく、解決するための方法を学習するプログラムを開発する。
機械学習が利用できるケース
- Recomendation
- ニュースのグループ化
- スパムメールの判別
Hadoopとの関連
- データが多くなると精度が高まる
- データが多くなると処理速度が遅くなる
新しい案件をスクラッチ開発する機会は減っている。 勝手に生成される機械学習に注目が集まっている。
次なる難問は,すべての商品の組み合わせに対してこうした判断を行う必要があるということです。 商品が1万点あれば,組み合わせは約5,000万通りにもなります。10万点あれば,約50億通り。 一緒に売れたことのある組み合わせのみ考えたとしても,膨大な件数になるでしょう。 サービスとして実現するには,これらを「現実的な時間で計算」できなければなりません。 機械学習はこれらを,具体的には以下のような問題を解決します。
- 一つ一つは人間には簡単。コンピュータには難しい
- 複雑すぎて,隠された規則性を見出せない
- データが多すぎて,処理が終わらない
中でも線形代数(行列)と解析(微積分) は必須です。 数学:物理を学び楽しむために
モデル
機械学習でもっとも重要なことは,「解決したい問題を数値化する方法」です。 これを「モデル」と言います。 「モデル」があって初めてコンピュータが問題を解く(判断する)ことができる状態になります。 そして,問題を解く精度や性能は,この「モデル」の良し悪しで大部分決まってしまいます。
2013/04/13
rsyncについて
rsyncについて
rsyncは、ネットワーク経由のコピーも可能なファイル・ディレクトリ同期ツールで、 コマンドひとつでディレクトリツリーを一気に転送できるほか、 差分のみの転送やコピー対象の条件指定といった多彩な機能を搭載しています。
特徴
- 特別な設定や管理情報などが必要なく、手軽に使える。
- SSHを利用することでセキュアなファイル転送を実現する。
- 転送条件などをきめ細かく指定できる。
- コマンドラインツールなので、自動化・バッチ処理にも最適。
- デーモンとして起動することで、匿名アクセスにも対応可能。
- Linux、Cygwinでも標準搭載されている。
- パーミッション変更のオプションがある。
他の同期手段との比較
[FTPのデメリット]
- 通信が暗号化されない。
- ファイル内容が平分でネットワークを流れる。(セキュリティ面で最悪)
- HTMLはどうせ公開するのでOKだが、PHP等プログラムコードや、configはダメ
[SCP]
- 転送中のデータが暗号化され、FTPよりセキュア
- OpenSSHがインストールされている必要がある(Linuxには標準で入っている)
[SVN]
[rsync]
- SSHリモートシェル経由で通信可能なためFTPよりセキュア
scpとrsyncの違い
scpは転送先サーバに同名ファイルがあると そのファイルをopenして転送開始する。 そのため、 転送最中にファイルを参照すると 中途半端な内容を読込んでしまう危険性がある。 また転送が途中で中断されても 転送先のファイル内容は戻らないようだ。 これはつまり、 scpで転送途中にCtrl + Cなどで中断すると 転送先のファイルが破損する可能性があることを意味する。
rsyncは、ファイル転送時は一時ファイルに対してデータを書き出し、 転送が完了してからmvするため、上記のような心配はない。
rsyncはファイルの保全性を確保できるという点ではscpより優れている。
- ファイルのチェックサムを比較して異なる箇所のみ送信
- そのためファイルの差分のみを転送し、ネットワークに対する負荷も少ない。
- ファイルのサイズや更新日付を参照
- そのため更新されているファイルのみを転送するので非常に効率がよい。
[rsync注意点]
rsyncは送信元ディレクトリの最後に/(スラッシュ)を付けるかどうかで転送の挙動が変わる。
rsync /home/sample/ server1:/home/
rsync /home/sample server1:/home/
ほとんど同じようだが、上段のrsyncではserver1の/home/の中に/home/sample/ 配下のファイルを転送する。つまり/home/sampleというディレクトリは作成しない。 しかし、下段の方は/home/sampleというディレクトリを作ってその中にファイルを転送する。
rsyncには-nオプションを指定すると、転送されるファイルを事前に確認できる。 転送前に-nオプションで確認する癖をつけるとコマンドに間違いがあっても事前に気づける。 また-excludeオプションで転送しないファイルを意図的に指定することができる。 転送に無駄なファイルや転送してはまずいファイルなどはこのオプションで除外できる。
いまやrsyncの情報は豊富にあるが、定番であろうオプションを以下に纏めておく。
- -r: ディレクトリを再起的に処理する
- -l: シンボリックリングをシンボリックリングとしてコピーする
- -p: パーミッションを維持する
- -t: タイムスタンプを維持する
- -g: グループを維持する
- -o: オーナーを維持する
- -v: 転送状況を詳細表示する
2013/04/12
screenコマンド
screen, script, コマンド
目的
- 作業効率を常に改善する→定期的に見直すことで思いこみや無知による作業ミスや非効率なやり方をなくしていく
なぜ必要か
- 同じ作業の時間短縮や、効率UPを図るため
ディレクトリスタック機能
cd のように単に移動するだけでなく、前のdirをスタックに積む
- pushd
- pushd +2
- popd
- pushd
複数のdir間を移動
- よく使うものにaliasを貼る
scriptコマンド
作業記録
$script /tmp/script.log
$exit(終了)
$script -t
$scriptreplay(再現)
rlwrap:history
lv:text viewer
+more (後方スクロール×、改良→Ctrl+B) +less +jless +lvはlessのパッチではなく、オリジナル
これらを見直してみる。
awk
→grep, cntと違うところはawkは独立したスクリプト言語 →コマンドではなく、awkスクリプト・インタプリタである。 →シンプルなので、perlより習得難易度が低い上に同程度に高度な処理も可能である。 $ awk '{print}' ./phperror.log == $ awk '{print $0}' ./phperror.log $ awk '{print $1}' ./phperror.log $ awk '{print "test"}' ./phperror.log $ awk -F":" '{print $1}' ./phperror.log (区切り) $ awk -F"] " '{print "sqllog\t:\t" $2}' ./phperror.log | less
sed
$ ls -lrt | sed -e 's/[a-z]$/X/' $ awk -F"] " '{print "sqllog\t:\t" $2}' ./php_error.log | sed -e 's/SELECT/TEST/' | less
2013/04/11
ソーシャルコーディング
ソーシャルコーディングとは
- ソースを誰もが変更する権利を得て、
- 誰もが自由にソースを変更
- これまでのソフトウェア開発と一線を画し、限られた開発者以外でもソースをいじれる
- ソフトウェア開発のスピード感がUPされる
- ソースコード改変の民主化
職業プログラマこそソーシャルコーディングすべき
人材の流動性が高まっているため、職業プログラマがこれまでに作ったものを把握し、 最新情報の取得、多様な文化の取得のためにソーシャルコーディングは注目されている。
採用担当者視点からどちらがほしいプログラマか? - 今までに書いてきたコードを閲覧できるorできない。 - 最新のソフトウェアに精通しているorしていない。 - 多言語や異なるソフトウェアの多様な文化を理解しているorしていない。 後者にならないために、ソーシャルコーディングは必要。
世界を閉ざさず、多種多様な文化を見る
会社という閉ざされた世界の中でプログラミングをしていたのでは、 いつの間にか扱っている技術が陳腐化していることもありえる。 世界中で使われて、日々変更されるコード、設計、文化に目を向け、 よければ採用する眼力が必要。
コードを書けるプログラマが求められている
- facebookのプロフィールのように自分が書いたソースをポートフォリオとすることができる。
- 自分がどれほどのコードを書いたかを面接時に提出することができる。
- 人間性を見るため意外に、ソースでどのレベルのプログラマかをアピールできる。
GitHubとは
集中型と分散型
Subversion=集中型 M 管理がシンプル D サーバに接続できない状態だと最新ソースコードが取得できない(svnサーバがダウンしたら終わり)
Git=分散型 M 複数リポジトリで管理できることになる D 管理ルールを明確に決めないと、管理が面倒になっていきやすい
※分散型で集中型のような管理もできる。
GitHubのメリット
これまでのGit歩スティングサービスでは、人にフォーカスできなかった。 Git+SNSのようなもので、有名なスーパーハッカーや、 有名企業のPGとも接点を持てる、または、その人の興味に触れることができる。
GitHub機能
- Gitリポジトリ
- organaization(企業用)
- Issue(バグトラッキング機能)
- Wiki
- Pull Request(変更を相手に取り込んでもらう機能)
2013/04/10
レプリケーション
ただし、変更分が大きくなると同期が完了するのに時間がかかる可能性がある。
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@10.0.0.2 IDENTIFIED BY 'password';
(Master側で) mysql> FLUSH TABLES WITH READ LOCK;
(Master側で) mysql> SHOW MASTER STATUS; +-----------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-----------------+----------+--------------+------------------+ | tank-bin.000001 | 79 | | | +-----------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
(Master側で) # cd /var/lib/mysql/ <== MySQLのデータディレクトリへ移動 # tar cvf ~/friendDB.tar friendDB <== データベースをバックアップ
(Master側で) mysql> UNLOCK TABLES;
(Slave側で)
# cd /var/lib/mysql/
# tar xvf ~tomita/friendDB.tar
パーミッションを確認しておくこと。
[mysqld] server-id=2 <== 識別用ID。任意の値。他のサーバーと重複しないようにする。
(Slave側で) mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.1', <== Masterのホスト名/IPアドレス MASTER_USER='repl', <== Master接続に使用するユーザー名 MASTER_PASSWORD='password', <== パスワード MASTER_LOG_FILE='tank-bin.000001', <==2.3で確認したFile MASTER_LOG_POS=79; <== 2.3 で確認したPosition
(Slave側で) mysql> START SLAVE;
060612 15:36:17 [ERROR] Slave I/O thread exiting, read up to log 'tank-bin.000001', position 79
2013/04/09
Node.js
Node.js
node.jsとは
Node.jsとは、グーグルが開発したV8エンジン上で実行する環境であり、 従来のjavascriptをサーバサイドでも使用することができる。 従来のjavascriptはWebブラウザで画面を動的に見せるなどリッチクライアントでの利用が主流だった。 しかし、さまざまなライブラリの登場により、サーバサイドで利用することができるようになり、活躍の場を広げた。
node.jsの効果
- クライアントサイドと同じ言語で開発ができ、開発効率が上がる。
- 実装が簡単
- イベントループを採用している。
会社の成長のためにどう活かすか
- 現在の会社の状況
- サーバリソースが限られている。
- 開発要員が限られている。
- サイトをシンプルにしないといけない。
- 機能を損なわずシンプルにする。
- 現在の会社の状況
2013/04/08
Android プログラミング
Android プログラミング
道のり測定アプリについて
- yahoo Opne Local Platform (YOLP)との連携
- スマートフォンアプリとして位置情報を取り入れたサービスは外せない
- どんな人も大なり小なり日常で最も使う情報だから
Mapと事業について思ったこと
- どこに何があるかを知ることで親近感が沸く
- 周辺があらかじめわかることで、来客数も変わるだろう
- 周辺の店の協力関係も得られるかもしれない
- もしマップに掲載されると、所属意識も沸くかもしれない
- 次なるサービスのプラットフォームになるかもしれない
- マップからSNSでのコミュニケーション連携
- 映像情報の方が毎日利用しようという気が起きる
- キャラビジネスに
- 情報集約
2013/04/07
リーンスタートアップ
リーンスタートアップという考え方
- リーンスタートアップとは
自身の体験をもとに成功するサービスを作り上げるためのプロセスをまとめた手法
リーンスタートアップの特徴
失敗することを前提に、失敗後いかに早く成功に辿り着くかをまとめたもの
リーンスタートアップの実施方法
- 仮説の設定
- 仮説の検証
- 方向転換(ピボット)
- リーンスタートアップとは
共感する点
- なぜ共感するか?
早期のサービス立ち上げは無駄な開発を防ぐために必要である。 誰にも使われないサービスを長時間作り続けることはむなしい。
同じ問題から発生した考え方
- ユーザはなかなか集まらない
- 一度は利用してくれるが2、3度利用したら離脱してしまう。
- 収益が想定したよりも上がらない。
共感する事例
DropBoxで取られた手法 →GoogleAdwordsを展開したが、集まらず →サービスの市場が存在しない時期からの宣伝は無意味との検証を得た →Digg,Redditなどでサービス説明の動画を流した →ユーザー増加
- なぜ共感するか?
得られたもの(開発に活かせると思った点)
(仮説)価値仮説シートと、成長仮説シート
[価値仮説シート]
(ユーザー)___は、(欲求)____たいが、(課題)___なので、(製品の特徴)___に価値がある。 レシピを探すユーザーは、今日のメニューを早く決めたいが、多くのレシピから決められないので、人気レシピが探せる検索機能に価値がある。
[成長仮説シート]
(ユーザー)___は、(きっかけ)____することで、(需要の発生)___するようになる。 (ユーザー)レシピを探すユーザーは、毎日のレシピ選び時間が短縮されることで、人気検索を使い続けるようになる。
(検証)実際に開発する前に検証
アナログなツールによってユーザーの反応を見る
ピボットによる方向転換
ピボットの方向転換は、検証結果による仮説の再構築です。 これによりユーザーのニーズに対する最適なサービスにたどり着ける。
得られたものを取り入れるための行動改善
構築、測定、学習を繰り返す。 仮説立案と検証サイクルを明確にし、いかにすばやくそのサイクルを回すか
2013/04/06
Markdown記法を使ってBloggerへ記事を投稿してみる
Markdown記法を使ってBloggerへ記事を投稿してみる
経緯 記事を書くときいちいちHTMLの表示を気にするのが面倒になったから。
方法
オンラインツールを使う。
Dillinger color themaやgithubからの読み込みもあり便利だが、 保存先がlocalかDropboxとなっている。 Evernoteか直接Bloggerへ保存できるとありがたいのだが。
コピペでHTMLを得たい場合
Online markdown editor 即座にHTML previewができるため、コピペでbloggerに貼り付けれる。
Dillingerで作ったmarkdown sourceだけ保存しておき、 online markdown editorで変換しHTMLは即座にbloggerに投稿する。 ゆくゆくはEvernoteかBloggerだけで完結したい。
自動でWEBブラウザテストを実行してみる!(selenium + eclipse + java)
1.eclipseの準備 2.selenium IDE(katalon recoder by firefox)で動作記録する。 3.javaファイルにエクスポートする。 4.eclipseで実行
-
1.eclipseの準備 2.selenium IDE(katalon recoder by firefox)で動作記録する。 3.javaファイルにエクスポートする。 4.eclipseで実行