Path特效之PathMeasure打造万能路径动效

今天我们一起利用 Path 做个比较实用的小例子;

上一篇我们使用 Path 绘制了一个小桃心,我们这一篇继续围绕着这个小桃心进行展开:

%title插图%num

 

————————————————–

如果对这个桃心绘制有问题或有兴趣的同学,可以链接到 Path相关方法讲解(二),此时我们的需求是这样的:

假定我们现在是一个婚恋产品,有一个“心动”的功能,用户点击“心动”按钮的时候,有一个光点快速的沿着桃心转一圈,然后整个桃心泛起光晕!

针对这个需求,很多人可能会想到以下方案:

不就一个光点沿着桃心跑一圈么,既然桃心是使用贝塞尔曲线画出来的,那么我们就可以用对应的函数模拟出这条曲线,然后算出对应位置上的点,不断将光点绘制到对应的位置上!

这个思路当然没有问题,但我们还有相对简单的方式,那就是使用 PathMeasure:

我们主要使用它两个方法:

1.getLength() – 获取路径的长度

2.getPosTan(float distance, float pos[],float tan[]) - path 为 null ,返回 false

distance 为一个 0 - getLength() 之间的值,根据这个值 PathMeasure 会计算出当前点的坐标封装到 pos 中;

上面这句话我们可以这么来理解,不管实际 Path 多么的复杂,PathMeasure 都相当于做了一个事情,就是把 Path “拉直”,然后给了我们一个接口(getLength)告诉我们path的总长度,然后我们想要知道具体某一点的坐标,只需要用相对的distance去取即可,这样就省去了自己用函数模拟path,然后计算获取点坐标的过程;

接下来,我们用代码实现这一效果:

我们先创建一个 PathMeasure ,并将创建好的 path 作为参数传入

 

  1. mPath = new Path();  
  2. mPath.moveTo(START_POINT[0], START_POINT[1]);
  3. mPath.quadTo(RIGHT_CONTROL_POINT[0], RIGHT_CONTROL_POINT[1], BOTTOM_POINT[0],
  4.         BOTTOM_POINT[1]);
  5. mPath.quadTo(LEFT_CONTROL_POINT[0], LEFT_CONTROL_POINT[1], START_POINT[0], START_POINT[1]);
  6. mPathMeasure = new PathMeasure(mPath, true);  

然后用一个数组纪录点的坐标:

 

  1. private float[] mCurrentPosition = new float[2];  

向外暴露一个开启动效的接口:

 

  1. // 开启路径动画
  2. public void startPathAnim(long duration) {
  3.     // 0 - getLength()
  4.     ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());  
  5.     Log.i(TAG, “measure length = ” + mPathMeasure.getLength());  
  6.     valueAnimator.setDuration(duration);
  7.     // 减速插值器
  8.     valueAnimator.setInterpolator(new DecelerateInterpolator());
  9.     valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
  10.         @Override
  11.         public void onAnimationUpdate(ValueAnimator animation) {
  12.             float value = (Float) animation.getAnimatedValue();  
  13.             // 获取当前点坐标封装到mCurrentPosition
  14.             mPathMeasure.getPosTan(value, mCurrentPosition, null);
  15.             postInvalidate();
  16.         }
  17.     });
  18.     valueAnimator.start();
  19. }

实时获取到当前点之后,将目标绘制到对应位置:

 

  1. protected void onDraw(Canvas canvas) {
  2.     super.onDraw(canvas);
  3.     canvas.drawColor(Color.WHITE);
  4.     canvas.drawPath(mPath, mPaint);
  5.     canvas.drawCircle(RIGHT_CONTROL_POINT[0], RIGHT_CONTROL_POINT[1], 5, mPaint);
  6.     canvas.drawCircle(LEFT_CONTROL_POINT[0], LEFT_CONTROL_POINT[1], 5, mPaint);
  7.     // 绘制对应目标
  8.     canvas.drawCircle(mCurrentPosition[0], mCurrentPosition[1], 10, mPaint);
  9. }

到这里目标环绕 path 的效果就ok了,不管这条路径简单也好,复杂也罢,我们都可以如此简单的完成对应的效果,而不需要自己用简单或复杂函数模拟求解了;

完成了一步,自己提的需求还有一点就是光晕的问题,这个东西如何是好呢?切图?! 不需要,Android 已经给我们提供了一个好用的东西 MaskFilter ,后面我就不做了,大家有兴趣自己做的玩玩,只需要注意一点,MaskFilter 不支持硬件加速,记得关掉!

好了,PathMeasure 看似很简单,但着实很有用,有了它,再结合上 Path 、Shader、ColorMatrix  等利器,我们已经可以做出很多酷炫的效果了!

*后,完整的代码献上,请笑纳:

 

  1. public class DynamicHeartView extends View {
  2.     private static final String TAG = “DynamicHeartView”;  
  3.     private static final int PATH_WIDTH = 2;  
  4.     // 起始点
  5.     private static final int[] START_POINT = new int[] {  
  6.             300, 270
  7.     };
  8.     // 爱心下端点
  9.     private static final int[] BOTTOM_POINT = new int[] {  
  10.             300, 400
  11.     };
  12.     // 左侧控制点
  13.     private static final int[] LEFT_CONTROL_POINT = new int[] {  
  14.             450, 200
  15.     };
  16.     // 右侧控制点
  17.     private static final int[] RIGHT_CONTROL_POINT = new int[] {  
  18.             150, 200
  19.     };
  20.     private PathMeasure mPathMeasure;
  21.     private Paint mPaint;
  22.     private Path mPath;
  23.     private float[] mCurrentPosition = new float[2];  
  24.     public DynamicHeartView(Context context) {
  25.         super(context);
  26.         init();
  27.     }
  28.     private void init() {
  29.         mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  
  30.         mPaint.setStyle(Style.STROKE);
  31.         mPaint.setStrokeWidth(PATH_WIDTH);
  32.         mPaint.setColor(Color.RED);
  33.         mPath = new Path();  
  34.         mPath.moveTo(START_POINT[0], START_POINT[1]);
  35.         mPath.quadTo(RIGHT_CONTROL_POINT[0], RIGHT_CONTROL_POINT[1], BOTTOM_POINT[0],
  36.                 BOTTOM_POINT[1]);
  37.         mPath.quadTo(LEFT_CONTROL_POINT[0], LEFT_CONTROL_POINT[1], START_POINT[0], START_POINT[1]);
  38.         mPathMeasure = new PathMeasure(mPath, true);  
  39.         mCurrentPosition = new float[2];  
  40.     }
  41.     @Override
  42.     protected void onDraw(Canvas canvas) {
  43.         super.onDraw(canvas);
  44.         canvas.drawColor(Color.WHITE);
  45.         canvas.drawPath(mPath, mPaint);
  46.         canvas.drawCircle(RIGHT_CONTROL_POINT[0], RIGHT_CONTROL_POINT[1], 5, mPaint);
  47.         canvas.drawCircle(LEFT_CONTROL_POINT[0], LEFT_CONTROL_POINT[1], 5, mPaint);
  48.         // 绘制对应目标
  49.         canvas.drawCircle(mCurrentPosition[0], mCurrentPosition[1], 10, mPaint);
  50.     }
  51.     // 开启路径动画
  52.     public void startPathAnim(long duration) {
  53.         // 0 - getLength()
  54.         ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());  
  55.         Log.i(TAG, “measure length = ” + mPathMeasure.getLength());  
  56.         valueAnimator.setDuration(duration);
  57.         // 减速插值器
  58.         valueAnimator.setInterpolator(new DecelerateInterpolator());
  59.         valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
  60.             @Override
  61.             public void onAnimationUpdate(ValueAnimator animation) {
  62.                 float value = (Float) animation.getAnimatedValue();  
  63.                 // 获取当前点坐标封装到mCurrentPosition
  64.                 mPathMeasure.getPosTan(value, mCurrentPosition, null);
  65.                 postInvalidate();
  66.             }
  67.         });
  68.         valueAnimator.start();
  69.     }
  70. }

以上代码的效果如下,其余效果大家自行补充:

%title插图%num

PathMeasure打造万能路径特效

移动端页面在IOS里滑动不顺畅解决办法

开发移动端的同学可能都知道,当在你用overflow-y:scorll属性的时候,内容超出容器溢出滚动的效果很迟顿,特别是在IOS系统里,通常情况下,我们为了追求好的用户体验,会使用屏幕滚动插件better-scroll了,这个插件是真心好用,但是有些情况下我们可能并不想那么麻烦,而且页面的体验要求也没有那么高,下面给大家介绍一个简单偷懒的办法.

这时候可以使用-webkit-overflow-scrolling:touch这个属性,让滚动条产生滚动回弹的效果,就像ios原生的滚动条一样流畅

%title插图%num

%title插图%num

简单说明一下:

-webkit-overflow-scrolling :控制元素在移动设备上是否使用滚动回弹效果。
auto:使用普通滚动, 当手指从触摸屏上移开,滚动会立即停止。
touch:使用具有回弹效果的滚动, 当手指从触摸屏上移开,内容会继续保持一段时间的滚动效果,继续滚动的速度和持续的时间和滚动手势的强烈程度成正比。

需要注意的事项:

通过动态添加内容撑开容器,结果根本不能滑动。
在safari上,点击其他区域,再在滚动区域滑动,滚动条无法滚动。
在safari上,使用了-webkit-overflow-scrolling:touch之后,页面偶尔会卡住不动。

解决问题的方法:

*步:将使用-webkit-overflow-scrolling的元素的定位取消或手动改成position:static;
第二步:将使用-webkit-overflow-scrolling的元素添加一个子元素,设置子元素的高度为height:101%,或者为了精确一些写成height:calc(100vh + 1px),注意这个加号前后都要有空格.

移动端调试(ios手机safari+chrome调试(windows))

1、ios手机连接到pc

设置手机safari 设置-》safari-》高级-》打开web检查器 (授权调试功能)

2.、安装ios_webkit_debug_proxy

根据文档,在windows下,首先需要安装scoop,而安装scoop需要电脑里有powershell。win10一般自带。

2.1 安装scoop(一个安装工具)

set-executionpolicy unrestricted -s cu #修改执行策略,选择是
iex (new-object net.webclient).downloadstring(‘https://get.scoop.sh’) #安装scoop
2.2 通过scoop安装ios_webkit_debug_proxy

scoop bucket add extras
scoop install ios-webkit-debug-proxy
3、连接测试

确认手机已连接pc,输入

ios_webkit_debug_proxy -f chrome-devtools://devtools/bundled/inspector.html
在localhost:9221中查看设备连接情况,此时可看到连接设备的地址。

%title插图%num

在chrome://inspect/#devices添加设备端口,在红圈处进行添加。

%title插图%num

%title插图%num

此时手机通过safari访问网页,刷新chrome://inspect/#devices,多试几次,将在target可以看到如下:

%title插图%num

点击inspect,就可看到调试界面了。(你在手机上的操作在调试界面都可以看到)

4、注意事项

点击inspect可能看到的是空白,是因为在使用时需要*下载一个插件,所以需要pc能够*(*次)。

另外也可能是缓存的原因,需要清理。(chrome://appcache-internals/#、手机safari的缓存)

iOS中有关正则表达式的使用

//身份证号码验证
#pragma 正则匹配用户身份证号15或18位
-(BOOL)checkUserIdCard: (NSString *) idCard
{
NSString *pattern = @”(^[0-9]{15}$)|([0-9]{17}([0-9]|X)$)”;
NSPredicate *pred = [NSPredicate predicateWithFormat:@”SELF MATCHES %@”, pattern];
BOOL isMatch = [pred evaluateWithObject:idCard];
return isMatch;
}
#pragma 正则匹配手机号
+ (BOOL)checkTelNumber:(NSString *) telNumber
{
NSString *pattern = @”^1+[3578]+\\d{9}”;
NSPredicate *pred = [NSPredicate predicateWithFormat:@”SELF MATCHES %@”, pattern];
BOOL isMatch = [pred evaluateWithObject:telNumber];
return isMatch;
}

#pragma 正则匹配用户密码6-18位数字和字母组合
+ (BOOL)checkPassword:(NSString *) password
{
NSString *pattern = @”^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}”;
NSPredicate *pred = [NSPredicate predicateWithFormat:@”SELF MATCHES %@”, pattern];
BOOL isMatch = [pred evaluateWithObject:password];
return isMatch;
}

#pragma 正则匹配用户姓名,20位的中文或英文
+ (BOOL)checkUserName : (NSString *) userName
{
NSString *pattern = @”^[a-zA-Z一-龥]{1,20}”;
NSPredicate *pred = [NSPredicate predicateWithFormat:@”SELF MATCHES %@”, pattern];
BOOL isMatch = [pred evaluateWithObject:userName];
return isMatch;

}

#pragma 正则匹员工号,12位的数字
+ (BOOL)checkEmployeeNumber : (NSString *) number
{
NSString *pattern = @”^[0-9]{12}”;

NSPredicate *pred = [NSPredicate predicateWithFormat:@”SELF MATCHES %@”, pattern];
BOOL isMatch = [pred evaluateWithObject:number];
return isMatch;

}

#pragma 正则匹配URL
+ (BOOL)checkURL : (NSString *) url
{
NSString *pattern = @”^[0-9A-Za-z]{1,50}”;
NSPredicate *pred = [NSPredicate predicateWithFormat:@”SELF MATCHES %@”, pattern];
BOOL isMatch = [pred evaluateWithObject:url];
return isMatch;

}

判断字符串是否是数字:
NSString *pattern = @”^[0-9]*$” ;
NSPredicate *pred = [ NSPredicate predicateWithFormat : @”SELF MATCHES %@” , pattern];
BOOL isMatch = [pred evaluateWithObject :str];
return isMatch;

iOS中浅淡UIApplication单例

在iOS的操作系统中 每一个程序都对应一个application单例,每一个application都对应一个Appdelegate代理,在代理中控制程序的各个状态。我们在程序中获取Application单例:[UIApplication sharedApplication].当进行有关该应用的相关操作设置时需要获取,进行响应的操作。比如:

1、应用之间的调用和跳转

打开电话:[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:[NSStringstringWithFormat:@”tel://%@”,_PersonPhoneStr]]];

打开邮箱:[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@”mailto://devprograms@apple.com”]];打开短信:[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@”sms://466453″]];

打开浏览器[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@”http://itunesconnect.apple.com”]];

也可以打开自己指定的程序:首先必须要知道要打开的程序所制定的url协议,然后再本程序中调用以下方法:[[UIApplication sharedApplication] openURL:

%title插图%num

 

[NSURL URLWithString:@”要打开的软件协议名称://”]];

比如:创建A程序,我在A程序中的info.plist中制定对外程序打开A程序的url协议:

然后再A程序的appdelegate中实现:

-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{

if([[url

scheme] isEqualToString:@”myapp”]){

return

YES;

}

return

NO;

}。在B程序中调用以下方法打开A程序:[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@”myapp://”]];

如果想传参数直接在//后面加就可以。

2、设置appIcon图标上的红色提示数字。

在ios8以后加入了用户权限的判断,在程序启动时首先执行:

float version = [[[UIDevice currentDevice] systemVersion] floatValue];

if (version >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];

[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

}

然后在程序任何地方可以通过以下代码设置角标:

UIApplication *app=[UIApplication sharedApplication];

app.applicationIconBadgeNumber=123;

当使用推送时相应的应该会有一个全局变量表示当前角标的数量,当在后台收到推送时应该在+1,当程序打开时应该把此角标变量设置为0.

3、在状态栏中显示网络加载。
UIApplication *app=[UIApplication sharedApplication];

app.networkActivityIndicatorVisible=YES;

4、管理状态栏

iOS中管理状态栏有两种方式:1、使用UIApplication进行全局设置:首先在info.plist的文件中加入: 然后在程序中调用以下代码:

UIApplication *app=[UIApplication sharedApplication];

[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

2、在每个界面中都可以对状态栏进行控制:在Viewcontroller中重写以下两个方法:

#pragma mark-设置状态栏的样式

-(UIStatusBarStyle)preferredStatusBarStyle

{
//设置为白色

//return UIStatusBarStyleLightContent;

//默认为黑色

return UIStatusBarStyleDefault;

}

#pragma mark-设置状态栏是否隐藏(否)

-(BOOL)prefersStatusBarHidden

{
return YES;

}

 

iOS中允许后台应用程序刷新在开发中的注意事项

系统根据你对软件的使用频率,定期在后台唤醒它。唤醒的表示形式就想你在前台操作一样。这时会自动加载相应的数据,来刷新界面。当用户再进来后看到的界面是*新的数据,不用再去加载,比较耗流量和电。如果不想使用可以在设置-通用-后台应用程序刷新中关闭。

iOS苹果的定位

苹果的定位是通过CoreLocation模块来实现的。

以下是一个定位的Demo。

//

// AppleLocationSingle.m

// bk

//

// Created by jie on 16/4/5.

// Copyright © 2016年 jie. All rights reserved.

//

#import “AppleLocationSingle.h”

#import <UIKit/UIKit.h>

@implementation AppleLocationSingle

//定位管理的懒加载

-(CLLocationManager *)locationManger{

if (!_locationManger) {

_locationManger=[[CLLocationManager alloc]init];

_locationManger.delegate=self;

_locationManger.desiredAccuracy = kCLLocationAccuracyBest;

/*

当设置为*优的时候,苹果会根据你的精度distanceFilter大小来决定*好的方式满足你的精度。GPS*精确,其次是蜂窝基站三角定位,然后是Wifi通过网络运营商的数据库得到的数据

*/

_locationManger.distanceFilter = 20;//一般是能控制在20米的精度(当系统检测到你的位置没有远离上个位置20米时是不会调取你的代理)

[_locationManger requestAlwaysAuthorization];//处于后台的情况下也可以定位。

[_locationManger startUpdatingLocation];

}

//判断用户是否允许当前程序使用定位服务

if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined || [CLLocationManager authorizationStatus]==kCLAuthorizationStatusRestricted||

[CLLocationManager authorizationStatus]==kCLAuthorizationStatusDenied) {

//用户不允许该程序定位

UIAlertView *tip=[[UIAlertView alloc]initWithTitle:@”提示” message:@”用户不允许定位!” delegate:self cancelButtonTitle:@”确定” otherButtonTitles:nil, nil];

[tip show];

}

return _locationManger;

}

– (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{

switch (status) {
case kCLAuthorizationStatusNotDetermined:{

NSLog(@”kCLAuthorizationStatusNotDetermined”);

break;

}

case kCLAuthorizationStatusRestricted:{

NSLog(@”kCLAuthorizationStatusRestricted”);

break;

}

case kCLAuthorizationStatusDenied:{

NSLog(@”kCLAuthorizationStatusDenied”);

break;

}

case kCLAuthorizationStatusAuthorizedAlways:{

NSLog(@”kCLAuthorizationStatusAuthorizedAlways”);

break;

}

case kCLAuthorizationStatusAuthorizedWhenInUse:{

NSLog(@”kCLAuthorizationStatusAuthorizedWhenInUse”);

break;

}

default:

NSLog(@”没有这种状态啊”);

break;

}

}

– (void)locationManager:(CLLocationManager *)manager

didUpdateLocations:(NSArray<CLLocation *> *)locations{
NSLog(@”开始更新位置”);

NSLog(@”位置数组:%@”,locations);

CLLocation *currentLocation=locations[0];

NSString *str=[NSString stringWithFormat:@”当前的坐标:%f–%f”,currentLocation.coordinate.latitude,currentLocation.coordinate.longitude];

UIAlertView *tip=[[UIAlertView alloc]initWithTitle:@”定位” message:str delegate:self cancelButtonTitle:@”确定” otherButtonTitles:nil, nil];

[tip show];

}

– (void)locationManager:(CLLocationManager *)manager

didFailWithError:(NSError *)error{
NSLog(@”定位失败:%@”,error);

}

@end

國際企業的國內業務,除了青雲有甚麼服務器選擇?

App API 類,不用 Port 80 , 5Mbps 帶寬,多線是必需的,單電信單聯通的不考慮。

阿里雲的選址比較好,但由於不支持國際支付,應該無望了。

暫時青雲看來比較可以接受,但只能選北京及廣東,主要業務國內在華東長三角地區。

由於會由國外伺服器統一控制,所以希望國際帶寬好一點,*好有三 IP (電信,聯通,移動),但 BGP 單 IP 不能選出口也能接受。

起始預算在 100 美元/月。

36 条回复    2016-07-16 19:31:18 +08:00

kennylam777
    1

kennylam777   2016-06-15 20:05:04 +08:00 via Android

似乎我發錯版塊了,應該在雲計算那邊發的
wevsty
    2

wevsty   2016-06-15 20:07:26 +08:00

阿里云应该是可以国际支付的吧?
走支付宝的话应该是可以直接用 VISA 卡付款的,而且阿里云也有国际版
和阿里云类似的腾讯云也不错,可以考虑下
dzxx36gyy
    3

dzxx36gyy   2016-06-15 21:23:49 +08:00 via Android

阿里云请访问 intl.aliyun.com ,支持 paypal 和信用卡支付
cevincheung
    4

cevincheung   2016-06-15 21:31:44 +08:00

首先用谁都行,千万别用阿里云。
http://www.amazonaws.cn/
http://aws.amazon.com/

其实香港的线路就可以吧

kennylam777
    5

kennylam777   2016-06-15 21:40:54 +08:00

@cevincheung 嗯,阿里雲的國際頁面打不開,只會重導到國內版的,其實我自己就有在用阿里雲,用國內電話登記的,只能靠國內銀行打款,我自己有但公司實在沒辦法,所以要提升到公司用的級別,必須解決國際支付問題。

也有考慮過香港天翼雲,但是要用同時來管理一堆內網節點,打算架 * 把各個節點連起來統一管理(不用翻到國外),所以必須國內。

與外國服務器的溝通不用即時的,定時更新就好,不想挑戰牆。

shiji
    6

shiji   2016-06-15 22:02:22 +08:00 via Android

@kennylam777 你要用国外 ip ,隐身模式下打开阿里云的国际版。否则都会重定向到中文版
kennylam777
    7

kennylam777   2016-06-15 22:08:02 +08:00

@shiji 謝, 成功了, 在公司的機用一般香港 IP 都不行, 真的要隱身模式, 可能因為之前登入過國內版吧
explon
    8

explon   2016-06-15 22:13:11 +08:00 via iPhone

@kennylam777 AWS 国内访问很不顺畅,别听它们鬼扯!
kennylam777
    9

kennylam777   2016-06-15 22:13:36 +08:00

嗯, 再加一項: 英文管理介面, 我會中文但同事不一定, 英文也是必需的.

暫時青雲及阿里雲都過關
吐嘈一下青雲, 在英文版登記時只有國內電話才收到 SMS, 阿里雲國內版都能掛香港電話了

kennylam777
    10

kennylam777   2016-06-15 22:14:24 +08:00

@explon 當然, 我們公司 SoftLayer 及 AWS 都有用, 就是因為國際出口不行才堅持要弄一台國內主機
yexm0
    11

yexm0   2016-06-15 22:20:44 +08:00

aws 绕路绕成这个鬼样居然还有人推介?
%title插图%num
aveline
    12

aveline   2016-06-15 22:31:10 +08:00 via iPhone

来安利一发自家的 yunduo.io
三线三 IP ……
kennylam777
    13

kennylam777   2016-06-15 22:34:21 +08:00

@aveline 這不錯啊, 但能解決國際支付不? 有三 IP 的話中文介面也算了……
aveline
    14

aveline   2016-06-15 22:38:42 +08:00 via iPhone

@kennylam777 好像没启用 Paypal ,我回去加一下。
后台是 SolusVM ,所以…… 好像只有英文版没有中文版 ?

另外机房的网关没有那么智能,需要自己配置 ip rule ,有配置例子,可以找客服获取。

explon
    15

explon   2016-06-15 22:42:36 +08:00 via iPhone   ❤️ 1

czkwg8
    16

czkwg8   2016-06-15 22:43:48 +08:00

Azure HK 访问效果也还可以吧
不过不知道价格方面能不能接受了
kennylam777
    17

kennylam777   2016-06-15 23:12:58 +08:00

@explon 這貨只能用國內或美國電話, 個人用戶只能用 Chinese National ID 登記, 香港玩不了…..
kennylam777
    18

kennylam777   2016-06-15 23:40:49 +08:00

@explon 只要是國際用戶, 不寫護照號也行, 反而美國注冊身分好辦, 而且 GPN 5Mbps 免費頻寬回香港,雖然要兩台機但還是有吸引力的, 穩定的 5Mbps 就很好用了
kennylam777
    19

kennylam777   2016-06-16 00:23:45 +08:00

CDS GPN 真的好用, 在這個時間 ChinaNet 北京入口 抽風時, 還能穩定的做出 北京 <-> 香港 35ms @ 5Mbps , 這樣的速度很足夠我的用途了,因為我們的後台同步工作可以分散時段來慢慢做完
Showfom
    20

Showfom   2016-06-16 02:20:19 +08:00

阿里云有国际版
ericFork
    21

ericFork   2016-06-16 05:51:47 +08:00

@aveline 看一半就想到这个了,然后真的出现了.
abel163
    22

abel163   2016-06-16 10:58:37 +08:00

國際帶寬好一點?机房还要在国内,似乎只有国内电信双向 cn2
kennylam777
    23

kennylam777   2016-06-16 15:10:55 +08:00

@abel163 其實首都在線那個 GPN 方案已經很夠用,到了香港主機後的國際頻寬不用管,反正我們主要的伺服器都放香港,和首都在線的香港主機之間連線很快。我不介意在香港多放一台機,經 GPN 把北京主機接回香港。

國內 CN2 難找啊,還要國際支付不太現實,沒有 GPN 方案的話我就會買阿里雲香港 B 區 /天翼雲香港來做中國專用的接口,然後國內用普通的 BGP 主機就可以。

kennylam777
    24

kennylam777   2016-06-16 18:31:10 +08:00

好啦,*後選定了 CDS ,因為 GPN *給力。

多謝收看。

mandymak
    25

mandymak   2016-06-24 20:19:45 +08:00

@kennylam777 CHing 可否 post 一下 CDS 的 speed 数据?之前测了一下体验不太好。
kennylam777
    26

kennylam777   2016-06-27 01:33:37 +08:00

@mandymak 我只測兩台主機之間用 GPN 連接的速度, 沒測過跨境 Internet (例如 ChinaNet 到香港節點的速度), 因為不需要。

5M GPN 內網用 iperf3 測出 4.5Mbps 左右, ping 長期保持在 36ms 左右不變。

kennylam777
    27

kennylam777   2016-06-27 17:49:44 +08:00

@mandymak 今天香港 CDS 節點幾乎像斷開了的, traceroute 過去在 upstream 的 PCCW/HGC 後掉包,在 CDS AS 開始掉。

可能被打了…..

mandymak
    28

mandymak   2016-06-27 19:07:27 +08:00

@kennylam777 谢谢!不过我发现这两天 CN2 似乎有点不稳,你用 HGC 连大陆快吗?
cq65617875
    29

cq65617875   2016-06-30 12:44:40 +08:00

@mandymak UCLOUD 就是 HGC 的 效果不错 但是韩国访问不能
kennylam777
    30

kennylam777   2016-06-30 16:03:11 +08:00

@aveline 公司不用云朵,但我自己買了一台玩玩。

選好了 Termination date 是 End of billing cycle 的,但第二天被回收了?才用了一個星期!你要跟我談談英語理解嗎?

本來打算買一年期更高配置的,但現在我不敢買!

mandymak
    31

mandymak   2016-06-30 16:30:34 +08:00

@cq65617875 我这几天试试看,谢谢!
kennylam777
    32

kennylam777   2016-06-30 17:09:49 +08:00

@mandymak 我公司有在用 HGC 商業寬頻,一般偏慢吧,大部份香港 ISP 連 ChinaNet PoP 都會有繁忙時間掉包的問題,這似乎是 ChinaNet 問題居多,*少沒有一家本地 ISP 的海外線路會在繁忙時間嚴重掉包。
aveline
    33

aveline   2016-06-30 17:44:52 +08:00

@kennylam777 … 啊我刚点的 Accept ,不知道是现在就回收
mandymak
    34

mandymak   2016-06-30 19:39:08 +08:00

@kennylam777 我也有在用 HKBN 商业 BB ,可能真的是 ChinaNet 的问题。(师兄其实你在港坛会见到我:))
zoudeze
    35

zoudeze   2016-07-09 00:51:38 +08:00 via iPhone

@kennylam777 个人建议, cn2 香港节点(具体么野主机自己稳啦,或者打电话去中国电信海外问,专线, btw 价钱就贵到七彩); hicloud (台湾中华电信自建机房,大陆电信,联通访问还好,价钱不高, visa 支付);国内的主机可以考虑用在上面搭建 ss ,然后微林加速转发(厦门的 cn2 转发,大概 ping 也就 50 ) , *后废话一大堆,
kennylam777
    36

kennylam777   2016-07-16 19:31:18 +08:00

@zoudeze 又唔係用黎翻牆上網, 仲要搞埋台灣 Hinet ??? 咁搞法我直接用 GIC 香港+北京 啦

專線我問過, 一般 VPS 咁用佢*多都係叫你用電信雲國際版, 至於點對點專線遲啲先考慮, 見好多人講就算係中信 /*線都唔一定穩定。

服务器延迟多少算合理

*近使用 AWS 的 LoadBalancers, 发现服务器延迟在 80 毫秒左右,这个时间算长吗?多少才比较合理?

延迟 AWS 服务器 合理5 条回复 • 2016-07-07 15:39:05 +08:00
fengxing 1
fengxing 2016-07-07 14:17:11 +08:00
看地点,看线路
yuxing1171 2
yuxing1171 2016-07-07 14:20:59 +08:00
@fengxing 是内网, 服务器到负载均衡服务器的延迟。
pangliang 3
pangliang 2016-07-07 15:32:43 +08:00
看你需要抗多少 QPS…

负载均衡这个机器的*大并发连接数基本上是固定的;
延迟越高, 则整体 QPS 越低;

简单的*端的例子:
负载匀衡*大连接数 1000
负载匀衡 到 内网业务处理 延迟 80ms, 业务处理需要 20ms
那么整体的 QPS 就是 10000
pangliang 4
pangliang 2016-07-07 15:35:24 +08:00
所以如果你要抗的 qps 只有 1000 ……80ms 没问题啊

不过…内网 80ms…有点高, 基本都是个位数
3dwelcome 5
3dwelcome 2016-07-07 15:39:05 +08:00 via Android
也许是机房故意的、你速度太快、就占了同机房别人的带宽、干脆大家都慢。这样负载均衡服务器之间相互满速 24 小时同步数据、都没人管你。

日志服务器用 ELK 还是 Graylog2 好?

要处理的日志有: Nginx, Java log4j, Python gunicorn stdout, Mysql 等,单行和多行的日志都有,看了下 ELK ,它对多行日志(比如 Java 异常打印日志)处理比较麻烦,还有原始日志不做保留,但 ELK 应用*多, Graylog2 同样是开源,用的相对少一些。

想请教下 V 友,你们实际使用的感受,两者推荐选择哪一下呢?两者有哪些坑要注意的?

谢谢
日志 elk graylog2 Java5 条回复 • 2016-07-11 21:05:43 +08:00
server 1
server 2016-07-11 16:45:49 +08:00
elk 能给你的不仅仅是日志
coagent 2
coagent 2016-07-11 17:09:07 +08:00
@server 嗯, ELK 里的组件还有其他用途,我目前只需要用它做日志。 Elasticsearch 我们也用来存生产数据,比如订单数据。
xi4oh4o 3
xi4oh4o 2016-07-11 20:42:14 +08:00 ❤️ 1
Logstash + Filebeat 规则写好了,多行也没什么问题
fangpeishi 4
fangpeishi 2016-07-11 21:04:31 +08:00 ❤️ 1
graylog 查詢的時候非常爽,看樓主你自己的側重點吧,如果只是查詢,然後簡單的統計( graylog 有 dashboard ),同事也有郵件報警功能之類的。而且部署起來非常簡單。你提到的那幾種日子,都有現成的插件,或者用 graylog-collector 收集都可以。
ELK 不太瞭解,不過 graylog-web (現在都和 graylog-server 和一起了)易用性應該甩 Kibana 好幾條街。

前段時間翻譯過一篇文章,有興趣可以看看,包含一些 ES 入門的坑。
: http://fangpeishi.com/elasticsearch-for-logging_zh.html
fangpeishi 5
fangpeishi 2016-07-11 21:05:43 +08:00
有些錯別字,抱歉:

graylog 查詢的時候非常爽,看樓主你自己的側重點吧,如果只是查詢,然後簡單的統計( graylog 有 dashboard ),同時也有郵件報警功能之類的。而且部署起來非常簡單。你提到的那幾種日誌,都有現成的插件,或者用 graylog-collector 收集都可以。
ELK 不太瞭解,不過 graylog-web (現在和 graylog-server 合一起了)易用性應該甩 Kibana 好幾條街。

前段時間翻譯過一篇文章,有興趣可以看看,包含一些 ES 入門的坑。