首页 文章 精选 留言 我的

精选列表

搜索[多租户],共10000篇文章
优秀的个人博客,低调大师

centos6 多段Ip添加shell脚本

#!/bin/bash export device=`ifconfig|grep eth0|head -n 1|awk '{print ($1)}'` export ipcfg_pre="/etc/sysconfig/network-scripts/ifcfg-eth1-range" awktmp=`mktemp` msg=`mktemp` ip_txt=`mktemp` ifcfgs="$(find ${ipcfg_pre%/*} -name ${ipcfg_pre##*/}*)" if test ! -z "$ifcfgs";then echo "发现如下已有配置文件是否删除(yes/no)?" echo "$ifcfgs" select var in "yes" "no" do if test "$var" = "yes";then rm -f $ifcfgs break; else break; fi done fi #脚本保存进 临时文件 不再使用a.awk文件。 cat >$awktmp <<EOF #!/usr/bin/awk -f BEGIN{ ipcfg_pre="${ipcfg_pre}" #你需要修改 ipcfg_pre 为自己的路径前缀 device=ENVIRON["device"] clone_num=1; numofpc[24]=253 numofpc[24]=125 numofpc[26]=61 numofpc[27]=29 numofpc[28]=13 numofpc[29]=5 } function ip_str(iplist){ return sprintf("%s.%s.%s.%s",ip_list[1],ip_list[2],ip_list[3],ip_list[4]); } function gen_mask(num,mask_bin, _ARGVEND_,sum,bits){ #把掩码由数字转换成数组 _i=1; mask_bin[1]=0; for (;_i*8 <=num && _i<=4;_i++){ mask_bin[_i]=255; } bits=num-(_i-1)*8; sum=0; for(;bits>0;bits--){ sum=sum+2^(8-bits); } mask_bin[_i]=sum; _i++; for(;_i<=4;_i++){ mask_bin[_i]=0; } } { ipfile=sprintf("%s%s",ipcfg_pre,NR); split(\$0,ip,"/"); ip_mask=ip[2]; split(ip[1],ip_list,"."); #ip_list 列表保存了 ip 的四个 字节值 ip_start=ip_list[4]+2; ip_end=ip_start+numofpc[ip_mask]-1; printf("DEVICE=%s\n",device)>ipfile printf("BOOTPROTO=static\n")>>ipfile printf("CLONENUM_START=%d\n",clone_num)>>ipfile ip_list[4]=ip_start; printf("IPADDR_START=%s\n",ip_str(ip_list))>>ipfile ip_list[4]=ip_end; printf("IPADDR_END=%s\n",ip_str(ip_list))>>ipfile clone_num+=numofpc[ip_mask]; printf("ONBOOT=yes\n")>>ipfile gen_mask(ip_mask,ip_list) netmask=ip_str(ip_list) printf("NETMASK=%s\n",netmask)>>ipfile } EOF chmod a+x $awktmp msg=`mktemp` cat >$msg <<EOF 请输入IP地址和掩码每行一行(不可出现空白行) 如: 45.34.89.40/29 23.91.3.0/28 23.91.8.32/28 23.91.18.160/28 23.91.28.128/28 EOF vi +":!cat $msg" $ip_txt #service network restart test -e $ip_txt && awk -f $awktmp $ip_txt service network restart rm -f $awktmp $msg $ip_txt rm -f ipcfg.sh ===================================================== 此脚本只适用于 45.34.89.40/29 23.91.3.0/28 23.91.8.32/28 23.91.18.160/28 23.91.28.128/28 这种格式IP段添加,请注意脚本网卡名称和机器网卡名称是否一致 使用方法,命名为ipcfg.sh 1. 会提示IP文件是否已经存在,让选择是否删除。我们只用于第一次添加。尽量不要去补充添加。 2. 按回车键,然后按 i 进入编辑模式,输入IP段。iP段一个一行,不要有空格。 保存。

优秀的个人博客,低调大师

利用 Android Studio 和 Gradle 打包多版本APK

在项目开发过程中,经常会有需要打包不同版本的 APK 的需求。 比如 debug版,release版,dev版等等。 有时候不同的版本中使用到的不同的服务端api域名也不相同。 比如 debug_api.com,release_api.com,dev_api.com等等。 不同的版本对应了不同的 api 域名,还可能对应不同的 icon 等。 如果每次都在打包前修改我们都手动来修改,这样实在是不够方便。 但如果我们使用了 Android Studio 和 Gradle,这个麻烦就可以轻松省去。 具体方式如下: 在 Android Studio 中打开 build.gradle(Module中)的 android 节点下添加如下代码 buildTypes { //这里的名字自定义,不要求大小写 release{ // 这里是在 applicationId 中添加了一个后缀。所以『.』要加上 applicationIdSuffix ".release" // 这里的作用是选择是否混淆代码 minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } dev{ applicationIdSuffix ".dev" minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } // 这里是为了不同过的版本设置一些特殊的参数,并不直接和 buildType 关联。 //例如:使用 buildType 中的 dev 版本,也可以使用 flavors_release 里面设置的自定义参数。这需要自己按照需求制定。 productFlavors{ //自定义名字不过不能和上面buildType中相同,不然Gradle编译会不通过。在这里使用了『flavors_』前缀以便区分。 flavors_release{ // manifestPlaceholders中写到的『str』,『package_name』不支持用大写,否则Gradle编译会不通过。 // 这里所设置的变量可以直接使用在『AndroidManifest.xml』中,使用方式为:${package_name} // android:label="${package_name}" manifestPlaceholders = [str:"releaseStr",package_name:"com.sunhz.mvptest.release"] // 这里的参数是为了在 java 代码中使用,具体的使用方式为:context.getResources().getString(R.string.strKey); resValue("string" , "strKey","releaseStrValue") } flavors_dev{ manifestPlaceholders = [str:"devStr",package_name:"com.sunhz.mvptest.dev"] resValue("string" , "strKey","devStrValue") } } 上面设置完成后,我们要在哪里使用它? 使用方式如下: 在 Android Studio 的工具栏中,找到『Build』项,找到『Generate Signed APK…』。 选择 Module -> 创建 APK key,或者输入 APK key密码 -> 关键来了!如下图。 在『BuildType』处,选择我们在 build.gradle 中设置的两个 BuildType,分别是releas,dev,debug。其中『debug』为 Android Studio 自带的。 在『Flavors』处,选择我们在 build.gradle 中设置的两个Flavors,以方便直接使用定义在 build.gradle 中自定义的参数。 所以! 上面我有提到说,buildType 和 Flavors 并没有直接的联系。 他们可以根据用户需求互相配合使用。如上图,BuildType 选择了 release,但 Flavors 选择的却是 flavors_dev。 到此基本的使用就全部说完了。 这里有一个问题,打出来的不同版本的包,全部都能够在同一部手机上安装,且能够将两个包全都发布到 Google 的市场上去这是为什么呢? 这里就要提到在 BuildType 中我们所设置的『applicationIdSuffix』属性了,按照这个属性的字面翻译为:『applicationId 的后缀』,那这里又来了一个问题,『applicationId』是什么? 其实这个『applicationId』属性,实际上在项目创建完成后就存在于 build.gradle 中。在 android 节点下的 defaultConfig 节点中。而且默认的 applicationId 和 AndroidManifest.xml 中的 package 属性相同。 如下图: 我们能够看到,这两个属性的默认值是相同的。 applicationId 和 packageName 它们是什么关系? 默认创建项目后,两者相同。如果需要根据不同的需求构建不同版本的APK,这时我们通过设置『applicationIdSuffix』可以做到。 这里有一个值得注意的现象。 举个例子,我们在打包时使用了 dev 类型,将打包出来的 APK 软件安装到手机中。 使用如下代码,获取我们手机上所有程序的packageName。 PackageManager packageManager = mContext.getPackageManager(); List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS); List<String> packageNameList = new ArrayList<String>(); for (PackageInfo packageInfo : packageInfoList) { packageNameList.add(packageInfo.packageName); } 我们打印出来的包名信息中,会出现 com.spencer_dev.test.dev 。并没有出现 com.spencer_dev.test 。 但是! 如果通过反编译工具,将 APK 包进行反编译直接查看源代码,在 java 代码所在的 src 目录中的包名,还和我们设置的一样,为 com.spencer_dev.test 。可 AndroidManifest.xml 中的 package 和 BuildConfig 类中的 APPLICATION_ID 已经变成了 com.spencer_dev.test.dev 。 applicationId 和 packageName 它们各自代表什么? 按照上面的结果来说, package 代表了 java 代码中的包名。 applicationId 代表了应用中的唯一标识。和应用签名一起用来区别和其他应用不同。我想这也就是为什么 Google 市场能够允许相同应用不同 applicationId 的原因。 长按下方二维码就可以识别关注 本文转自 小强测试帮 51CTO博客,原文链接:http://blog.51cto.com/xqtesting/1737795,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android SDK和N多Android开发资源

文章目录[点击展开](?)[+] 开发资源 本文收集整理Android开发需要的Android SDK、工具、Android开发教程、Android设计规范,免费的设计素材等。 欢迎大家推荐自己在Android开发过程中用的好用的工具、学习开发教程、用到设计素材, Android SDK在线更新镜像服务器 腾讯Bugly 镜像 腾讯Bugly 镜像:android-mirror.bugly.qq.com端口:8080 速度绝对的给力,公司宽带是广东电信,几乎达到满速。 大连东软镜像 大连东软信息学院镜像服务器地址:mirrors.neusoft.edu.cn端口:80 家里用的铁通光纤,使用腾讯的镜像速度时好时坏,但这个镜像倒是速度给力。 配置方法 项目地址 github:https://github.com/inferjay/AndroidDevTools 官网:http://www.androiddevtools.cn/ 其它:http://tools.android-studio.org/index.php 如果要下载Android Developer Tools(Eclipse开发Android应用),可以选择ADT Bundle,它包含了Eclipse、ADT插件和SDK Tools,是已经集成好的IDE,只需安装好Jdk即可开始开发,推荐初学者下载ADT Bundle,不用再折腾开发环境。 本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/5431255.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android -- ViewPager多页面滑动切换以及动画效果

背景 ViewPager。它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。这个附加包是android-support-v4.jar。 根据屏幕的分辨率和图片的宽度计算动画移动的偏移量 代码 viewpager.xml 界面设计很简单,第一行三个头标,第二行动画图片,第三行页卡内容展示。界面设计很简单,第一行三个头标,第二行动画图片,第三行页卡内容展示。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="100.0dip" android:background="#FFFFFF" > <TextView android:id="@+id/text1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:gravity="center" android:text="页卡1" android:textColor="#000000" android:textSize="22.0dip" /> <TextView android:id="@+id/text2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:gravity="center" android:text="页卡2" android:textColor="#000000" android:textSize="22.0dip" /> <TextView android:id="@+id/text3" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:gravity="center" android:text="页卡3" android:textColor="#000000" android:textSize="22.0dip" /> </LinearLayout> <ImageView android:id="@+id/cursor" android:layout_width="fill_parent" android:layout_height="wrap_content" android:scaleType="matrix" android:src="@drawable/a" /> <android.support.v4.view.ViewPager android:id="@+id/vPager" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1.0" android:background="#000000" android:flipInterval="30" android:persistentDrawingCache="animation" /> </LinearLayout> 我们要展示三个页卡,所以还需要三个页卡内容的界面设计,这里我们只设置了背景颜色,能起到区别作用即可。3个lay.xml,设置颜色不同。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:background="#1586FF" > </LinearLayout> 初始化头标 /** * 初始化头标 */ private void InitTextView() { t1 = (TextView) findViewById(R.id.text1); t2 = (TextView) findViewById(R.id.text2); t3 = (TextView) findViewById(R.id.text3); t1.setOnClickListener(new MyOnClickListener(0)); t2.setOnClickListener(new MyOnClickListener(1)); t3.setOnClickListener(new MyOnClickListener(2)); } 头标点击监听 /** * 头标点击监听 * */ public class MyOnClickListener implements View.OnClickListener { private int index = 0; public MyOnClickListener(int i) { index = i; } @Override public void onClick(View v) { mPager.setCurrentItem(index); } }; 以上功能就是点击第几个,就展示第几个页卡内容。 初始化ViewPager /** * 初始化ViewPager */ private void InitViewPager() { mPager = (ViewPager) findViewById(R.id.vPager); listViews = new ArrayList<View>(); LayoutInflater mInflater = getLayoutInflater(); listViews.add(mInflater.inflate(R.layout.lay1, null)); listViews.add(mInflater.inflate(R.layout.lay2, null)); listViews.add(mInflater.inflate(R.layout.lay3, null)); mPager.setAdapter(new MyPagerAdapter(listViews)); mPager.setCurrentItem(0); mPager.setOnPageChangeListener(new MyOnPageChangeListener()); } 我们将三个页卡界面装入其中,默认显示第一个页卡。这里我们还需要实现一个适配器。 ViewPager适配器 /** * ViewPager适配器 */ public class MyPagerAdapter extends PagerAdapter { public List<View> mListViews; public MyPagerAdapter(List<View> mListViews) { this.mListViews = mListViews; } @Override public void destroyItem(View arg0, int arg1, Object arg2) { ((ViewPager) arg0).removeView(mListViews.get(arg1)); } @Override public void finishUpdate(View arg0) { } @Override public int getCount() { return mListViews.size(); } @Override public Object instantiateItem(View arg0, int arg1) { ((ViewPager) arg0).addView(mListViews.get(arg1), 0); return mListViews.get(arg1); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == (arg1); } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { } } 这里我们实现了各页卡的装入和卸载。 页卡切换监听 /** * 页卡切换监听 */ public class MyOnPageChangeListener implements OnPageChangeListener { int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量 int two = one * 2;// 页卡1 -> 页卡3 偏移量 @Override public void onPageSelected(int arg0) { Animation animation = null; switch (arg0) { case 0: if (currIndex == 1) { animation = new TranslateAnimation(one, 0, 0, 0); } else if (currIndex == 2) { animation = new TranslateAnimation(two, 0, 0, 0); } break; case 1: if (currIndex == 0) { animation = new TranslateAnimation(offset, one, 0, 0); } else if (currIndex == 2) { animation = new TranslateAnimation(two, one, 0, 0); } break; case 2: if (currIndex == 0) { animation = new TranslateAnimation(offset, two, 0, 0); } else if (currIndex == 1) { animation = new TranslateAnimation(one, two, 0, 0); } break; } currIndex = arg0; animation.setFillAfter(true);// True:图片停在动画结束位置 animation.setDuration(300); cursor.startAnimation(animation); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } } 初始化动画 private void InitImageView() { cursor = (ImageView) findViewById(R.id.cursor); bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a).getWidth(); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int screenW = dm.widthPixels;// 获取屏幕分辨率宽度 offset = (screenW / 3 - bmpW) / 2; // 计算偏移量:屏幕宽度/3,平分为3分,如果是3个view的话,再减去图片宽度,因为图片居中,所以要得到两变剩下的空隙需要再除以2 Matrix matrix = new Matrix(); matrix.postTranslate(offset, 0); // 初始化位置,在中间 cursor.setImageMatrix(matrix); // 设置动画初始位置 } 根据屏幕的分辨率和图片的宽度计算动画移动的偏移量。 OnCreate函数 private ViewPager mPager;//页卡内容 private List<View> listViews; // Tab页面列表 private ImageView cursor;// 动画图片 private TextView t1, t2, t3;//页卡头标 private int offset = 0;//动画图片偏移量 private int currIndex = 0;//当前页卡编号 private int bmpW;//动画图片宽度 @Override protected void onCreate(Bundle savedInstanceState) { // TODO 自动生成的方法存根 super.onCreate(savedInstanceState); setContentView(R.layout.viewpager); InitImageView(); InitTextView(); InitViewPager(); } 简短不割 TranslateAnimation TranslateAnimation是移动的动画效果。它有三个构造函数,分别是: public TranslateAnimation(Context context,AttributeSet attrs) 略过 public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) 这个是我们最常用的一个构造方法, float fromXDelta:这个参数表示动画开始的点离当前View X坐标上的差值; float toXDelta, 这个参数表示动画结束的点离当前View X坐标上的差值; float fromYDelta, 这个参数表示动画开始的点离当前View Y坐标上的差值; float toYDelta,这个参数表示动画开始的点离当前View Y坐标上的差值; 如果view在A(x,y)点 那么动画就是从B点(x+fromXDelta, y+fromYDelta)点移动到C 点(x+toXDelta,y+toYDelta)点. public TranslateAnimation (int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue) fromXType:第一个参数是x轴方向的值的参照(Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF,or Animation.RELATIVE_TO_PARENT); fromXValue:第二个参数是第一个参数类型的起始值; toXType,toXValue:第三个参数与第四个参数是x轴方向的终点参照与对应值; 后面四个参数就不用解释了。如果全部选择Animation.ABSOLUTE,其实就是第二个构造函数。 以x轴为例介绍参照与对应值的关系: 如果选择参照为Animation.ABSOLUTE,那么对应的值应该是具体的坐标值,比如100到300,指绝对的屏幕像素单位。 如果选择参照为Animation.RELATIVE_TO_SELF或者 Animation.RELATIVE_TO_PARENT指的是相对于自身或父控件,对应值应该理解为相对于自身或者父控件的几倍或百分之多少。多试参数就明白了。 getLayoutInflater android允许我们在对话框中显示指定的xml文件,从而实现自定义对话框的效果。自定义的登录对话框。 XML <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/loginForm" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TableRow> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="用户名:" android:textSize="10pt" /> <!-- 输入用户名的文本框 --> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请填写登录帐号" android:selectAllOnFocus="true" /> </TableRow> <TableRow> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="密码:" android:textSize="10pt" /> <!-- 输入密码的文本框 --> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:password="true" /> </TableRow> <TableRow> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="电话号码:" android:textSize="10pt" /> <!-- 输入电话号码的文本框 --> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请填写您的电话号码" android:phoneNumber="true" android:selectAllOnFocus="true" /> </TableRow> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="注册" /> </TableLayout> Java bn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View source) { // 设置对话框的图标 builder.setIcon(R.drawable.tools); // 设置对话框的标题 builder.setTitle("自定义普通对话框"); //装载/res/layout/login.xml界面布局 TableLayout loginForm = (TableLayout)getLayoutInflater().inflate( R.layout.login, null); // 设置对话框显示的View对象 builder.setView(loginForm); // 为对话框设置一个“确定”按钮 builder.setPositiveButton("登录" , new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); // 为对话框设置一个“取消”按钮 builder.setNegativeButton("取消" ,new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); //创建、并显示对话框 builder.create().show(); } } 参考:http://blog.csdn.net/lizhenmingdirk/article/details/7345851 LayoutInflater 作用: 1、对于一个没有被载入或者想要动态载入的界面,都需要使用inflate来载入。 2、对于一个已经载入的Activity,就可以使用实现了这个Activiyt的的findViewById方法来获得其中的界面元素。 方法: Android里面想要创建一个画面的时候, 初学一般都是新建一个类, 继承Activity基类, 然后在onCreate里面使用setContentView方法来载入一个在xml里定义好的界面. 其实在Activity里面就使用了LayoutInflater来载入界面, 通过getSystemService(Context.LAYOUT_INFLATER_SERVICE)方法可以获得一个 LayoutInflater, 也可以通过LayoutInflater inflater = getLayoutInflater();来获得.然后使用inflate方法来载入layout的xml, @Override public void onClick(View v) { showCustomDialog(); } public void showCustomDialog() { AlertDialog.Builder builder; AlertDialog alertDialog; Context mContext = MainActivity.this; LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.custom_dialog, null); TextView text = (TextView) layout.findViewById(R.id.text); text.setText("Hello, Welcome to Mr Wei's blog!"); ImageView image = (ImageView) layout.findViewById(R.id.image); image.setImageResource(R.drawable.icon); builder = new AlertDialog.Builder(mContext); builder.setView(layout); alertDialog = builder.create(); alertDialog.show(); } 参考:http://blog.sina.com.cn/s/blog_629b701e0100rg4d.html 艹奥,还有几个忘记是哪参考来的了,不好意思没有写出来哈。 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3697233.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

使用PostgreSQL_Notify实现多实例缓存同步

Parallel与Hierarchy是架构设计的两大法宝,缓存是Hierarchy在IO领域的体现。单线程场景下缓存机制的实现可以简单到不可思议,但很难想象成熟的应用会只有一个实例。在使用缓存的同时引入并发,就不得不考虑一个问题:如何保证每个实例的缓存与底层数据副本的数据一致性。 分布式系统受到CAP定理的约束,分区一致性P是一般来说是不允许牺牲的,不可能让两个实例对同样的请求却给出不同的结果。用缓存是为了更好的性能,所以如果还要追求可用性A,就一定会牺牲C。我们能做的,就是通过巧妙设计让AP系统的一致性损失最小化。 传统方法 最简单粗暴的办法就是定时重新拉取,例如每个整点,所有应用一起去数据库拉取一次最新版本的数据。很多应用都是这么做的。当然问题也很多:拉的间隔长了,变更不能及时应用,用户体验差;拉的频繁了,IO压力大。而且实例数目和

优秀的个人博客,低调大师

移动医疗玩法多,纯线上模式难突破

过去一周对百度而言是难过的一周。 一场血友病吧被卖事件,让外界第一次认识到百度贴吧背负着沉重变现压力的事实,也让外界第一次意识到,贴吧对广大病患依然有着重要意义。同时,贴吧商业化所引发的争议,也显现出PC端医疗服务发展乏力的现状。 医疗从来都是一块难啃的骨头。 在PC互联网时代,健康类信息网站、问答社区、贴吧、搜索引擎等是患者寻求医疗资源和帮助的主要工具,但商业模式以及难以连接实体医疗服务是它们难以逾越的发展瓶颈。 与之相比,近年来兴起的移动医疗,具备能够连接医疗行业多方角色、打通实体医疗服务的特点。在PC互联网医疗遭遇发展困境的同时,用户的需求却有增无减,在此背景下,在模式上进行了更多创新和突破的移动医疗,有着更大想象空间。 纯线上模式难突破 诸多如蚂蚁菜(百度血友病吧吧主)这样的病患,将百度贴吧当成获取医疗信息、寻求康复之路的重要途径和精神寄托,在过去近十年的时间里,以百度搜索引擎以及百度贴吧为代表的PC端医疗服务,也确实为病患群体提供了获取医疗信息的工具和阵地。 然而,近期的贴吧危机已经释放出一个信号,即以PC承载互联网医疗的时代已经走到尽头。 一方面,PC时代的互联网医疗难以打通实体医疗服务。无论是百度的医疗类贴吧,还是此前发展不错的39健康网、有问必答网、120健康网等,都是单纯将医疗信息搬到线上,缺乏与实体医疗的联系。这种脱离实体医疗的服务类似无根浮萍,价值有限;而且容易沦为导流渠道,扭曲医疗价值。 另一方面,PC时代的互联网医疗服务难变现。PC端的医疗信息网站,以及如百度的医疗类贴吧等社区,存在信息良莠不齐的弊端。更严重的问题在于,单纯的医疗信息服务很难产生收益,因为一旦从医疗信息上谋求利益,很难在利益与伦理之间做到平衡,病种类贴吧被卖引发风波就是典型例子,而长期以来百度的医疗广告也受人诟病。 贴吧危机已经充分说明,PC承载医疗服务很难满足用户需求,但用户对医疗信息以及医疗资源的需求大量存在。同时,PC时代的互联网医疗难以建立健康的商业模式,发展后劲乏力。 PC互联网医疗乏力的同时,移动医疗在迅速发展。春雨医生创始人张锐认为,移动医疗已经进入成熟期,从用户使用的频次和情况来看,移动端已经远远超过了PC端。 在近年在线医疗热潮中成长起来的企业,尽管目前并不能提供颠覆性的就医体验,但与过往的PC在线医疗相比,移动医疗越来越向实体医疗行业靠近,也为开展更多服务提供了想象空间。 移动医疗的多种玩法 移动医疗实现的核心是医疗信息的开放与互通,比如智能硬件数据与患者就医数据结合,进行慢病管理、辅助医生诊断等。经过多年发展,移动医疗已经衍生出多种玩法。 以阶段分,移动医疗服务分为诊前、诊中、诊后几个阶段。以服务对象分,移动医疗可以分为面对患者的2C业务,以及面向医院、药企等医疗机构的2B业务。而以提供服务的方式来看,移动医疗又分为纯线上模式,以及线上线下相结合的O2O模式。 包括预约挂号、在线诊疗、医患在线沟通的在线就医服务是当前移动医疗行业的发展热点。除此之外,为患者与医生提供交流的诊后服务、医疗信息化、医疗智能硬件、慢病管理、医药在线流通、医疗大数据也是重要的发展方向。 卓健医生创始人尉建锋对腾讯科技介绍,以医院为中心往外延扩展,移动医疗大概可以分为四个层面。 第一种层面是围绕医院自身的信息系统HIS(Hospital Information System,医院内部对所有业务和业务全过程进行管理的信息管理系统)做文章,例如阿里云。2015年4月,阿里云联合东华软件,与西安国际医学中心建设的“云上医院”,其90%以上的院方后台信息系统布局在阿里云上。 由于医院非常重视核心信息的安全性、隐私保护,以及不同公司推出的HIS标准并不统一,联网难度大等原因,在HIS层面进行在线医疗尝试难度偏大,因而在这一层面进行尝试的企业也并不多。 第二个层面是在医院的HIS基础上,基于医院开放的HIS各模块开发接口,为医院提供互联网化的解决方案,比如电子化验单、电子病历开发、随访或者做远程指导;以及为医院间提供联网建设,例如卓健医生。 第三个层面是网络挂号,典型代表是微医集团(前挂号网)。 第四个层面更加外延,也是当前移动医疗创业者最集中的地方,为患者提供在线问诊,如春雨医生、趣医网等。 在这四个层面之外,围绕医疗行业本身,为医生群体、医院等医疗机构提供服务的企业,如丁香园,以及医药电商等也属于移动医疗的范畴。 不难看出,不同模式实质上都是围绕医疗本身,利用互联网做信息化的事情,而各家移动医疗企业,在主营业务之外也都在尝试更多新业务。 避导流 重连接 与PC时代的医疗服务相比,移动医疗的共同特点在于,它们不再单纯提供医疗信息,而是与真实的医疗服务产生了更加紧密的联合,从另一个角度理解,即移动医疗真正通过互联网,将医院、医生、患者等元素结合在了一起。 面对公立医疗资源信息化推进缓慢的现状,移动医疗服务商开始尝试进军线下。2015年,丁香园、春雨医生相继进军线下,开办线下诊所。 对于开办线下诊所的原因,李天天在接受腾讯科技采访时表示,做线下诊所是希望做医疗的连接器。表面上是一个诊所,但是诊所背后还有信息化、质量控制以及费用控制的系统。通过这样的诊所平台,丁香园希望连接五方(5P):医生、患者、医院、药企以及保险公司。 “我们希望五个P通过诊所平台连接起来,特别是最后的保险公司,因为中国的医保只管病。但是出院以后的健康、慢病管理是不看的。所以我们希望和商业保险,以及少部分医保结合起来,让流程真正连接起来。我们希望诊所,以及后面的支持系统能够变成一个连接器,让这几方的利益在这上面得到运转,并且得到共赢。” 张锐则表示,春雨医生从诞生到现在,从在线问诊、私人医生一路走来,虽然轻问诊服务得到用户的欢迎,但是轻问诊存在用户体验不完整,医学的安全性和科学性无法得到保障等问题,针对这些问题,春雨医生推出了私人医生服务,开办线下诊所,则是春雨医生解决用户体验不完整的对策。 打通线下的意义在于,如果移动医疗服务仍停留在纯线上,很难摆脱为线下导流的老模式。要摆脱导流的模式,建立线下实体医疗服务点,结合线上的互联网管理系统,连接起医疗行业的各个方面,或许是一个不错的尝试。 PC互联网上的医疗服务已经式微,但用户对互联网医疗的需求仍在增长。贴吧事件或许只是偶然发生的一个导火索,但在移动医疗不断尝试更多可能的趋势下,贴吧的危机,或许就是移动医疗的好机会。 本文转自d1net(转载)

优秀的个人博客,低调大师

纠结:为什么OpenStack有辣么多版本?

选择出最合适在你企业中运行的OpenStack版本,并不如它所述的那样简单。有没有相关的技巧可以尽快发现相关的信息? 为了确保你所安装的OpenStack可以与你想要运行的软件兼容,那么确定当前使用哪一版本的OpenStack是最重要的。然而,找出这些信息却并不轻松。 当运行Linux时,确定操作系统的版本并不难。每个Linux发行版都会向the或etc目录中写入一个文件,其中包含所使用的分发名称及其版本。使用the /etc/os发布的文件,你可以找出Linux发行版的关键信息。 但是,确定运行哪一版本的OpenStack却是一个挑战。由于它的进程与Linux发行版不同,它将更加复杂,尤其是OpenStack还要运行在它的最上层。然而,虽然没有统一的答案,但却有几种方法可以更好地了解的OpenStack版本。 最简单的方法之一是查询您的分发包使用的包管理器。例如,如果使用RDO分发在CentOS上安装OpenStack,yum repolist命令将显示当前正在使用的OpenStack存储库。由于所有的OpenStack 包都来自于OpenStack 库,这显示了你所使用的OpenStack版本号。 在CentOS安装RDO时,这一命令行的的结果如下: 如果使用包管理器安装OpenStack,即使上面的这一方法有效,但当你从Git库中直接安装它是,这一方法没有效果。如是上述方面无用,那么试试使用git branch –la命令行,看看使用了哪一个Git库。 如果上述所有的方法都没有反馈有用户的信息,你可以查询一下Nova,这一OpenStack组件在所有的OpenStack云中都可用。使用nova-manage --version命令获得版本号,如13.1.0。接下来,您需要在Nova项目的项目网页上查找此版本。在这一页面中,你将会看到13.1.0是Mitaka OpenStack版本的一部分。 本文转自d1net(转载)

优秀的个人博客,低调大师

深度学习要多深,才能读懂人话?

研究背景 阿里小蜜是阿里巴巴推出的围绕电商服务、导购以及任务助理为核心的智能人机交互产品,在去年双十一期间,阿里小蜜整体智能服务量达到643万,其中智能解决率达到95%,成为了双十一期间服务的绝对主力。阿里小蜜所使用的问答技术也在经历着飞速的发展,从最初基于检索的知识库问答演进到了最新的语义深度建模。 近期,阿里小蜜正在开展新的探索,让机器具有如同人一般的阅读理解能力,这将使得问答产品体现出真正的智能,进一步提升服务效率。 在问答技术中,最常见的是检索式问答,但存在很多的限制,例如,需要人工进行知识提炼,让机器在事先准备好的问答对基础之上进行检索。而我们经常需要对这样一段话进行提问: 5月18日,阿里巴巴集团发布了2017财年Q4财报和2017财年全年的业绩报告。财报显示,阿里巴巴集团2017财年的收入为1582.73亿元人民币,同比增长

优秀的个人博客,低调大师

初探阿里云存储网关(多图慎入)

初探阿里云存储网关 有幸第一时间拿到阿里云存储团队提供的存储网关内部测试版本,我第一时间进行了尝鲜,分享给大家,相信不久大家就能看到这款新产品。 大家都知道阿里云对象存储OSS,它不同于ECS的云盘,既能提供低廉的成本又能提供海量吞吐,高并发的访问。最重要的是利用对象存储oss,能搭建动静分离的系统架构,系统的扩展性和健壮性都比直接使用云盘高。但对象存储使用RESTful的接口才能使用,有一定的动手成本,而且如果原本的应用已经基于文件系统开发好,无法修改的话。就无法享受对象存储带来的一系列便利了。 而今天,我有幸试用的存储网关,能完美的解决这一问题。它可以帮助你像使用普通磁盘一样,挂载在您的计算节点上(ECS)。你瞬间拥有一个无限扩容的云盘空间,而只需要付出对象存储oss的价格。OK,我们来一

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册