目指せ1級!30代サラリーマンボルダリング日記

都内IT企業で働く30代サラリーマンのクライミング記録

■2015/12/26
サークルの活動で秋パンへ。

2F奥のツリーのとこにある3級課題落とせた。
ニーバーからの2手目取るのが核心?

■2015/12/28
2Fスラブの3級、中央の3級トライするもできず。
その後は同僚と7,6,5級の課題を一通りこなす。

手首が相変わらず痛い。
    このエントリーをはてなブックマークに追加

■2015/12/23
新宿APEXへ。
4級はいくつか落とせたけど、3級は落とせず。。

■2015/12/24
イブだけど同僚とサークルメンバーに声かけて秋パンへ。
連登はけっこう体にくる。
2Fの4級1個落として、12/22からできた2F奥の3級課題やるも2手目が取れず。

HALEOのハイパーリロードがなくなったので、次はアイソコアブラックオプスをお試し。
前のは味が苦手だったけど、これならいける。
image


あとブルードラゴン箱買いしました。
    このエントリーをはてなブックマークに追加

サークルメンバー8人で品川のロッキーに。
ロッキーは初めて3級課題落とせたジム。
今回も3級に挑むも一つも落とせず。

2015-12-20-17-29-52



MUSASHIのJOINT買ってみました。
しょっちゅう肘の関節が痛くなったり、あと右手の中指は治る気配ないしで・・・。
しばらく飲み続けてみます。
2015-12-21-22-27-24




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

■2012年5月ころ
初めてのボルダリング。勢いで靴を買ってしまう。
形から入るタイプ。
でもほどなくしてやらなくなる。

■2014年12月ころ
会社の同僚に誘われ再開。
月1程度で活動。

■2015年5月ころ
楽しくなって週1ペースに。

■2015年9月ころ
さらにペース上げて週2ペースに。
社会人ボルダリングサークルに入る。

■2015年10月
シューズ2足目ゲット。スカルパのフューリア。
スカルパ フューリア


■2015年11月
HALEOのハイパーリロード購入。
HALEO ハイパーリロード


■2015年12月
秋パンで初の3級成功。
    このエントリーをはてなブックマークに追加

Web上で変換サービスはたくさんあるんだけれど、サーバ内で変換して出力するパターンはあまり検索にも引っかからなかったのでメモ。

OSはCentOS6。
OpenOfficeとJODConverterをインストール。
このあたりの記事参照。

OpenOffice.orgをドキュメント変換ツールとして活用する方法
JODConverter
OpenOfficeを使ってPDFを作成

# export DISPLAY=:1.0
# Xvfb :1 &
# Xvfb :1 -screen 0 1024x768x8
# soffice -headless -accept="socket,port=8100;urp;" -nofirststartwizard &
# netstat -anp | grep 8100
# java -jar /path/to/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar /tmp/sample.docx /tmp/sample.pdf


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

ということで付けてみましたOGP。

今までこんな感じでイイネ!だったのが、


こうなりました。


groupon-now.jpがグルーポンなうになっただけだけどね。。
最近各クーポンサイトがOGP導入し始めてて、クロールする側としては便利でうれしい。


設定したときにちょっとハマったのでメモ。
og:typeをwebsiteにするのはトップページだけぽい。
なので個別の商品ページはarticleで設定したらうまくいった。

Open Graph protocol - Facebook開発者によると

Use article for any URL that represents transient content - such as a news article, blog post, photo, video, etc. Do not use website for this purpose. website and blog are designed to represent an entire site, an og:type tag with types website or blog should usually only appear on the root of a domain.


てことなので、グルーポンなうでいうと
トップページにはog:typeをwebsiteで
クーポン詳細にはog:typeをarticleで設定ですね。

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

ここ最近というか結構前からhtmlスクレイピングすることが多いのでメモ。
最初はいろいろ試してたんだけど、今使ってるのは2パターン。
ベンチマークとって最速だったからとかじゃなく、単に慣れかも。

scrape_func.php

このオライリーの本のサンプルコードに含まれているファイル。
http://www.oreilly.co.jp/books/4873111870/download.html
始点と終点書いて直感的に取ってこれる。
$_rawData = getURL($url);
$_rawData = mb_convert_encoding($_rawData, "UTF-8", "auto");
$_rawData = cleanString( $_rawData );

$headline = getBlock("<div id=\"headline\">","</div>",$_rawData,false);

$title = getElement("h1", $_rawData);

XPATH

xpath使うのが一般的だとは思うけど、ちっちゃい処理だと上に挙げたライブラリの方が早いんだよね。
でも言語に限らず使えるから便利。
このブログのタイトル取る例。
$res = file_get_contents($url);
$dom = @DOMDocument::loadHTML($res);
$xml = simplexml_import_dom($dom);

//最新記事のタイトル
$title = $xml->xpath("//div[@class='hentry']/h2/a/text()");
echo (string) current($title);

//3番目の記事のタイトル
$title = $xml->xpath("//div[@class='hentry'][3]/h2/a/text()");
echo (string) current($title);
//3番目の記事のリンク
$link = $xml->xpath("//div[@class='hentry'][3]/h2/a/@href")

スクレイピングって地道な作業だよね。
各サイトごとにほぼ手動対応。。
    このエントリーをはてなブックマークに追加

何気にGoogleMapsAPI使うの初めてだったりする。
今回「グルーポンなう」作るときに使いました。
単純にAPI叩いてるだけなのでメモ程度に。

前回の記事 【CakePHP】位置情報の取得と、2点間の距離計算のコンポーネントに追加すると便利かも。

というわけで、

App/controllers/components/geo.php

class GeoComponent extends Object {
  public function addr2geo($addr=""){
    $url = sprintf("http://maps.google.co.jp/maps/geo?q=%s&output=json&key=%s",
                   urlencode($addr),
                   'GoogleMapsAPIKEY');
    $res = file_get_contents($url);
    $data = json_decode($res);
    $geo = $data->Placemark[0]->Point->coordinates;
    return array('lng' => $geo[0], 'lat' => $geo[1]);
  }
}
あ、データ取得できなかった時とかの処理は別途書いてね。。

App/controllers/foo_controller.php

class FooController extends Controller {
  var $name = 'Foo';
  var $components = array('Geo');

  function index () {
    $addr = '東京都新宿区新宿三丁目38-1';
    $geo = $this->Geo->addr2geo($addr);
    echo $geo['lat']; //緯度
    echo $geo['lng']; //経度
  }
}


位置情報をサービスに使うとおもしろいね。
今後もいろいろ作っていければいいなー。
    このエントリーをはてなブックマークに追加

20100630211430 よくありそうなこんなかんじのログイン画面。
かんたんログインボタンと、ID/PASS入力するフォーム。

かんたんログインはいろいろありますけど、とりあえず今回は触れません。
キャリアのゲートウェイのIP制限はしましょうってかんじ。


標準のAuthコンポーネントと、ktaiライブラリを使ってます。

UIDが設定してあれば「かんたんログイン」できて、してなければID/PASS入力してUID設定することもできるという機能。
今回はトップページで行う設定です。
Cakeのバージョンは1.3

APP/controllers/top_controller.php

class TopController extends AppController
{
  var $name = 'Top';
  var $uses = 'User';
  var $helpers = array('Ktai','Session','Form');
  var $components = array('Ktai','Session','Auth');

  function beforeFilter() {
    $this->Auth->loginAction = '/';
    $this->Auth->autoRedirect = false;
    $this->Auth->authorize = 'controller';
    $this->Auth->allow('index');
    parent::beforeFilter();
  }

  function beforeRender() {
    parent::beforeRender();
  }

  function index () {
    if ($user = $this->Auth->user()) {
      if (isset($this->data['add_uid'])) {
        $user['User']['uid'] = $this->Ktai->get_uid();
        $this->User->save($user['User']);
/* 7/14追記 */
        $user = $this->User->findById($set['id']);
        $this->Auth->login($user);
/* 7/14追記ここまで */
      }
      $this->redirect($this->Auth->redirect());
    } else {
      if (isset($this->data['auto_login'])) {
        if ($user = $this->User->findByUid($this->Ktai->get_uid())) {
          if ($this->Auth->login($user['User'])) {
            $this->redirect($this->Auth->redirect());
          } else {
            $this->Session->setFlash('再度かんたんログイン設定をしてください',null);
          }
        } else {
          $this->Session->setFlash('かんたんログイン設定がされていません',null);
        }
      }
    }
  }

  function isAuthorized () {
    $user = $this->Auth->user();
    $user['User']['last_login'] = date('Y-m-d H:i:s');
    $this->User->save($user['User']);

    return true;
  }
}

やっていることは以下の3点。
・ID/PASSでログイン成功して、「かんたんログイン設定する」にチェックがされていれば、UIDをとってテーブルに突っ込む。
・かんたんログインの場合はUIDをキーにusersテーブルからデータを取ってきてAuth->loginに突っ込んでログインさせる。
・isAuthorized()でログインが成功したらログイン日時を更新。

usersテーブル

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(10)      | NO   | PRI | NULL    | auto_increment |
| username    | varchar(100) | NO   |     | NULL    |                |
| password    | varchar(100) | NO   |     | NULL    |                |
| uid         | varchar(100) | NO   |     | NULL    |                |
| flag        | int(1)       | NO   |     | NULL    |                |
| last_login  | datetime     | NO   |     | NULL    |                |
| created     | datetime     | NO   |     | NULL    |                |
| updated     | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+


あ、クッキーが使えない携帯がまだまだたくさんあるため(主にdocomo)、そのための設定も忘れないようにメモ。

APP/config/bootstrap.php

if (!isset($_SESSION)) {
  if ($ini_set) {
    ini_set('session.use_trans_sid', 1);
    ini_set('session.serialize_handler', 'php');
    ini_set('session.use_cookies', 0);
  }
}


2010/07/14追記
ログインの際にUIDをテーブルに追加した場合、
$this->Auth->user()で取れるユーザデータはセッションなので再度ログインしないといけないみたい。
    このエントリーをはてなブックマークに追加

テーブルのカラムのタイプをtinyint(1)にして、saveしようとしたんだけど値がおかしい。

  $set = array('type' => 2);
  $this->Data->create();
  $this->Data->save($set);

typeに2を入れようとしてるんだけど、データベース見てみると1になってる!!
ぐぐったらいっぱいでてきたので、みんなやっぱりハマるんだね。。
ちなみにCakePHP1.3です。

Cakephpはtinyintをbooleanにするらしい。。。なんてこった。

CORE/libs/model/datasources/dbo/dbo_mysql.php line474
    if (($col == 'tinyint' && $limit == 1) || $col == 'boolean') {
      return 'boolean';
    }

これは実際体験してみないと気づかないね。。
無駄に時間とられた。
    このエントリーをはてなブックマークに追加

このページのトップヘ