CRUD

create, read, update, delete

pip install sqlalchemy

orm for python
object relational mapper

sql alchemy
->vagrant file already set up
http://www.sqlalchemy.org/

import os
import sys
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine
 
Base = declarative_base()
 
class Restaurant(Base):
    __tablename__ = 'restaurant'
   
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)
 
class MenuItem(Base):
    __tablename__ = 'menu_item'

    name =Column(String(80), nullable = False)
    id = Column(Integer, primary_key = True)
    description = Column(String(250))
    price = Column(String(8))
    course = Column(String(250))
    restaurant_id = Column(Integer,ForeignKey('restaurant.id'))
    restaurant = relationship(Restaurant) 
 

engine = create_engine('sqlite:///restaurantmenu.db')
Base.metadata.create_all(engine)

crontab

setting

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

* * * * * /user/bin/php /home/vagrant/hoge/index.php

simplexml_load_file

simplexml_load_file:Interprets an XML file into an object

<?php

$rssList = array(
  "http://news.finance.yahoo.co.jp/rss/cp/fisf.xml",
  "http://news.finance.yahoo.co.jp/rss/cp/toyo.xml",
  "http://news.finance.yahoo.co.jp/rss/cp/mosf.xml",
  "http://news.finance.yahoo.co.jp/rss/cp/shikiho.xml"
);

for($n=0;$n<3;$n++){
    //URL設定
    $rssdata = simplexml_load_file("$rssList&#91;$n&#93;");

    // 件数設定
    $num_of_data = 3;

    //初期化
    $outdata = "";
    for ($i=0; $i<$num_of_data; $i++){

        $myEntry = $rssdata->channel->item[$i];
        $rssDate = $myEntry->pubDate;
        date_default_timezone_set('Asia/Tokyo');
        $myDateGNU = strtotime($rssDate);
        $myDate = date('Y/m/d',$myDateGNU);
        $myTitle = $myEntry->title; //タイトル取得
        $myLink = $myEntry->link; //リンクURL取得

        //出力内容(CSSOK)
        $outdata .=  '<p class=""><div style="float:left;width:80px;margin:0px 0px 0px 5px;font-size:12px">'.$myDate.'</div><a href="' . $myLink . '">' . $myTitle . '</a></p>';
    }
    echo $outdata; //全部出力する
}
?>

rssの種類
タグ RSS1.0 RSS2.0 Atom
要素 item channel entry
タイトル title title title
リンク link  link link
説明 description description description
日付 dc:date  pubDate issued

.htaccess

Order Allow,Deny
Allow from all
Deny from .abcde.com
Deny from 111.122.133.
Deny from 111.122.133.192/26

referer

SetEnvlf Referer "http://hogehoge.com" Ref1
SetEnvlf Referer "http://hogeweb.com" Ref2
Order Deny, Allow
Deny from all
Allow from env=Ref1
Allow from env=Ref2

files match

<FilesMatch "\.(gif|.jpg?g|png)$">
SetEnvlf Referer "http://hogehoge.com" Ref1
Order Deny, Allow
Deny from all
Allow from env=Ref1
</FilesMatch>
SetEnvIf REFERER "sample.com" Ref1
Order Deny,Allow
Deny from all
Allow from env=Ref1

ip

SetEnvIf REFERER "sample.com" Ref1
Order Deny,Allow
Deny from all
Allow from env=Ref1
<Files ~"\.log$">
 Deny from all
</Files>

DOSS

php Jaccard

<?php

 /**
 * $item_ids => 商品IDの配列[1,2,3,4,5]の配列
 */

 foreach($item_ids as $item_id1){
   $base = $Redis->lRange('Viewer:Item' . $item_id1, 0, 999);
   if (count($base) === 0){
     continue;
   }
   foreach ($item_ids as $item_id2){
     if ($item_id1 === $item_id2){
       continue;
     }
     $target = $Redis->lRange('Viewer:Item:' . $item_id2, 0, 999);
     if (count($target) === 0){
       continue;
     }

     #ジャッカード指数を計算
     $join = floatval(count(array_unique(array_merge($base, $target))));
     $intersect = floatval(count(array_intersect($base, $target)));
     if ($intersect == 0 || $join == 0){
       continue;
     }
     $jaccard = $intersect / $join;

     $redis->zAdd('Jaccard:Item:' . $item_id1, $jaccard, $item_id2);

   }
 }
<?
/**
* $item_id => 商品id
* $user_id => ユーザid
*/
$Redis->lRem('Viewer:Item' . $item_id, $user_id);
$Redis->lPush('Viewer:Item' . $item_id, $user_id);
$Redis->lTrim('Viewer:Item' . $item_id, 0, 999);
<?php
 $Redis->zRevRange('Jaccard:Item:' . $item_id, 0, -1);

php redis

%e7%84%a1%e9%a1%8c

redisがインストールされた状態

git clone git://github.com/nicolasff/phpredis.git
cd phpredis
phpize
./configure
make
make install

php iniにextension=redis.soを追加。

[vagrant@localhost rss11]$ sudo vi /etc/php.ini
[vagrant@localhost rss11]$ php -m | grep redis
redis

phpでredis操作

<?php
$redis = new Redis();
$redis->connect("127.0.0.1",6379);

// PINGで確認する
echo $redis->ping();

set

<?php
$redis = new Redis();
$redis->connect("127.0.0.1",6379);

// PINGで確認する
echo $redis->set('hoge', 'huga');

$value = $redis->get('hoge');

echo $value;

python redis module

Python client for Redis key-value store

$ sudo pip install redis

index.python

# _*_ coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals

def jaccard(e1, e2):
    """
    :param e1: list of int
    :param e2: list of int
    :rtype: float
    """
    set_e1 = set(e1)
    set_e2 = set(e2)
    return float(len(set_e1 & set_e2)) / float(len(set_e1 | set_e2))

def get_key(k):
    return 'JACCARD:PRODUCT:{}'.format(k)

# 商品xを購入した人が1,3,5
product_x = [1, 3, 5]
product_a = [2, 4, 5]
product_b = [1, 2, 3]
product_c = [2, 3, 4, 7]
product_d = [3]
product_e = [4, 6, 7]

# 商品データ
products = {
'X': product_x,
'A': product_a,
'B': product_b,
'C': product_c,
'D': product_d,
'E': product_e,
}

#redis
import redis
r = redis.Redis(host='localhost', port=6379, db=0)

for key in products:
    base_customers = products[key]
    for key2 in products:
        if key == key2:
            continue
        target_customers = products[key2]
        # ジャッカード指数
        j = jaccard(base_customers, target_customers)
        # redis Sortedに記録
        r.zadd(get_key(key), key2, j)

    # 例1 商品xを買った人はこんな商品も買っています
    print(r.zrevrange(get_key('X'), 0, 2))

    # 例2 商品Eを買った人はこんな商品も買っています。
    print(r.zrevrange(get_key('E'), 0, 2))
[vagrant@localhost rss10]$ python index.py
[b'B', b'D', b'A']
[b'C', b'A', b'X']

レコメンドアルゴリズムには、協調フィルタリングと内容ベース(コンテンツベース)フィルタリングがある

redis

サーバー起動
redis-server

クライアントの起動と終了
redis-cli

データベースの選択
0~15までデフォルトで設定されている
> select 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>

データの保存
> bgsave
データはredis serverを立ち上げたディレクトリにdump.rdbで保存される

string
-set key value
mset key value key value

-get key
mget key key key

数字の操作
incr,decrby

key
> keys *
> keys *m*
> exits scroe
> rename age neneri
> del nenrei
> randomkey

list
push, pop
>rpush mycolor pink
>rpush mycolor green
追加した要素を見る
>lrange mycolor 0 3
>lrange mycolor 0 -1
削除
> rpop mycolor (rightから)
> lpop mycolor (leftから)
> lindex myclor 2
> llen mycolor
> ltrim mycolor 0 2

Set
追加: sadd
削除: srem

一覧: smembers
和集合: sunion
積集合: sinter (共通部分)
差集合: sdiff 

>suionstore myunion myset1 myset2

sorted set
追加: zadd
削除: zrem
一覧: zrange

Jaccard index

The Jaccard index, also known as the Jaccard similarity coefficient (originally coined coefficient de communauté by Paul Jaccard), is a statistic used for comparing the similarity and diversity of sample sets.

Jaccard(A,B)=|A∩B| / |A∪B|