通过FreeRADIUS实现VPN流量控制功能

FROM:http://wangyan.org/blog/freeradius-traffic-limit.html

搭建一个VPN非常容易,但如何实现PPTP/L2TP VPN流量限制?首先必须先安装配置好FreeRADIUS,方法见《PPTP/L2TP + FreeRADIUS + MySQL 安装与配置》,然后再进行下面操作。

一、启用 Rlm sqlcounter 模块

查找”counter.conf”(712行),去掉#号

vim /usr/local/radius/etc/raddb/radiusd.conf

二、添加 Traffic Counter流量计数器

网上一些教程有拼写错误,折腾了大半天才在官方文档上找到原因。

vim /usr/local/radius/etc/raddb/sql/mysql/counter.conf

在文件末尾添加下面代码

sqlcounter monthlytrafficcounter {
    counter-name = Monthly-Traffic
    check-name = Max-Monthly-Traffic
    reply-name = Monthly-Traffic-Limit
    sqlmod-inst = sql
    key = User-Name
    reset = monthly
    query = "SELECT SUM(acctinputoctets + acctoutputoctets) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) > '%b'"
}

上面代码意思是按月进行统计,从数据库的radacct表中,根据用户名(%k)将所有入站和出站流量累加。

时间也是可以自定义的(months、weeks、days、hours),也可以指定具体值,如三天重置一次 “reset = 3 d”

三、启用Traffic Counter流量计数器

vim /usr/local/radius/etc/raddb/sites-enabled/default

在authorize区块的末尾(205行)添加

monthlytrafficcounter

四、添加字典文件

vim /usr/local/radius/etc/raddb/dictionary

在文件末尾添加下面两行

ATTRIBUTE Max-Monthly-Traffic 3003 integer
ATTRIBUTE Monthly-Traffic-Limit 3004 integer

五、数据库插入流量限制值

注意事项:

1)这里插入到radgroupcheck表,是限制某个用户组的流量。也可以插入到radcheck表,以限制某个用户的流量。
2)流量值以 byte 为单位,1G = 1073741824 bytes
3)VIP1是用户组,123456是数据库root密码

# 连接到MySQL数据库

mysql -uroot -p123456;

# 每月最大流量(1G)

INSERT INTO radgroupcheck (groupname,attribute,op,value) VALUES ('VIP1','Max-Monthly-Traffic',':=','1073741824');

# 流量统计时间的间隔(60秒)

INSERT INTO radgroupcheck (groupname,attribute,op,value) VALUES ('VIP1','Acct-Interim-Interval',':=','60');

参考资料:

1. http://wiki.freeradius.org/Rlm_sqlcounter
2. http://freeradius.org/rfc/attributes.html
3. https://blog.easisee.com/2010/09/freeradius-traffic-limit/

如何获得创业 idea (笔记)

原文:硅谷创业教父 Paul Graham:如何获得创业 idea http://www.36kr.com/p/172863.html
如何获得创业 idea (1)
问题:
自己遇到的,自己能解决的,如果正好有那么一部分人也遇到这么问题,那么这已经是个好的IDEA。 问题是不可能被空想出来的。如果自己都不养狗,那么想去做一个狗主人交流平台,基本上是空想。

深度:
项目的口子不用开的太大,但是一定要深入挖掘。

自我:
很多的点子不是被想到,而是被注意到。例如DROPBOX的创始人就经常忘带U盘,他注意到了这个问题, 并解决。 在这之前首先得让自己置身于快速变化的领域前端。

如何获得创业 idea (2)

注意到: 请尤其注意那些让你不爽的东西。 找到正确的问题后,你就应该把它明显地描述出来。然后解决。 活在未来,再把缺失的做出来

如果发现已经有人在做了,那么说明这块还是有用户需求在这里,是个好地方。

如何获得创业 idea (3)

除了你自己未被满足的需求外,别人未被满足的需求也是 idea 很好的来源。和周围的人都好好聊聊,听听 看他们发现了有什么是这个世界缺失了的?有什么是他们想做但做不来的?有什么乏味或让人不爽的东西 ,尤其是工作上的?聊天的时候天马行空一点,别一心只想着要从他们身上找到创业 idea。你其实是在别 人身上寻找点燃你思路的那颗火星。可能你会在谈话当中注意到他们原来并没有意识到的问题(因为你懂 得解决的方法)。 要找在将来会变成 x 的替代品的东西. 从根本上说,专门去找浪潮找趋势是刺激原生办法的一种方法。假如你处在快速发展的某个领域的前沿的 话,你犯不着去找什么浪潮,你自己就是浪潮了。

Android:Managing the Activity Lifecycle

Managing the Activity Lifecycle
活动生命周期管理
 
指定APP启动活动
 
//在AndroidManifest.xml下填写,ECLIPSE可以自动创建
<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
 
//创建一个实例:系统会在所有的活动启动时,调用onCreate()方法
TextView mTextView; // Member variable for text view in the layout
 
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity); //根据main_activity.xml设计好的界面设置用户界面
 
    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);//获取用户输入id=text_message的内容
 
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { //如果SDK版本大于等于安卓3.0
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}
 
onCreate方法执行完之后立即执行onStart,onResume
 
//销毁活动,大多数不需要onDestroy,只需onPause或者onStop
@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass
 
    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}
 
//暂停和恢复一个活动(onPause,onResume)
@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first
 
    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}
 
@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first
 
    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}
 
//停止和重启一个活动(onStop,onRestart)
无论什么情况下程序终止,都会先调用onPause,然后再调用onStop
@Override
protected void onStop() {
    super.onStop();  // Always call the superclass method first
 
    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
 
    getContentResolver().update(
            mUri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
            );
}
 
@Override
protected void onStart() {
    super.onStart();  // Always call the superclass method first
 
    // The activity is either being restarted or started for the first time
    // so this is where we should make sure that GPS is enabled
    LocationManager locationManager = 
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
 
    if (!gpsEnabled) {
        // Create a dialog here that requests the user to enable GPS, and use an intent
        // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
        // to take the user to the Settings screen to enable GPS when they click "OK"
    }
}
 
@Override
protected void onRestart() {
    super.onRestart();  // Always call the superclass method first
 
    // Activity being restarted from stopped state    
}
 
//重新创建活动
 
保存活动状态
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
 
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
 
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}
 
回复活动状态(必须先检测)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first
 
    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}
也可以不检测
public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);
 
    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

android:building your first app

AndroidManifest.xml
The manifest file describes the fundamental characteristics of the app and defines each of its components. You'll learn about various declarations in this file as you read more training classes.
src/
Directory for your app's main source files. By default, it includes an Activity class that runs when your app is launched using the app icon.
res/
Contains several sub-directories for app resources. Here are just a few:
drawable-hdpi/
Directory for drawable objects (such as bitmaps) that are designed for high-density (hdpi) screens. Other drawable directories contain assets designed for other screen densities(密度).
layout/(用户界面)
Directory for files that define your app's user interface.
values/(存储变量值)
Directory for other various XML files that contain a collection of resources, such as string and color definitions.
 
//创建一个activity_main.xml,match_parent代表着充满整个屏幕
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
</LinearLayout>
<!-- 
首次定义一个id需要用 @+id/message相当于form表单中的id="message"
android:hint代表这默认的文本框为空时填写的内容
@string/edit_message表示从string.xml中取出名为edit_message的字段值
wrap_content代表充满view
下面为一个文本框和一个按钮
-->
<EditText android:id="@+id/edit_message"
        android:layout_width="wrap_content" <!-- 可改为0 -->
        android:layout_height="wrap_content" <!-- 可改为0dp -->
        android:hint="@string/edit_message" />
<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send" 
		android:onClick="sendMessage"/> <!-- 点击时,调用MainActivity.java下的sendMessage方法 -->
 
//创建一个strings.xml放在res/values下,用来存储变量值
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">My First App</string>
    <string name="edit_message">Enter a message</string>
    <string name="button_send">Send</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_main">MainActivity</string>
</resources>
 
//创建一个MainActivity.java在src/com.exmple.my/下面
package com.example.my.first.app;
 
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
 
public class MainActivity extends Activity {
	//为了intent.putExtra方法的使用,必须现在这里定义EXTRA_MESSAGE
	public final static String EXTRA_MESSAGE = "com.example.my.MESSAGE";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
	//必须是公共的,有void返回值,view作为唯一的参数
	public void sendMessage(View view) {
		//intent是一个对象,经常被用来启动另一个活动
		//第一个参数为this,第二个为要启动的活动
		Intent intent = new Intent(this, DisplayMessageActivity.class);
 
		//intent还可以将数据传递给要调用的activity
		//根据id获取输入的内容
    	EditText editText = (EditText) findViewById(R.id.edit_message);
 
		//赋值给message
    	String message = editText.getText().toString();
 
		//putExtra的参数相当于key,value
    	intent.putExtra(EXTRA_MESSAGE, message);
 
    	//开始activity
    	startActivity(intent);
	}
}
 
//创建一个DisplayMessageActivity.java在src/com.exmple.my/下面
package com.example.my;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
 
public class DisplayMessageActivity extends Activity 
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        //所有的Activity必须继承父Activity的onCreate方法
 
        // Get the message from the intent
        Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
 
        // Create the text view
        TextView textView = new TextView(this);
        textView.setTextSize(40);
        textView.setText(message);
 
        //为活动布局设置文本视图
        setContentView(textView);
    }
}

分析称免费增值模式重在产品:别把钱花在营销(转)

转载自:http://www.yixieshi.com/b2b/233.html
导读:美国科技博客GigaOm今天撰文对五家企业的“免费增值”(Freemium)模式进行了分析。文章认为,虽然免费增值模式与传统模式有所不同,但针对用户需求开发产品仍然是关键所在。

以下为文章全文:

在一些创业企业眼中,免费增值业务成功的关键在于以下几点:别把钱花在营销上;一定要提供灵活性和数据导出服务,以免用户后悔:确保有价值的商誉,并对其加以利用;只能对较难完成的活动收费。但在上周五上午举行的免费增值峰会(Freemium Summit)上,Pandora、Dropbox、Evernote、Automattic和MailChimp这五家业内著名企业却认为,他们成功的最主要原因仍然在于提供了用户所需的优秀产品,并利用免费增值模式将产品推广给了大量用户。

所谓免费增值,是指提供免费服务的同时,附带升级选项。这种商业模式的重要性已经越发凸显,但却很难驾驭。因此,这些企业的经验便成了非常有价值资源。

Pandora的逆向模式

Pandora CTO汤姆·康拉德(Tom Conrad)

Pandora于2005年8月上线,该公司那时所推出的服务与免费增值非常相似:用户注册后可以免费收听10小时的网络广播,之后则需要支付每年36美元的费用。该公司CTO汤姆·康拉德(Tom Conrad)说:“在最初的几周内,我们的注册用户高达10万人,而且绝大多数用户都将免费的10小时服务全部用完。之后,当我们要求用户付费时,他们却大批撤离了。”

那年11月,Pandora又推出了一种广告模式。但这只是个名字而已,因为他们没有广告服务器,没有广告员工,甚至连页面上都没有投放广告的地方。但其使用量却一夜之间翻了4倍。三天内,苹果致电Pandora,要求买断该公司12月份的广告位。由于苹果给出的价格是一个月1万美元,因此康拉德和他的团队欣然接受了这笔合同。他说:“我们实际上是使用‘硬编码’(hard-code)在页面中添加广告的。我们不希望他们知道,但每次他们更改广告创意时,我们都需要重新发布整个站点。”

Pandora目前拥有2000万独立用户,去年实现收入5000万美元。付费用户比例不到1%,但由于用户基数较大,因此其付费用户总量仍然非常可观。该公司去年推出了一款名为Pandora One的桌面应用,该应用可以提供质量更高的流媒体广播,而且使用限制更少。Pandora One目前的注册用户为30万,约占该公司月独立用户访问量的1.6%至1.7%。今年有望为该公司贡献15%的收入。 一些事

Dropbox的数字游戏 一些事

Dropbox CEO德鲁·休斯顿(Drew Houston)

Dropbox CEO德鲁·休斯顿(Drew Houston)认为:“免费增值是一个数字游戏,所以要扔掉你的电子表格。关键在于寻找边际效益,应该挖掘一系列细微的价值,而不是单一的关键价值。”休斯顿还详细说明了如何利用搜索营销来吸引用户。该公司发现,像“在线存储”(online storage)这样的关键词价格都被炒得很高,而且长尾关键词都比较少。但是通过这些关键词访问该网站的用户却未必会选择附带更多存储空间和更多功能的付费服务。

这就意味着,一个价值数百美元的产品通过点击获得一个有效付费用户的成本会高达数千美元。因此有一段时期,如果用户通过搜索引擎访问Dropbox,该网站便会将免费选项隐藏起来,但却因此给用户带来了困扰,并严重影响到了用户体验。休斯顿说:“我们从中吸取的教训是,如果你采用了免费增值商业模式,你的营销成本便是免费用户。”他认为,在用户没有使用Dropbox前,他们并不知道自己需要这种服务。他说:“搜索可以被用于收集需求,而非创造需求。”

放弃了搜索营销的战略后,Dropbox却开始飞速增长。而该公司也意识到,用户推荐是其最大的增长来源,所以该公司便通过一项刺激计划鼓励用户相互推荐。休斯顿表示,这一举措使得注册用户增长了60%,在所有注册用户中,由他人推荐而来的用户占到30%。该公司目前投入了30%的工程资源,用于吸引活跃用户。

休斯顿还表示,由于该公司面向免费和付费用户推出了一项功能,允许用户毫无限制地撤销历史操作,因此消耗了大量的成本,而且这一数字还在不断增加。但实际上,很少有用户会真正用到这项功能,这就使得这一功能所产生的多数成本都被浪费了。但Dropbox在撤销这项免费功能时仍然比较谨慎。为了确保平稳过渡,他们公开询问用户的意向,让现有用户可以按照自己的需要保留这项功能。

Evernote的关键指标


Evernote公司CEO菲尔·力宾(Phil Libin)

Evernote是一个个性化笔记服务。该公司CEO菲尔·力宾(Phil Libin)表示,Evernote想要实现病毒式推广所面临的挑战是,它根本就不是一款社交产品。但Evernote可以着重从现有用户中获得最大价值。该公司于2008年6月成立,目前拥有270万用户,每天的新用户约为7000人。力宾表示,尽管缺乏社交功能,但该公司的多数用户都是通过口碑营销获得的。Evernote现有付费用户5万名,这些用户可以在多个平台上使用这一服务,同时获得其他一些增值服务。 一些事

Evernote的发展模式是,非活跃用户逐渐减少,活跃用户则逐渐开始付费。力宾表示,当Evernote公开寻求合作伙伴时,投资意向和合作请求便接踵而至。他说:“我们的主要收获是,用户增长的非常迅速,收入的增速更为迅速。”目前,该公司的用户以每月10%的速度递增,而收入的月均增速更是高达18%。力宾说:“我们的用户就像乳酪或红酒——年份越长越好。”一个月内注册的用户,只有0.2%转为付费用户,而一年内注册的用户中,则有2%转为付费用户。
力宾的关键指标是将每个活跃用户的收入与可变费用进行比较。从这一点来看,该公司每月从每名活跃用户那里获得的收入为0.25美元,但基础设施、客户服务和网络运营等可变费用约为0.09美元。他表示,只要具备以下三个条件,任何企业都可以采用免费增值模式:1)较高的长期用户保留率;2)一款随时间推移,价值不断增加的产品;3)拥有可变成本。 yixieshi

其他观点

Automattic CEO托尼·施奈特(Toni Schneider)和MailChimp CEO本·切斯纳特(Ben Chestnut)也补充了几点自己的经验。施奈特说,Automattic是一家博客软件公司,该公司针对不同的增值服务制定不同的价格,而没有采取分级打包的制度,这就使得他的团队和用户都能够获得更多的灵活性。他的公司目前有40%的收入来自增值服务,其余的收入则来自广告销售和企业产品。但他表示,该公司的模式所存在的问题是,由于难以逐一搞清所有的服务,因此用户有可能不知道自己可以获得哪些服务。 yixieshi

切斯纳特则表示,免费产品有可能会被滥用。MailChimp是一家有着十年历史的电子邮件营销企业,该公司7个月前刚刚推出了免费服务,用户随后增长了249%,邮件发送量也从此前的200万封增加到450万封,增幅达到225%。预计收入也将增加200%。但在此过程中同样碰到了一个问题:垃圾邮件等滥用行为增加了354%,而为了对付那些滥用系统的人,该公司的法律费用也增加了245%。幸运的是,MailChimp开发的系统能够自动处理部分问题。虽然早有准备,但免费增值模式带来的大规模滥用行为仍然令该公司有些意外。(书聿)