2012/12/13

[win] .svnディレクトリを再帰的に 一括削除

コマンドプロンプトで、作業ディレクトリに移動して下記コマンドを実行

for /R %i in (.svn) do rd /Q /S "%i"






2012/12/08

[Rails] 現在時刻・1分前の時刻・1分後の時刻


railsコンソールで確認。(鯖はUTC)

1.9.1 :053 > now=Time.zone.now; ago=Time.zone.now.ago(60); after=1.minutes.from_now;
1.9.1 :054 >   now.to_s + '  |  ' + ago.to_s + ' | ' + after.to_s
 => "2012-12-08 16:09:41  |  2012-12-08 16:08:41 | 2012-12-08 16:10:41"

同じように書けないの・・・・?うーん

2012/12/05

[Rails] 日付データの取り扱い:DB保存のタイムゾーンと、表示時のタイムゾーンを別にしたい時

DB保存はUTCで、画面表示時はそれぞれのタイムゾーンで(例えばJSTで)とか

Rails3 だと config/application.rb で 保存するタイムゾーンと 画面表示時に使うタイムゾーンを分けて設定できる

↓保存時のタイムゾーン

config.active_record.default_timezone = :local
※設定しない場合は default='utc'


↓表示時のタイムゾーン


config.time_zone = 'Tokyo' 
※Controllerで ユーザのタイムゾーンを↑切り替えれば 指定のタイムゾーンで表示される(はず)



ただし、↑この便利な設定の恩恵にあずかるには、保存する 日付フィールドを ただのTimeで保存してはダメ
ActiveSupport::TimeWithZoneクラスにする必要がある


start_at = Time.parse("入力された日付")
↑とかだと Timeクラスになっってしまう(コンソールとかで確認できる)


start_at = Time.zone.parse("入力された日付")
↑常に Time.zone を使うようにしないとダメ



参考)
Rails3系のtimezoneの扱いに関するメモ #Rails - Qiita http://qiita.com/items/68341489a9c5149b815d

[Rials3]Rails3 + ActiveRecord で正しくtimezoneを設定する - Future Journal ~未来志向で行こう~ http://d.hatena.ne.jp/twodollarz/20120703
















[Advent Calendar][2012] あとで見返すための 2012 Advent Calendarをまとめて貼っておく

毎年 Advent Calendarは 眺めてるだけでも楽しいのね
ということで、今年のめも
(あれ?今年のMySQLのはないの?ないの?)


Advent Calendar 2012まとめ - NAVER まとめ http://matome.naver.jp/odai/2135217818800380701

Advent Calendar一覧 http://qiita.com/advent-calendar

●以下 個人的めも

PHP Advent Calendar jp 2012 : ATND http://atnd.org/events/34462

CakePHP Advent Calendar 2012 http://www.adventar.org/calendars/40

FuelPHP Advent Calendar 2012 : ATND http://atnd.org/events/33753

Ruby on Rails Advent Calendar 2012 / Sep. - Qiita http://qiita.com/advent-calendar/2012/ruby-on-rails

Ruby Advent Calendar 2012 - Qiita http://qiita.com/advent-calendar/2012/ruby

Vim Advent Calendar 2012 : ATND http://atnd.org/events/33746


軽めのjQuery Advent Calendar 2012 http://www.adventar.org/calendars/29

あまり知られていないけど役に立つJavascript tips Advent Calendar 2012 - Qiita http://qiita.com/advent-calendar/2012/javascript-mechanco-tips

2012/12/03

[Rails] 便利なメソッド

・try()

nilでないときだけメソッドを実行

<%= user.updated_at.try(:strftime,'%Y/%m/%d') %>


・_was

<attr>_was <attr>の変更前の値。変更されてなかったら元の値。

<% if user.updated_at_was.present? %>
 <%= user.updated_at.try(:strftime,'%Y/%m/%d') %>
<% end %>

2012/12/01

[Mac][MBA(Lion)] Macで誤ってrmしてしまったファイルを復旧・・・してみた

いらないと思って消したディレクトリが実は必要だった・・。
ので 復活を試みる

PhotoRecを試してみる
PhotoRec - CGSecurity http://www.cgsecurity.org/wiki/PhotoRec


↓DLページヘ

↓何も考えずに6.14をDLしてしまったけど、あとでよく見たらこっちはβだった・・。

・・・まぁ、とりあえずこれで。
↓解凍ディレクトリ内の「photorec」をダブルクリックで実行するとターミナルが開く

下段に現れている [ sudo ] にカーソルを矢印キー(◀▶)であわせてEnter
sudoで実行する

/dev/disk0 を選択してEnter


↓よくわからないけど、Mac HFSを選択

↓Otherを選んで、

.txtのみ発掘したいので、ファイルオプションで「txt」を指定して検索スタート

ホームディレクトリ配下に「recup_dir.N〜」のディレクトリがどばーーーーっとできる
どんだけできるんですかー

まあ 気長に 失ったファイルの ソースコードを思い出しながら findをかけながら、気長に待つ

grep -r -n "## mod ####################" recup_dir.1*

とかね

気がついたら 検索終わってた

252,314filesだと・・・・・?

サルベージされたファイルは、f29327448.txt みたいな ファイル名にされて
かつ、バラバラに細切れにされているみたい・・・

findでひっかかったファイルを確認したら、コードが途中で切れてた・・・

あとは気長にサルベージしていくだけ・・・orz


参考)
つわものぶろぐ: Macで使えるリカバリーソフトの"PhotoRec"を試してみた http://tsuwamono.blogspot.jp/2012/09/macphotorec.html

2012/11/24

[jQuery] 要素に対して、1つ置きにスタイルを変えたい



以下のようなHTMLがあったとして
<div id="Hoge">
    <label>あああ</label>
    <label>いいい</label>
    <label>ううう</label>
    <label>えええ</label>
    <label>おおお</label>
</div>

1つ置きに styleを変更したいときは「:odd」、「:even」で指定する
でも、最後の要素だけは 何も指定したくないって時は、「:not(selector)」を使う


<script type="text/javascript">
$(document).ready(function() {
$("#Hoge label:even:not(:last)").css({"width": "135px", "display": "block", "float": "left"});
});
</script>


参考)
jQuery で奇数番目・偶数番目を指定するときの注意点。 | btmup Blog

:not(selector) - jQuery 日本語リファレンス


[CakePHP] Controllerで モデルを指定するとき

・Controller共通で定義
var $uses=array('ModelA', 'ModelB');
・メソッド(Action)ごとに定義
loadModel(string $modelClass, mixed $id)

$this->loadModel('ModelA');
$this->loadModel('ModelB');

※単純に モデルを呼びたい時は loadModel() を使うようにする
※Controller以外では ClassRegistry::init('ModelA') も使える
App::import()は モデルに限らず 指定のソースを読み込みたい時に使うものなので、安易に使わないように。


参考)

App::import と ClassRegistry::init の違い | 1000g
http://1000g.5qk.jp/2011/07/05/appimport-%E3%81%A8-classregistryinit-%E3%81%AE%E9%81%95%E3%81%84/


Modelを2個以上読み込む場合は、$usesを使わない方がスピードアップする - cakephperの日記(CakePHP, MongoDB)

App::import() は凄い - 24時間CakePHP
http://d.hatena.ne.jp/hiromi2424/20101215/1292379625

2012/11/12

[Chrome][youtube] Youtubeで日本からの接続では、閲覧制限されている動画を見る

youtubeでアーティストのPV等を見ようとすると
「お住まいの国では公開されていません」
ってなって 見ることができない動画があるときは

フリーのプロ串をさせば 閲覧できる

Chromeのextensionで串の切り替えが簡単な「GeoProxy」が最近はお気に入り

Chrome ウェブストア - GeoProxy https://chrome.google.com/webstore/detail/geoproxy/pooljnboifbodgifngpppfklhifechoe

ただし 接続や、読み込みに時間はかかる
早そうな国を見つけてつなげればいいのかな

2012/11/09

[OpenSSH] chroot 機能

★OpenSSH 4.9 以降〜 正式サポート

chrootとは、UNIXオペレーティングシステムにおいて、現在のプロセスとその子プロセス群に対してルートディレクトリを変更する操作である。ルートディレクトリを別のディレクトリに変更されたプロセスは、その範囲外のファイルにはアクセスできなくなるため、この操作をchroot監獄などとも呼ぶ。

2012/11/08

[Mac][Homebrew] MacでPutty用の秘密鍵・公開鍵を変換する

Homebrewでputtygenをインストール

・秘密鍵を変換
$ brew install putty
$ puttygen id_rsa.ppk -O private-openssh -o id_rsa

・公開鍵を変換(こっちは puttygen使わないのか・・・ふむ)
$ ssh-keygen -i -f id_rsa_putty.pub > id_rsa.pub

参考)
MacでPutty形式の秘密鍵を変換する - ZeBeVogue別館 http://d.hatena.ne.jp/zebevogue/20111208/1323282172

ssh-keygen -i -f id_rsa_putty.pub > id_rsa.pub http://www.onemanlab.jp/?p=573

2012/10/24

[Ruby][Rails3] クラスのインスタンスメソッドとスタティックメソッド

rubyでは スタティックなメソッドを クラスメソッドと呼ぶそうだ

参考)
クラスのメソッド - satake7’s memo http://d.hatena.ne.jp/satake7/20090124/p1


その他、参考になりそうなもの)
class_attribute:
class_inheritable_accessorからclass_attributeに移行する際の注意点 - odeの開発メモ日記 http://d.hatena.ne.jp/ode/20110928/1317188311

2012/10/17

[Vim] 正規表現で置換


・get_fieldnameをget(:fieldname, @xxx)に置換する
:%s/.get_\([a-z]\+\)\([^a-z]\?\)/.get(:\1, @xxx)\2/cg

2012/10/16

[Rails3] コントローラー名・Model名とか 複数形とか単数形とか

・Controller名
view内
<%= controller.controller_name %>

Controller内
ctrlname = controller_name  # コントローラ名

・Model名
<%= controller.model_name %>

・action名
<%= controller.action_name %>

・Controller名を単数形にしたい(.singularize)
controller.controller_name.singularize

・複数形  .pluralize

参考)
Rails3 事始め: [Rails3] Viewでコントローラ名/アクション名を取得する http://rails3try.blogspot.jp/2011/06/rails3-viewcontrolleraction.html

Ruby On Rails | くるくるtech http://kurukuru-labo.com/tech/category/ruby-on-rails/

2012/10/09

[jQuery] IDやclassがクリックされた時とかのイベントを拾うやつ


以下のID=hogeの中の アンカー(a)がクリックされた時のイベントを拾うとき


<div id="hoge">
<a href="" onclick="return false;">追加ボタン</a>
</div>

// ページ表示時
$(document).ready(function() {
    // リンククリック
    $("#hoge a").click(function(){
      fugafuga();
    });
});



動的に作られるエレメントに関しては、live()という便利な関数があるらしい

参考)
「午前様」の日記: [jQuery] live()が激しく便利な件について http://londonhyt.blogspot.jp/2009/05/jquery-live.html

2012/09/18

[Rails3] before_validationとかの中で ARオブジェクトのカラムごとの値を確認する

入力フォームの中に チェックボックスとかあって、
チェックされれば 送信されてくるし、
されなければ 値は渡って来なかったりするときの
値が存在するかー?の確認

if read_attribute('delete_flg').present?

'delete_flg'は formのnameの部分(カラム名的な)

↓こんなな
<input type="checkbox" name="delete_flg" value="1">

write_attributeとかもあるらしい

参考)
ActiveRecordまとめ2 - ほむり http://d.hatena.ne.jp/jksy/20100512/1273658658
respond_to http://d.hatena.ne.jp/rochefort/20110508/p1


2012/09/13

[Vim] 複数行 いっぺんに コメントアウトとか


  1. Ctl+v 矩形ビジュアルモードで 行頭を複数選択
  2. 大文字I(Shift+i)で インサートモード ・・・通常編集時は小文字i
  3. 「#」を入力 ・・・このとき1行だけ 入力される
  4. 入力したら Escキーを押して インサートモード抜ける
  5. 矩形で選択した部分に反映される


この方法で 一気にインデントとかできる

[Vim] 画面分割

:sp 水平分割

Ctl+w ウィンドウを移動 次へ次へ

:on カレントウィンドウ以外 すべて閉じる

:con カレントウィンドウを閉じる


参考)
nakamura-tech : Vim - 画面分割 http://blog.livedoor.jp/nakamura_tech/archives/51334281.html

[jQuery] $.inArray(str value, array)

jQuery.inArray(value, array)

version 1.2 以降

指定された値を検索し、配列内でのインデックス番号を返します。
値が配列に存在しない場合は、-1 を返します。

引数

  • value : 検索する値
  • array : 配列

戻り値

  • インデックス番号(0から始まる)。検索する値が配列に存在しない場合は、-1。

参考) jQuery.inArray(value, array) - jQuery API 1.4.4 日本語リファレンス - StackTrace http://stacktrace.jp/jquery/api/utilities/jquery.inarray.html




コンソールでデバッグしても 値はちゃんと取れてて、配列にも存在するのに
ヒットしない(-1が返る)現象で悩まされてた

typeofで型を見たら valueもarrayもobjectだった

試しに valueを ""+ で stringに変換したらちゃんとヒットした
valueはstringにしないとだめっぽい?


参考) JavaScriptの型変換ってこうやるんだ・・・ | IDEA*IDEA http://www.ideaxidea.com/archives/2010/03/javascript_type_conversion.html

2012/09/12

[Ruby] 差集合:配列Aから配列Bを取り除く

配列A・・・default_lang から
配列B・・・select_lang を取り除いて、差集合を求める

default_lang = ["ja_JP", "en_US", "zh_CN"]
select_lang = ["ja_JP"]

unselect_lang = default_lang - select_lang  #=>["en_US", "zh_CN"]

2012/09/08

MongoDBでfindデータを見やすく

超絶便利だったのでメモ

↓こちらのdot.mongorc.jsをDL
MongoDB シェルの printjson() を使いやすくする - 文::字 - はてな自習室 http://studyroom.g.hatena.ne.jp/tily/20111007/1317998494

★通りすがりさんの言うように 27行目の[]が閉じ忘れてるので 自分で修正して

↓こんな風にmongoコマンド(コマンドは.bashrcとかで aliasにいれました)
$ mongo dot.mongorc.js --shell

↓データよぶとき
> db.users.find({'_id':ObjectId('5049e42ea4b6ad06ec000034')}).p()
> db.users.find().limit(1).p()

↓フィールド指定もできるから べんり

> db.users.find().p('name','mail')

{ "name" : "test user", "mail" : "(undefined)" }
{ "name" : "hogehoge", "mail" : "hogehoge@hoge.com" }



素敵すぎる

2012/09/07

Eclipse ワークスペースランチャーから不要なワークスペースを削除


Eclipse起動時の ワークスペースランチャーから
不要になったワークスペースを削除する



Eclipseインストールディレクトリ配下の設定ファイルを直接編集する
わたしの MBAは↓ここにあります

$ ll /Applications/eclipse/configuration/.settings/
total 32
-rw-r--r--  1 hoge  staff  104  3 24 21:03 com.aptana.db.prefs
-rw-r--r--  1 hoge  staff  139  3 24 21:03 com.aptana.usage.prefs
-rw-r--r--  1 hoge  staff  146  8 25 14:25 org.eclipse.core.net.prefs
-rw-r--r--  1 hoge  staff  368  9  7 00:07 org.eclipse.ui.ide.prefs


「%Eclipseのルートフォルダ%/configuration/.settings」配下に、
「org.eclipse.ui.ide.prefs」というファイルが存在します。
ファイルの中身を確認すると以下のような設定が記載されています。
「RECENT_WORKSPACES=D\:\\eclipse\\3.6.1\\workspace\nD\:\\eclipse\\3.6.1\\workspace2」
「RECENT_WORKSPACES」に、ワークスペースのフォルダのパスが記載されています。
この中から、不要なワークスペースのパスを削除すればOKです。
ちなみに、\nが区切り文字となっています。

参考)
Eclipseの小技(不要なワークスペースをワークスペース・ランチャーの一覧から削除する方法) | システム開発ブログ(システム開発のアイロベックス|東京都新宿区の業務システム開発会社) http://www.ilovex.co.jp/blog/system/projectandsystemdevelopment/eclipse-1.html

2012/08/05

LL Decade 2012 覚書

今年も Lightweight Languageイベントへ行って参りました
(LLの詳細は 公式で)

去年のPlanetも相当面白かったのですが
今年は 10周年の記念の年だそうで
LL界隈では著名な方とか?ゆかりの方とか?LLの歴史を振り返る的な?
ちょうど自分の開発歴も10年ちょいなので、それともあわせてなかなか楽しめそうな内容で期待大ですぞ

んがしかし、なんせ文章能力低いワタクシなので
技術的な詳細な話とかは、もっとぐっとわかりやすくまとめてくださる方がきっといらっさると思うので、そちらにお任せするとして
講演で印象に残ったこととか、自分的メモがわりに記しておきます

◆基調講演
宮川さん Perlの人

サンフランシスコは夏でも20℃くらいしかないってほんとー?いいなぁ
10年前に比べて 良いコードに触れる機会が増えた
どんどん Github とか 触るべき
Plack/PSGIのはなし

Pythonやら Rubyからだいぶ いいとこ取りさせてもらってる
- 今すぐやることが大切だけど
焦って始めて なにかやらかすより ちょっと待ってからはじめるのもイイ
みたいな言葉が良かったw
言語を超えて 影響しあうのっていいね(PHPが出てこないけどー・・・)

名前をつけるのって大変
Perl名前がカオスなの多い
Python → はじめにpyがつくとか さいごにつくとか
Rubyは 名前見ても何するものなのかわからいもの多し カオス


↓今年も受付で うちわ頂いた
あと、会場のパス(お昼は外に食べに行くので)



◆Language Update Decade
【出演】
Perl:小飼弾
PHP:廣川類
Python:柴田淳(ウェブコア)
Ruby:まつもとゆきひろ
【司会】
法林浩之(日本UNIXユーザ会)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Pythonの柴田さんの おはなしがおもしろい!w
2008年頃のPython・・・珍獣扱い(知ってる人がまだ少なかった)
Zope・・懐かしいな
Pythonもやらないと・・・

ノンプログラマーに パイソンが広まった ・・・シンプルさ
最近のPythonは 研究機関とかで使われてる(金融とか 気象とか)

Pythonベースサービス
Instagram/Pinterest/youtube/Dropbox

パイソンの2から3への移行タイミングは?? →そろそろいいと思うよ
これから3を覚えれば あと10年はこれで飯食っていけるよ

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Ruby まつもとさん 超早口なんだなぁ・・・
Ruby20周年 来年 2013 2月に 2.0でます!

2.0は 多言語の痛い目にあってるさまをみならって、 あんまし変なことはしないように
互換性を重視して出します!(的なことをおっしゃってたような・・)
・・・キーワード引数とか、ライブラリGem化・・・いろいろ 性能上がるはず



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
午後の部

◇プログラミング言語処理系を自作してわかったこと

ココらへんのセッションから どんどこコアなお話になってゆきます


・「next Perl5プログラミング言語Toraの設計と実装」@tokuhirom
perl触ってて date(日付表示とか)に係る処理がめんどくさ~い ってのは 常に思ってた
myってかくけど べつに変な愛着はないです

・「世界で最も仕様に忠実なECMAScript言語処理系」@Constellation
序盤に足つるハプニング!!Σ
ECMAScriptって なんだろー
JavaScirptにも仕様があるんですよ
コンストなんとかさんおもしろいよー

・「型安全なJavaScript処理系JSXを作ってみた」@kazuho
jsの問題点
遅い
デバッグに時間が掛かる ex)プロパティ名の間違い
読みにくい

以下 JSXのご案内

・「組み込みを意識したmrubyを作ってみた」@yukihiro_matz
組み込み向けに 開発されたRuby
− 組み込みAPI
− 移植性 ・・・コアは超シンプル ほぼ何もない(FileI/O とかもない) 必要なオプションは 環境に応じてextensionで追加していくって設計仕様
− 省メモリ

インクリメンタルGC採用

応用例
太陽光発電管理システム・自動販売機メンテナンスシステム・Ruby対応インテリジェントルーター

将来 rubyでうごく 何かしらの端末がでてきたり?スマホ的な?
(?)フットプリント・・・ってなんすか

そういえば 小飼さんが 壇下の座席からふつーに 大声で松本さんとかに質問(会話)してておもしろかったw




◇俺たちの継続的hogehogeは始まったばかりだ!

・「Pythonプロフェッショナルプログラミング」を執筆する上でのCI的な何か(仮) / cactusman (BeProud.inc、日本Jenkinsユーザ会)
スフィンクスで cronで自動で ドキュメントビルドしてるそうな

・JenkinsableじゃないプロジェクトをJenkinsable にするまで Perl編 / 太田健一郎 (TDD研究会、Androidテスト部)
自動テスト環境を組み込むには・・・・0からはじめるのは大変なのですよ

・ルビコンペレストロイカ(Ruby on rails Continuous integtration Perestroika)~RubyOnRails開発におけるオレオレCI改革~ / 高倉利明 @TrinityT (アピリッツ)

・JSのCIで椅子を投げられないため方法 / @kyo_ago (KAYAC)
jsのテスト興味ある
Test.js
Sinon.js(非同期系 モックツール)
Swarm系のツール(?)

このあたりで・・・・眠気Max( ゚Д゚)ネムヒー

JsTestDriver(簡単 おすすめ)javaでできてる
− ブラウザのマネージメントツールみたいな感じ

・PHPでJenkinsをはじめるための108の方法(仮) / 山城 裕 @yamashiro
StageHandTestRunnerおすすめ
PHPでTDD&CIワークショップ、Jenkins + PHP の各種プラグインパート資料 - Yamashiro0217の日記 http://d.hatena.ne.jp/Yamashiro0217/20110619/1308491991

yamashiroさんの講演でめがさめた!

・継続的コミット-エンジニア的ライフログ- / きょん
ファイル変更を検知して 勝手にビルドしてくれる便利なもの
定期的にコミットしてくれるもの
IDE使うほうが頭いい!
じぇっとぐれーぶ?(正解)→ http://www.jetbrains.com/



◇Lightning Talks
【出演】
ゆーすけべー
角谷信太郎
川崎有亮
庄司嘉織
法林浩之
LLNOCチーム
yuroyoro
ただただし
髙橋征義
竹迫良範

どの方のTLも すばらしく たのしかった!!!!
わたしも 紫色の何かがほしい
LLの中のかたの あんな話も すごく面白かった


◆お楽しみ抽選会!!!!

スタッフの方たちが 壇上から一斉に投げるカラーボールをキャッチできた人が当選
わたしのところに 黄色いボールが降ってきたー!!!
そして 近くに緑のボールが飛んできたので 更にキャッチ!(みーとくんにあげました)


9番の景品は↓WordPressの 本でございました ヤッタ~(いつか使う)
みーとくんにはPerlの本があたりました(会社で使おう)

そんなこんなで、とても楽しい一日なのでしたよー
とにかく このLLイベントは
裏方さんからスタッフみなさんの心意気の感じられる 素敵なイベントだし
イベント後の懇親会も すごく楽しい(らしい)し
なにより 言語の垣根を超えてのお祭りなので
ぜひ LLに携わる(興味のある)若者に どんどこ参加していただきたいのですよ


以下 参考リンク)
LL Decadeのツイート - Togetter http://togetter.com/li/350207
LL decade のプログラミング言語処理系を自作してわかったこと & 俺たちの継続的hogehogeは始まったばかりだ!のまとめ - Togetter http://togetter.com/li/350301
#lldecade に参加したら楽しかった - 941::blog http://blog.kushii.net/archives/1767276.html?utm_source=dlvr.it&utm_medium=twitter


2012/07/25

[MySQL] テンポラリーテーブル&「INSERT ... ON DUPLICATE KEY UPDATE」構文

集計バッチで
MySQLのテンポラリーテーブルと
「INSERT ... ON DUPLICATE KEY UPDATE」構文の合わせ技を使ったので
メモ

まず テンポラリーテーブルを使うにあたって、MySQLのメモリ関係の設定値を確認する
参考) MySQLのメモリ関係のシステム変数 - 祈れ、そして働け ~ Ora et labora http://d.hatena.ne.jp/tetsuyai/20111006/1317873012


メモリ上に作成される テンポラリファイルは max_heap_table_size内まで
超えるとISAMテーブルとしてディスクに書き出されます。

(デフォ)max_heap_table_size グローバル 16MB

それから、今現在のDBのテーブルデータサイズから
テンポラリーテーブルのおよそのデータサイズを出す

参考)データベースとテーブルのサイズを確認する方法 - ふってもハレても
http://d.hatena.ne.jp/sho-yamasaki/20120405/1333640589
DB調べたら
Avg_row_length=151で、200としても
平均4万レコードくらいの データをテンポラリーテーブルにするから

200x4万レコード=800万byte → 7.63MB ・・・もんだいなすっぽ


で、
テンポラリーテーブルを使った 処理について

まず データの出力イメージは
商店Aテーブル、商店Bテーブル があります
それぞれの テーブルから 日付を絞って、商品番号でGroupByした集計を取得して、
それをマージします

↓こんな感じ
┌────┬───┬───┐
│商品番号│商店A │商店B │
├────┼───┼───┤
│   11111│     3│     2│
├────┼───┼───┤
│   11112│     0│     5│
├────┼───┼───┤
│   11113│     2│     0│
└────┴───┴───┘


まず 商店Aテーブルを集計して テンポラリーテーブルに データインサート

CREATE TEMPORARY TABLE `tmp_summary` (
  `商品番号` varchar(10) NOT NULL,
  `商店A購買数` int(11) NOT NULL DEFAULT 0,
  `商店B購買数` int(11) NOT NULL DEFAULT 0,
   PRIMARY KEY (`商品番号`)
)
  SELECT  商品番号 ,count(商品番号) as 商店A購買数, 0 as 商店B購買数
  FROM    商店Aテーブル
  WHERE   del_flg       =  0 
  AND     購買日   >= 'YYYY/MM/DD 00:00:00'
  AND     購買日   <= 'YYYY/MM/DD 23:59:59'
  GROUP BY 商品番号
  ;



SELECT文内の 「0 as 店舗B 購買数」のところは
次に集計する 店舗Bの購買数が入る部分を あらかじめ
0で埋めて先に作っとく的な感じ

次に 商店Bテーブルを集計して
先ほどのテンポラリーテーブル「tmp_summary」に マージしていきます
この時 「INSERT ... ON DUPLICATE KEY UPDATE」構文を使うと
MySQLが
既にPKが存在している時は UPDATE
なかったら INSERTしてくれます

INSERT INTO tmp_summary 
  SELECT  商品番号 , 0 as 商店A購買数, count(商品番号) as 商店B購買数
  FROM    商店Bテーブル
  WHERE   del_flg       =  0 
  AND     購買日   >= 'YYYY/MM/DD 00:00:00'
  AND     購買日   <= 'YYYY/MM/DD 23:59:59'
  GROUP BY 商品番号

  ON DUPLICATE KEY UPDATE
  商店A購買数=tmp_summary.商店A購買数+values(商店A購買数),
  商店B購買数=tmp_summary.商店B購買数+values(商店B購買数);


これで あとは テンポラリーテーブルをよしなに処理すればOK

select * from tmp_summary;

参考)
複合UNIQUEキーでも「INSERT ... ON DUPLICATE KEY UPDATE」構文は使える - 岩本隆史の日記帳
http://d.hatena.ne.jp/IwamotoTakashi/20080329/p1

テンポラリテーブルの作成MySQL|プログラムメモ
http://logic.moo.jp/memo.php/archive/11/

他のテーブルのデータを追加(INSERT ... SELECT文) - データの追加と削除 - MySQLの使い方
http://www.dbonline.jp/mysql/insert/index6.html










2012/07/24

SELECT結果からテーブルを作る

↓こんな感じのね
CREATE TABLE [table_name]
 SELECT  *
 FROM    TBL_A
 WHERE   del_flg       =  0 
 AND     regist_date   <= '2012/07/23 23:59:59'
 ;

2012/07/12

jQueryで同じIDを持つ 複数要素を選択する

<div id="hoge">hoge</div>
<div id="hoge">hoge</div>
<div id="hoge">hoge</div>

↑だったら

$("[id=hoge]").html('fuga');


参考)
$("[id=bar]"). http://www.kinopyo.com/blog/jquery-select-multy-element-with-same-id

コンポーネントでモデルを使うとき [cakePHP2]

↓メソッドの中で 使うモデルを定義しましょう
  public function component_method()
  {

    // Model呼び出し
    $this->controller->loadModel('UserInfo');
    $user = $this->controller->UserInfo->find("first",
              array("conditions"=>array(
  :
  :

2012/07/06

mysqldump いろいろ


 ・特定のテーブル(複数可)のレコードのみダンプ テーブル作成情報は出さない
$ mysqldump -u [username] -p[password] -t [database_name] [table_name1] [table_name2]・・・> [file_path]


・データベース全体のテーブル構造のみ ダンプ  レコード情報を一切書き込まない)
$ mysqldump [username] -p[password] -d [database_name] > [file_path]
→ createtableとinsert文も一緒に出すときは −dオプションを外す

参考)
MySQLのダンプ(エクスポート)、インポート、バックアップ - Tips and Memo 

mysqldumpで複数テーブルもしくは特定のテーブルなど条件指定でレコードを出力する方法

2012/07/04

memcache だらだらめも

■memcacheの状態を確認する簡易ツール「memcached-tool」コマンド


↓実行例
# memcached-tool localhost:11211
  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM
  9     552B      2674s       1       1      no        0        0    0
 14     1.7K      1394s       1       2      no        0        0    0
 15     2.1K      1386s       1       3      no        0        0    0
 29    48.1K      2695s       1      21     yes        5     1404    0
 30    60.2K      2745s       1       6      no        0        0    0

参考)
memcached の中身を確認するなら memcached-tool コマンド | バシャログ。 http://c-brains.jp/blog/wsg/10/07/30-105035.php
memcached-toolの使い方 - あるプログラマーの後悔日誌 http://d.hatena.ne.jp/taka512/20110830/1314698515


■memcachedに繋げて確認する

・telnetで入る
$ telnet ホスト ポート番号
$ telnet localhost 11211

・statsコマンド ↓出力例
stats
STAT pid 29344
STAT uptime 12450
STAT time 1341381935
STAT version 1.4.5
STAT pointer_size 32
STAT rusage_user 0.017997
STAT rusage_system 0.026995
STAT curr_connections 13
STAT total_connections 54
STAT connection_structures 15
STAT cmd_get 44
STAT cmd_set 38
STAT cmd_flush 0
STAT get_hits 6
STAT get_misses 38
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 1587472
STAT bytes_written 305878
STAT limit_maxbytes 1048576
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 1341195
STAT curr_items 33
STAT total_items 38
STAT evictions 5
STAT reclaimed 0
END

limit_maxbytes 最大メモリサイズとか
curr_items 現在登録されているアイテムの数
total_items 今まで登録されたアイテムの数(累計)
evictions 容量がいっぱいになって 追い出されたアイテムの数

▲memcachedは 最大容量に達すると、期限切れや一番古いアイテムの領域を新しい領域に当てる


・キー一覧取得 stats cachedump [slab id] [limit]

 [slab id]=上記のmemcached-toolコマンドで出る 「#」の列がソレ
↓出力例(#15のアイテムたちを表示する)

stats cachedump 15 100
ITEM key_1[1747 b; 1341457279 s]
ITEM key_2 [1715 b; 1341374471 s]
ITEM key_3 [2042 b; 1341374471 s]
END

参考)
memcachedを知り尽くす:第2回 memcachedのメモリストレージを理解する|gihyo.jp … 技術評論社 http://gihyo.jp/dev/feature/01/memcached/0002?page=3
[memcached] memcachedコマンド一覧 - Life with IT
http://l-w-i.net/t/memcached/command_001.txt

その他参考)
★インストール
memcachedを知り尽くす:第1回 memcachedの基本|gihyo.jp … 技術評論社
http://gihyo.jp/dev/feature/01/memcached/0001?page=2
★めむきゃっす すてーたすみる
http://gihyo.jp/dev/feature/01/memcached/0002?page=3



2012/07/02

[PHP] Memcache 簡易スクリプト

◎簡単な 確認やら、セットやらできるやつ

→ コマンドラインから、php -f chk_memcached.php get_list みたいに実行

・get_list 表示例

# php -f chk_memcached.php get_list
==============================
command:get_list
==============================
* = old cache
---------------
expire = 0  | size =       10 | cache_key = foo
expire = 0  | size =       20 | cache_key = hoge
---------------
key count:2
     total cache size:        30byte
*old total cache size:         0byte


#define('MEM_HOST', 'localhost');
define('MEM_HOST', '127.0.0.1');
define('MEM_PORT', 11211);

if ($argc < 2) {
  showUsage();
  exit;
}

$output = array();
$keys   = array();
$value  = '';

//Memcache
$memcache_obj = new Memcache;
$memcache_obj->connect(MEM_HOST, MEM_PORT);

array_shift($argv);
$command = array_shift($argv);

switch ($command) {
  case 'get':
    $keys = $argv;
    
    $re = $memcache_obj->get($keys);
    break;

  case 'get_list':
    $re = getKeyList($memcache_obj);
    break;

  case 'set':
    $keys = array_shift($argv);
    $value = array_shift($argv);
    
    $re = $memcache_obj->set($keys, $value);
    break;

  case 'delete':
    $keys = array_shift($argv);
    
    $re = $memcache_obj->delete($keys);
    break;

  default:
    showUsage();
    break;
}

$output[] = '==============================';
$output[] = 'command:' . $command;
if (is_array($keys)) $keys = join(',', $keys);
if ($keys)  $output[] = 'key(s):' . $keys;
if ($value) $output[] = 'value:' . $value;
$output[] = '==============================';
$output[] = '';

echo join("\n", $output);

if (is_array($re)) var_dump($re);
else echo $re;
echo "\n";


function showUsage() {

  $usage = basename(__FILE__) . " -- Usage >>>>\n";
  $usage.= "    :get_list\n";
  $usage.= "    :get [key1] [key2] [key3] ...  [keyN]\n";
  $usage.= "    :set [key] [value]\n";
  $usage.= "    :delete [key]\n";

  echo $usage;

}


/**
 * 統計情報からすべてのキーを抜き出す
 */
function getKeyList($memcache_obj) {
  $result = array();
  $tmp_keys = array();
  $all_keys = array();
  $total = 0;
  $old_total = 0;

  $slabs = $memcache_obj->getExtendedStats('slabs');

  $stats = $memcache_obj->getStats();
  $memcached_started_time = $stats['time'] - $stats['uptime'];

  $stats_item = $memcache_obj->getStats('items');
  $items = $stats_item['items'];
  foreach ($items as $slabclass => $item) {
      $stats_cachedump = $memcache_obj->getStats('cachedump', $slabclass, $item['number']);
      $tmp_keys = array_merge($tmp_keys, $stats_cachedump);
  }

  ksort($tmp_keys);
  foreach ($tmp_keys as $cache_key => $v) {
    $size = (int)$v[0];
    $time = ($v[1] == $memcached_started_time)? 0: $v[1];
    $expire = (!$time)? $time: date('Y/m/d H:i:s', $time);
    $old_flg = ($time && $time < time())? '*': ' ';
    $total+=$size;
    if ($old_flg == '*') $old_total+=$size;
    $all_keys[] = 'expire = ' . $expire . $old_flg . ' | size = ' . sprintf("%8s", $size) . ' | cache_key = ' . $cache_key;
  }



  $result[] = '* = old cache';
  $result[] = '--------------- ';
  $result[] = join("\n", $all_keys);
  $result[] = '--------------- ';
  $result[] = 'key count:' . count($all_keys);
  $result[] = '     total cache size:' . sprintf("%10s", $total) . 'byte';
  $result[] = '*old total cache size:' . sprintf("%10s", $old_total) . 'byte';

  return join("\n", $result);
}

2012/06/20

twitterアプリ作成時のメモ アプリ認証登録編


◎ツイッターアプリを デベロッパーサイトに登録
https://dev.twitter.com/

→ Create an app
https://dev.twitter.com/apps/new

・必要事項入力
Name: アプリ名
Description: アプリ概要
Website: ウェブサイト(架空でOK)
Callback URL: ※コレが大事 ツイッターのアプリ連携認証が完了して 戻る先のURL


規約を読んで同意して送信

◎My applications-登録されたapplication確認
  右上のアカウントのプルダウンメニューからも確認できる
 
◎アプリで使う keyとかの確認

    Access level        ←デフォはread onlyになっているので twitter投稿とかしたい場合は
                          About the application permission model(https://dev.twitter.com/docs/application-permission-model)
                          パーミッション設定画面で「Read and write」を設定しておく

    Consumer key        ←アプリに設定
    Consumer secret     ←アプリに設定

2012/06/15

[CakePHP2.0] 複数アプリが混在するサービスで生じた問題メモ

複数appが必要なとき、1.3の時には 何もきにせず
app_1/
app_2/

って作っていたので

2.0でも 同じ構成で作っていたら
app_1とapp_2の appController.phpに同じメソッド名があると、
app_1のappControllerを呼び出したら
app_2でappControllerをよんでも app_1のappControllerを見に行ってしまうとか

1と2に 同じ名前のControllerを置くと うまく動かないとか

いう声を聞いたので ちょっと調べたけど、未だ具体策はつかめず


いちおう メモがわりに 貼っとく


CakePHPで複数アプリケーション管理|マリンロード
http://www.marineroad.com/staff-blog/3159.html


CakePHP2.0で現状の問題点などまとめました。 | Fusic Developers' Weblog
http://blog.fusic.co.jp/archives/2207


eat cake, 複数のapp 同居
http://miztools.so.land.to/php5_list/eat_cake/ac_off/cake2.php/edit/multi_app


2012/06/05

同じネットワーク内でのvhosts設定

※まんま みーとくんからの転載 めもさせていただいた。


バーチャルホストの設定 - 肉になるメモ
http://d.hatena.ne.jp/kazumeat/20120130/1327918879

・/etc/httpd/con.d 以下にアプリ用のconfを作成
NameVirtualHost 192.168.1.111:80
#
# app1
#
<VirtualHost 192.168.1.111:80>
  DocumentRoot /var/www/app1
  ServerName app1.com
  ErrorLog logs/app1_error_log
  CustomLog logs/app1_access_log common
  <Directory "/var/www/app1">
      Options Indexes FollowSymLinks Includes ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
  </Directory>
</VirtualHost>

#
# app2
#
<VirtualHost 192.168.1.111:80>
  DocumentRoot /var/www/app2
  ServerName app2.com
  ErrorLog logs/app2_error_log
  CustomLog logs/app2_access_log common
  <Directory "/var/www/app2">
      Options Indexes FollowSymLinks Includes ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
  </Directory>
</VirtualHost>
・ローカルのhostsファイル設定
C:\Windows\System32\drivers\etc\hosts
192.168.1.111        app1.com
192.168.1.111        app2.com

2012/05/30

file_get_contentsで外部ファイルを読み取る


file_get_contentsで、外部のXMLや画像、webページなどを取得できる

◎普通に取得する場合
$homepage = file_get_contents('http://www.example.com/');
echo $homepage;

◎ファイルの一部の読み込み
// 21 文字目から 14 文字ぶん読み込みます
$section = file_get_contents('./people.txt', NULL, NULL, 20, 14);
var_dump($section);

◎Basic認証
file_get_contents("http://user:password@www.example.com/");

◎ストリームコンテキストの使用
・ストリームコンテキストでのBasic認証
// ストリームを作成します
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Authorization: Basic " .base64_encode("user:password"). "\r\n"
  )
// 上で設定した HTTP ヘッダを使用してファイルをオープンします
$file = file_get_contents('http://www.example.com/', false, stream_context_create($opts));

・特定のヘッダで送信
// ストリームを作成します
$header = Array(
  "Content-Type: application/x-www-form-urlencoded",
  "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
  "Accept-language: en",
  "Cookie: foo=bar"
);
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>join("\r\n", $header),
  )
);

$context = stream_context_create($opts);

// 上で設定した HTTP ヘッダを使用してファイルをオープンします
$file = file_get_contents('http://www.example.com/', false, $context);

◎POSTで送信
$data = array(
    'param1' => 'hoge',
    'param2' => 'hogehoge',
);
$opt = array('http' => array(
    'method' => 'POST',
    'content' => http_build_query($data),
));
$contents = file_get_contents('http://www.example.com/', false, stream_context_create($opt));



クエリーキャッシュ関係を調べる

◎クエリーキャッシュが有効になっているか確認する

SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+
1 row in set (0.00 sec)

◎キャッシュのサイズを確認する

show variables like 'query_cache_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| query_cache_size | 0     |
+------------------+-------+

「have_query_cache」が「YES」になってても、この↑キャッシュサイズが0だったら キャッシュはされない。

◎キャッシュサイズを設定する

SET GLOBAL query_cache_size = 41984;

my.cnfで設定

query_cache_size = 32M

設定後にMySQL再起動 : service mysqld restart

◎クエリーキャッシュされたかを確認する

SHOW STATUS LIKE 'Qcache%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Qcache_free_blocks      | 0     |
| Qcache_free_memory      | 0     |
| Qcache_hits             | 0     |
| Qcache_inserts          | 0     |
| Qcache_lowmem_prunes    | 0     |
| Qcache_not_cached       | 0     |
| Qcache_queries_in_cache | 0     |
| Qcache_total_blocks     | 0     |
+-------------------------+-------+
8 rows in set (0.00 sec)

キャッシュされると「Qcache_hits」とか「Qcache_queries_in_cache」とかの値が増える

2012/05/27

CakePHP での ログ設定 (CakePHP 1.3.6)


◎config/core.php
//PHP エラーレベルで指定
Configure::write('log', E_ERROR | E_WARNING | E_PARSE);
[Mode]
debug=0 の時
Fatal → Apacheエラーに出る
WARNIG → appエラーに出る

debug=1 の時 ↑上記のエラーに加えて、
Notice → appデバッグログに出る


◎ログファイル指定
[apache] vhostで設定 /etc/httpd/conf.d/vhosts/[user].conf
CustomLog /var/log/httpd/app_name_access_log common
ErrorLog /var/log/httpd/app_name_error_log ←PHPエラーとかが出る。

[app] アプリCakeのLogクラス)で出すログ
   →config/設定ファイル.phpで指定する
// ログPATH設定
CakeLog::config('custom_path', array(
'engine' => 'FileLog',
'path' => '/var/log/httpd/[app_name]_'
));
【出力先】
  → 「debug.log」、「error.log」は Cakeがエラーレベルに応じて出しわけます
  → Controller内とかでLogクラス使って出したものが出ます
 LOG_DEBUG:/var/log/httpd/[app_name]_debug.log
 LOG_ERROR:/var/log/httpd/[app_name]_error.log


【エラー出すときに使う↓メモ】
#var_dump(srlen(array())); //Fatal Error
var_dump(srlen('',)); //Pars Errore
var_dump(strlen(array())); //WARNIG
#var_dump($a); //Notice

 



文字列フィールドの 平均バイト数を出す

select avg(b.length) from (SELECT length(comment) as length from blogs where del_flg=0) as b;

$.each() でスキップする


phpだと continue;
jQuery.each()の場合は return true;



Carbon Emacs


Carbon Emacs (おまけ)
Ctl+X+F で file find モード
※Ctl押しながら 「X」 続けて「F」と押す
※ユーザのhomeディレクトリ配下を見てる

Carbon Emacsパッケージは、銭谷誠司氏が開発を続けているMac OS X向けのEmacsパッケージである。有用スクリプト等がデフォルトで含まれているほか、日本語環境向けのパッチなども導入されており、日本語環境で利用するならもっともおすすめできるEmacsパッケージである。
参考)Emacs超入門[1]:Emacsの基本的な使い方とショートカットキー - SourceForge.JP Magazine : オープンソースの話題満載 -http://sourceforge.jp/magazine/09/04/06/1138226/2