首页 文章 精选 留言 我的

精选列表

搜索[数据库知识开放麦],共10000篇文章
优秀的个人博客,低调大师

工作中的一些知识总结

判断h5页面是否App内打开 HybridMethod.isApp() 跳转 部分功能已封装至srcstatich5jsjshybridcomponent.js,可以直接调用 页面跳转 topage为跳转页面地址,若下表未给出目标页参数,topage直接为目标链接地址,否则为目标页参数 方法一 RainbowBridge.callMethod('JsInvokeAppScope', 'forward', { type: 'h5Web', //跳转类型native或h5Web或h5Native topage: 'showMallShake' }); 方法二 <div data-forwardBox> <div data-forwardNoRight-topage="<% webpath.h5 %>/help/qalist.html?q=0&a=2" data-forwardNoRight-title="产品计划" data-forwardNoRight-type="h5Web">加入的计划是如何计息和派息的?</div> </div> 弹窗 RainbowBridge.callMethod('JsInvokeAppScope','showAlert',obj,function(result){}) 显示loading loading:function(status){ RainbowBridge.callMethod('JsInvokeAppScope','loading',{status:status}); }, 弹出ActionSheet showThemeDialog:function(obj){ //参数是一个对象,只有一个属性dialog,属性值是一个数组,数组每项又是一个对象,分别有两个属性:link,title RainbowBridge.callMethod('JsInvokeAppScope','showThemeDialog',{ dialog : obj.dialog }); }, 结束刷新 RainbowBridge.callMethod('JsInvokeAppScope','endIntegralLoad',{}); 跳转登陆页 if(HybridMethod.isApp()) { RainbowBridge.callMethod('JsInvokeAppScope', 'goLogin'); } else { var _index = window.location.href.indexOf('event'); window.location.href = HybridParams.pc + '/event/login.html?backUrl=' + window.location.href.substring(_index); } 跳转注册页 if(HybridMethod.isApp()){ RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'register' }) }else{ window.location.href = HybridParams.pc + '/event/register/beginnerwelfare/indexh5.html'; } or RainbowBridge.callMethod('JsInvokeAppScope','goRegister',{}); 跳转到app页面的时候可以给页面添加标题和其他文字 if(HybridMethod.isApp()){ RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'register', UIHeader: { title: "分享领奖", //标题 right:{ //标题栏右边的显示 type:"word",//类型文字word或类型icon图片或share content:"中奖记录",//内容为文字或icon图片地址 action:{ //这个type点击后的跳转 type: 'h5Web',//跳转类型native或h5Web或h5Native topage: LOCATIONORIGIN + '/integral/prizeRecord.html', UIHeader:{ //点击后侧type内容跳转后的页面显示 title:"中奖记录"//标题 } } } } }) }else{ window.location.href = HybridParams.pc + '/event/register/beginnerwelfare/indexh5.html'; } 跳转个人中心 if(HybridMethod.isApp()){ RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'user' }) }else{ window.location.href = HybridParams.h5 + "/download"; } 跳转投资页 if (HybridMethod.isApp()) { RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native', topage: 'invest' }); }else{ window.location.href = HybridParams.h5 + "/download"; } 已登录跳转到首页,没登录跳转到登录页 if(HybridMethod.isApp()){ if(HybridParams.token){ RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'home' //首页 }) }else{ RainbowBridge.callMethod('JsInvokeAppScope','goLogin'); } }else{ window.location.href= HybridParams.h5+'/download/'; } 跳转到充值 RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'recharge' }) 跳转到账户安全(设置页面) RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'showSettingActivity' }) 跳转到积分商城 RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'native',//跳转类型native或h5Web或h5Native topage: 'showMall' }) 关闭当前页面 if(HybridMethod.isApp()) { RainbowBridge.callMethod('JsInvokeAppScope','finish'); } 跳转到提现页面 var _li = $(this).closest('li'); if(HybridMethod.isApp()){ //这个页面已经不用了 RainbowBridge.callMethod('JsInvokeAppScope','goForwardWithParams',{ type : 'withdraw', lhhnum : '提现值' }); } 其他跳转例子 if(HybridMethod.isApp()){ var topage = params.h5 + "/user/bonus_receive.html?rcode="+rcode; RainbowBridge.callMethod('JsInvokeAppScope','forward',{ type: 'h5Web',//跳转类型native或h5Web或h5Native topage: topage, UIHeader:{ //跳转后页面的显示 title:"好友邀你领红包",//标题 } }); }else{ window.location.assign(params.h5 + "/user/bonus_receive.html?rcode="+rcode); } 设置当前页的标题 if(HybridMethod.isApp()){ RainbowBridge.callMethod('JsInvokeAppScope','setWebTitle',{ title: 'demo3-sub页面一前端设置当前页的标题', }); } 其他跳转总结: "experianceInvest"; 体验标投资"feedback"; 意见反馈"aboutUs"; 关于我们"myNotice"; 公告"message"; 消息 "myPrivilege"; 我的特权"productDetail"; 计划详情 -------------需要参数 参数key : id"getMoreByInvite";// 跳转多邀多的;页面为H5 但是因为有二级页面参数不好跳转 , 走本地页面流程"showMallShake"; //积分商城摇一摇 页面为H5 但是因为有二级页面参数不好跳转 , 走本地页面流程"moneyRecord";//资金明细 帮助中心功能 app内h5页面是否有“下拉刷新”功能 & “上拉加载更多”功能 type:1 下拉 type:2 上拉 type:3 both两个都有 RainbowBridge.callMethod('JsInvokeAppScope','setRefeshType',{ type : 1 }) 显示通用弹出框 var refreshdata = { "type": 9, "message": "线下充值可能延至48小时到账建议使用在线通道充值", "largebuttontext": "返回在线充值", "extraclicktext": "继续刷新余额", }; 复制操作 RainbowBridge.callMethod('JsInvokeAppScope','copyContent',{content:content}); 复制邮箱 $('.kefu_email').click(function(){ var txt = $(this).find('span').text(); HybridMethod.invokeEmail(txt); }) 调起邮箱 invokeEmail:function(email){ RainbowBridge.callMethod('JsInvokeAppScope','invokeEmail',{email:email}); } 粘贴到剪贴板 copyH5Content:function(content){ RainbowBridge.callMethod('JsInvokeAppScope','copyH5Content',{content:content}); } 复制微信号 $('.ylb_weixin').click(function(){ HybridMethod.copyH5Content('yonglibao'); }) 跳转在线客服界面 $('.kefu_online').click(function(){ RainbowBridge.callMethod('JsInvokeAppScope','toContactUs'); }) 拨打电话 $('.ylb_phone').click(function(){ HybridMethod.toCallUs('400-615-5566'); }) or toCallUs:function(phone){ RainbowBridge.callMethod('JsInvokeAppScope','toCallUs',{phone:phone}); }, 照相机 camera:function(callback){ RainbowBridge.callMethod('JsInvokeAppScope','camera',{},callback); } 判断android和ios isAndroid: function(){ var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端或者uc浏览器 return isAndroid; }, isIOS: function(){ var u = navigator.userAgent; var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 return isiOS; } 获取APP版本号 getAppVersion: function(){ var that = this; if(HybridMethod.isApp()){ RainbowBridge.callMethod('JsInvokeAppScope','getAppVersion',{},that.getAppVersionCallBack); } else{ window.location.href= HybridParams.h5+'/landing/'; } }, //获取APP版本号回调 getAppVersionCallBack: function(result){ var that = this; // result = { version: '5.1.4' }; alert('版本号为'+result.version); } 下载app function weixin(){ var ua = navigator.userAgent.toLowerCase(); //navigator是HTML中的内置对象,包含浏览器的信息;userAgent是navigator的属性方法,可以返回由客户机发送服务器的头部的值,作用就是返回当前用户所使用的是什么浏览器,toLowerCase()是将转换为小写 return ua.match(/MicroMessenger/i)=="micromessenger"; }; function ios(){ return /(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent); } function downloadway(){ var self = this; if(!weixin()){ $('.download-btn').attr("href","http://a.app.qq.com/o/simple.jsp?pkgname=com.yonglibao.android"); }else if(ios()){ $('.download-btn').attr('href','https://itunes.apple.com/us/app/yong-li-bao-tou-zi-li-cai/id874240991?l=zh&ls=1&mt=8'); $('.download-btn').click(function(){ ga('send', 'event', '下载', 'iOS', { 'metric3': 1 }); }); }else{ //android $.ajax({ type:"POST", dataType:"json", url:params.url + '/option/getConfig', success:function(response){ console.log(response) if(response.code == 1000){ $("#device-browser").html("Andriod"); $('.download-btn').attr("href","https://yonglibao-app.oss-cn-hangzhou.aliyuncs.com/yonglibao_" + response.data.updateVersion.android_channel_version + ".apk"); $(".download-btn").click(function(){ ga('send', 'event', '下载', '安卓', { 'metric3': 1 }); }); }else{ alert(response.msg); } }, error:function(response){ alert(response.msg); } }) } } 分享 不需要回调的右上角分享 share: function () { var self = this; if (HybridMethod.isApp()) { //右上角分享 RainbowBridge.callMethod('JsInvokeAppScope', 'setShare', { 'needShare': 1 // 1: 需要分享按钮(默认); 2: 不需要分享按钮 }); HybridMethod.showAndSetRightShareBtn({ title: '“辞旧辞旧迎新送金喜 新榜提名赢好礼', content: '年终盛宴,延续惊2018鸿运当投,品牌金饰天天送,上榜更有豪礼拿,苹果手机 、投资金条、2018现金大红包,就等你来!', imgUrl: "https://pc104.ylb.net//event/2017/newyear/images/share.jpg", needShare: 1, shareUrl: "http://pc104.ylb.net/event/2017/newyear/index.html", useDefault:0, //0:分享内容由前端自定义;1:分享内容由app抓取 stayWhich: 'wechat,wx,qq', //分享支持哪几种方式;朋友圈,微信,qq delayShare:1, //延迟分享,默认为0,即调用方法就分享,为1时即只传分享的参数,不立即分享,用户点击默认分享按钮时才分享 isNeedCreate: 1 }); } } 需要回调的右上角分享 share: function () { var self = this; if (HybridMethod.isApp()) { //右上角分享 RainbowBridge.callMethod('JsInvokeAppScope', 'setShare', { 'needShare': 1 // 1: 需要分享按钮(默认); 2: 不需要分享按钮 }); HybridMethod.showAndSetRightShareBtn({ title: '“辞旧辞旧迎新送金喜 新榜提名赢好礼', content: '年终盛宴,延续惊2018鸿运当投,品牌金饰天天送,上榜更有豪礼拿,苹果手机 、投资金条、2018现金大红包,就等你来!', imgUrl: "https://pc104.ylb.net//event/2017/newyear/images/share.jpg", needShare: 1, shareUrl: "http://pc104.ylb.net/event/2017/newyear/index.html", callback: self.shareCallBack }); } }, // 分享回调 shareCallBack: function (res) { //在分享后点击返回永利宝会给res传值1,所以必须在分享后点击返回永利宝才成功 if (res == 1 && !this.isAct1End) { var zhis = this; $.ajax({ url: HybridParams.url + '/activity/ShareOpportunity', type: 'POST', headers: { 'Authorization': HybridParams.token }, dataType: 'json', success: function (res) {}, error: function (e) {}, complete: function () {} //ajax请求完成后执行 }); } } 页面中按钮分享 RainbowBridge.callMethod('JsInvokeAppScope','share',{ title: 'demo1页面中的分享按钮', content: 'demo1页面中的分享按钮', useDefault:0, stayWhich: 'wechat,qq', imgUrl:HybridParams.pc + '/event/2017/sharedemo/images/demo1.png', shareUrl:HybridParams.pc + '/event/2017/sharedemo/demo1.html?a=1&b=2\#asd', }); 微信分享 我们项目中用到的微信分享方法的调用; var weixin = require("../modules/weixin.jdk.js");//调用微信jdk weixin.config({ title: "标题", desc: "内容", imgUrl: 图片地址, link: 链接地址' },false); 积分商城 积分记录明细页面:https://h5.yonglibao.com/integral/integralRecord.html 登录状态通过url传参 参数名 描述 类型 token 用户登录token String dbnewopen 新窗口打开 Number App-H5相关 名称 链接 银行限额 https://h5.yonglibao.com/limit/limit.html 平台数据 https://h5.yonglibao.com/platformdata/dataindex.html 通过获取url参数定义相关页面跳转参数 比如:http://www.yonglibao.com/?towhichpage = produky var id = that.GetQueryString('towhichpage')||'', native = '', topage = '', id = '', number = '', title = '' if(id == 'produky'){//跳产品页 native = true; topage = productDetail; id = id; number = 2; }else if(id == 'baidu'){//跳百度页面 native = false; topage = 'http://www.baidu.com'; title = '百度一下'; }else if(id == 'recharge'){//跳充值页 native = true; topage = 'recharge'; } 安卓端 if (native == 'false') { window.location.href = 'yonglibao://JsInvokeAppScope:10025/forward?{"type":"web","topage":"'+ topage +'","UIHeader":{"title":"'+title+'"}}"'; }else{ if(str != ""){ window.location.href ='yonglibao://JsInvokeAppScope:10025/forward?{"type":"native","topage": "'+topage+'","params":{"'+id+'" : "'+number+'"}}'; }else{ window.location.href = 'yonglibao://JsInvokeAppScope:10025/forward?{"type":"native","topage":"'+ topage +'"}'; } } ios终端 if (native == 'false') { window.location.href = 'yonglibao://JsInvokeAppScope?port=10025&forward={"type":"web","topage":"'+ topage +'","UIHeader":{"title":"百度一下"}}"'; }else{ if(str != ""){ window.location.href ='yonglibao://JsInvokeAppScope?port=10025&forward={"type":"native","topage": "'+topage+'","params":{"'+id+'" : "'+number+'"}}'; }else{ window.location.href = 'yonglibao://JsInvokeAppScope?port=10025&forward={"type":"native","topage":"'+ topage +'"}'; } } 感悟:闲谈莫论他人非,每个人都有自己的思维,只有合不合适,没有对不对,不要把自己的观点强加给别人

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

Android——进程通信/ AIDL/Message相关知识总结贴

Android 多进程通信 http://www.apkbus.com/android-83462-1-1.html Android 跨进程通信(一) http://www.apkbus.com/android-2393-1-1.html Android 跨进程通信(二) http://www.apkbus.com/android-2394-1-1.html Android 中 AIDL 实现(跨进程通信) http://www.apkbus.com/android-15211-1-1.html Android 进程间通信 http://www.apkbus.com/android-91355-1-1.html Android 系统进程间通信 Binder 机制 http://www.apkbus.com/android-112500-1-1.html 使用AIDL实现进程间的通信 http://www.apkbus.com/android-114839-1-1.html Android进程间通信(IPC)机制Binder简要介绍和学习计划 http://www.apkbus.com/android-99739-1-1.html 服务组件的进程间通信模型 http://www.apkbus.com/android-83850-1-1.html 使用AIDL实现进程间的通信之复杂类型传递 http://www.apkbus.com/android-114840-1-1.html 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client http://www.apkbus.com/android-99743-1-1.html android 组件间的交互和进程间 IPC 通信 http://www.apkbus.com/android-20707-1-1.html Android 之 Binder与进程间通信 http://www.apkbus.com/android-43314-1-1.html Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析 http://www.apkbus.com/android-99747-1-1.html Android进程间通信--消息机制及IPC机制实现 http://www.apkbus.com/android-3944-1-1.html 本文转自qianqianlianmeng博客园博客,原文链接:http://www.cnblogs.com/aimeng/p/3298609.html ,如需转载请自行联系原作者

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

Linux基础知识汇总(1)...持续更新中

1 2 3 4 5 6 7 8 9 linux启动流程: { 1. BLOS 识别硬件,自我测试,导向MBR 2. MBR 提供菜单选择系统项 , grup 3. Boot loader kernel 与 加载内存及检测硬件情况 4. 内核文件 加载init进程 基本命令 ls , cp , 其他软件加载到内存中 5. 配置文件 /etc/rc .d /rc .sysinit 6. 执行服务的启动 7. 加载 /etc/rc .d /rc . local } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 shell特殊符号: { # 注释 \ 转义 | 管道 用于数据定向 cat etc /passwd | cut -d: -f1 ; 分隔符 ~ 用户根目录 $ 变量符号 & 作业控制 ! 非 / 目录符号 >> > 数据输出 < << 数据输入 '' "" `` () {} } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 shell脚本编程: (用于系统维护,自动化管理,检测) { 习惯良好的编程习惯 #!/bin/bash 作为起始描述. 定义变量 declare -i num=1 declare -s str= "sss" 执行shell脚本 source xxx.sh(父进程中执行,可更新配置文件) bash xxx.sh bash -x xxx.sh 执行调试 输入 read -p "" var 输出 echo -e (格式化输出) 字符的作用 '' 只做字符的引用 "" 还可做变量的引用 `` 命令做执行结果 测试包含: 1. 数字测试 2. 字符测试 3. 文件测试 1.数字测试 -gt -lt - ge - le - eq - ne 可用中括号完成 2.字符测试 == =~ 正则匹配测试 != -n 判断字符是否为空 null位真 -z 可用两对中括号完成 3.文件测试 -e 存在 -f 普通文件 -d 目录 -b 块设备 -c 正则表达式字符设备 -S socket文件 -p FIFO文件 (键盘设备??) -L 连接文件 可用中括号完成 -nt file1是否比file2新? -ot file2是否比file2旧? -ef 两个文件的inode号是否一致 4.文件权限测试 -r -w -x 多条件判断 && || ! 个人倾向 [ a ] && [ b ] 可有: [[ a && b ]] [ a && y ] 变量分类: 本地变量 可由用户定义,只能在当前的上下文中使用,其他shell均没有权限 定义 num=1 但在使用的时候 $1 局部变量 $? 当前命令执行的状态 环境变量 比如shell脚本第一句导入,就是环境变量,当前的shell可以访问环境变量 比如$path 位置变量 #1 #2 #2 与shell脚本执行的参数变量 特殊变量 $ #(参数个数) $@(总参数列表) 算数运算: let sum +=2 流程控制: if [ conditions ]; then fi if [ conditions ]; then else fi if [ conditions ]; then elif [ conditions ]; then else fi case $1 in "a" ) ;; "b" ) ;; *) ;; esac for $i in 列表; do done 列表生成 1. for i in 1 6 8; 2. for i in /usr/log/ * 3. for i in {0..10} for i in ` seq 1 10 1` for i in ` seq 1 $line 2` for (( i=0; i<n; i++ )); do done while [ conditions ]; do done while read line; do done < /etc/passwd until [ !conditions ]; do done 函数定义: function name() { echo $1 } name 1 shift : 参数轮替 } 1 2 3 4 5 6 7 8 9 10 11 shell特性重定向: { 每一个命令都支持支持最基本的linux标准输入和输出 ls /etc/passwd 可将信息输出到用户频幕上 . /a .txt < /etc/passwd . /a .txt << /etc/passwd 讲信息输入到a ?? cat /etc/passwd > . /a .txt >> 可以在 set -C 禁止覆盖 &> 和错误也定向输出 cat /dev/zero > /dev 清空硬盘 ls /etc &> /dev/null 讲错误定向到null区域 双向重定向 tee 输出屏幕和文件 tee 后一般是文件 } 1 2 3 4 5 6 7 8 9 10 11 12 13 shell命令: { cat 输出 ll = ls -l who 谁在线 cut 讲信息进行切割 cut -d ' ' -f1 (-d 切割字符 -f 获取切割段) grep 对文件进行正则匹配查找 ( grep "" 文件 / cat /etc/passwd | grep "" ) last 最后登陆信息 20条 export 打印当前用户的环境 sprt 排序 sort -t '' -k 3 (-t 切割字符 -k 切割后的条件) uniq 排除重复 wc -c -l (字符数 , 文件行数) tr '[A-Z]' '[a-z]' 大小写转换 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 shell常用目录或文件: { /etc/passwd 账户信息 /dev/null null黑洞 /dev/zero zero0用于填充磁盘 /etc/rc .d /rc .init 启动信息 /etc/vimrc ~/.vimrc vim配置信息 /proc/partitions 分区信息 /proc/cpuinfo /proc/meminfo cpu meminfo信息 /etc/fstab 挂载点信息(可更新) /proc/mounts 详细 /etc/mtab /proc/sys/vm/swapiness 内存策略 是否启用交换分区 /etc/mdadm .conf 阵列配置信息 /proc/mdstat 整列设备信息 /dev/rc .d /rc .sysinit 开机启动项 /etc/sysconfig/network-scripts/ifcfg-eth0 网络配置 /etc/yum .conf /etc/yum .repos.d/* 软件源配置 /etc/issue 欢迎信息 /boot/grup 引导器 /boot/grup/menu .lst 引导列表 /etc/man .config man 文档匹配 /etc/profile .d 脚本配置目录 /usr/include 头文件目录 /etc/ld .so.conf.d/ 库文件所在 /proc/meminfo 内存信息 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 vim的使用: { 模式: 编辑模式 默认 /esc 命令模式 : 输入模式 i 可视模式 v 按键: 编辑模式 gg 移动 ^ h j k l $ 可与数字配合 10j G ZZ 退出 dd 删除整行 d o 新插入一行 yy 复制整行 y p 粘贴 J 合并行 u 还原 ctrl+r 撤销 r 替换一个字符 CTRL+w s 窗口分割 可视模式 v V 选择块 行 命令模式 / 搜索 :n,md 从n到m删除 :n,ms/原内容( 可正则)/ 新内容 /g :wq 保存退出 :q! 强制退出 设置: nu ai sm 括号匹配 syntax 语法 其他问题: 编码: 可设置当前主机 LANG= 断行符: UNIX2dos -k 文件 dos2UNIX -k 文件 语系编码转换: iconv -f 原编码 -t 现编码 filename newfilenamew } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 磁盘管理: 新建普通 { 磁盘有物理和逻辑结果组成(机械式) 物理结构: 扇区 512KB 物理结构最小单位 扇面 柱面 分区最小单位 (千层饼??) 在磁盘的第一个扇区 有446KB的MBR主引导 分区表64KB (16*4) 2KB标识位 逻辑结构: 磁盘被分为许多block, inode 众多的block组成了block group -> super block,文件描述信息,inode talbe,block bitmap,inode bitmap,block 文件描述信息: 描述上述东西的存在 super block: 描述block,inode数量 使用量 block: 最小逻辑单位 1K 2K 4K inode: 记录block12个block的位置 共128byte 一般情况下拥有12个直接 1一个间接 1个双间接 1个三间接 block bitmap: 记录block的使用情况 inode bitmap: 记录inode的使用情况 常见文件系统格式: 基本: ext2 ext3 ext4 Reiserfs(小) JFS vfat xfs(大) 集群: GFS2 , OCFS2 网路: NFS , smbfs 光盘: ISO9660 交换分区: SWAP 分区磁盘分为两种情况: 1, 已存在系统 kpartx -i /dev/sda kpartx -af /dev/sda partx -a /dev/sda 2, 新磁盘 操作: 查看 cat /proc/partitions 磁盘信息 1. 分区 fdisk sfdisk parted 2. 格式化 mkfs mkfs.exts mk2efs (在格式化也可对文件系统调整) 3. 信息查看/调整 blkid (格式化后文件系统信息) dumpe2fs (超级块信息) tune2fs (调整文件系统选项) e2label (改变label) hdparm (硬件信息) resize2fs (从新调整大小) 4. 检测 fsck e2fsck 5. 交换分区 mkswap swapon /off 6. 挂载 mount umount (手动,开机) 过程中需要使用到的信息 fuser 挂载占用 df 磁盘空闲状态 du 目录评估占用 dd 填充 ln 链接 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 磁盘管理: raid { HBA 查看机器raid情况 /proc/mdstat raid的出现是为了 1.提高 读 a 写 b 速度 2. 容错能力 3. 备份 4.利用率 5. 至少数量 raid 0 yes no no 100 2 raid 1 1a yes yes 50 2 raid 5 yes yes no n-1 /n 3 raid01 1a yes yes n-2 /n 4 raid10 yes yes yes n-2 /n 4 jbad 连接磁盘 实例:创建一个空间大小为10G的RAID5设备,要求其chunk大小为1024K,格式经为ext4文件系统,开机可自动挂载至 /backup 目录,并支持acl功能; mdadm -C /dev/md0 -a yes -l 5 -n 4 -c 1024K /dev/sdb /dev/sdc /dev/sdd /dev/sde # 只有阵列完毕才可以格式化 mkfs -t ext4 /dev/md0 #调整绝大数磁盘信息 tune2fs -o acl /dev/md0 可以调整目录的label的名字 e2label /dev/md0 "xxxx" dumpe2fs -h /dev/md0 #编辑/etc/fstab /dev/md0 /backup ext4 defaults 0 0 UUID=5dc72528-30ef-44cd-a38f-7fd0ee176a46 /backup ext4 defaults 0 0 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 磁盘管理: LVM { LVM: 逻辑卷管理器(可弹性管理磁盘策略) 扩容不需要停止业务 缩容需要停止业务 分区之后的物理盘加入到卷组中(逻辑概念)之后假如逻辑卷(中间多了一个中间层,由内核驱动完成,内核提供了这样的中间层) 流程: 1. 将需要假如LVM的磁盘格式化 2. pvcreate /dev/sd {a-z} 3. vgcreate -s 16M vgname /dev/sd {a-z} 4. lvcreate -L 容量 lvname vgname 5. 挂载 /dev/vgname/lvname 动态其他操作: 1. 扩容 先扩大物理容量,再逻辑容量 2. 缩小 先缩小逻辑容量,再物理容量 练习: 1、创建一个由两个物理卷组成大小为20G的卷组myvg,要求PE大小16M;而后新建 大小为7G逻辑卷mylv1,要求其文件系统为ext4,块大小为2048,且开机能自动挂载至 /users ; 2、新建用户openstack,其家目录为 /users/openstack ,而后切换至openstack用户,复制一些文件至其家目录中; 3、缩减mylv1至5G大小;而后切换至openstack用户,确保其数据没有丢失; 4、对mylv1创建快照卷snap-mylv1,并通过其备份数据至 /tmp/user . tar .bz2; #1 pvscan pvcreate /dev/sd {b,c} pvdisplay vgcreate -s 16M test /dev/sd {b,c} vgscan vgdisplay lvcreate -L 7G -n mylv test mkfs -t ext4 /dev/test/mylv tune2fs -r 2048 /dev/test/mylv vi /etc/mdadm .conf ARRAY /dev/md0 UUID=5dc72528-30ef-44cd-a38f-7fd0ee176a46 #编辑/etc/fstab /dev/md0 /backup ext4 defaults 0 0 UUID=5dc72528-30ef-44cd-a38f-7fd0ee176a46 /backup ext4 defaults 0 0 #2 useradd openstack -d /users su openstack cp -rf /var/ * /users #3 pvdisplay umount /dev/test/mylv e2fsck -f /dev/test/mylv resize2fs /dev/test/mylv 5G mount /dev/test/mylv /users lvresize -L 5G /dev/test/mylv #4 快照 lvcreate -L 50M -s -n mylv-snap /dev/test/mylv mkdir /snap mount /dev/test/mylv-snap /snap tar -jcf /snap/ * > /tmp/user . tar .bz2 tar -jcv -f /tmp/user . tar .bz2 /snap/ } 1 2 3 4 5 6 7 8 9 10 11 12 13 压缩,归档工具: { 这里包含压缩和归档的过程,两个在这里就不区分了,因为使用非常简单 tar -c 创建压缩/归档文件夹 -x 解压压缩/归档文件 -f 欲解压压缩的文件或包 -j 对应使用 gzip 压缩工具 -z 对应使用 bzip2 压缩工具 -J 对应使用xz压缩工具 - v 查看解压压缩过程 实例 在解压和压缩的过程 j J z 都可以省略 自动判断后缀选择压缩工具 tar -xf nginx-1.4.2. tar .gz 解压 tar -cf axel-2.4. tar .bz axel-2.4/ 压缩 } 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1362564 ,如需转载请自行联系原作者

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

【iOS知识学习】_iOS动态改变TableView Cell高度

在做tableView的时候,我们有时候须要依据cell的高度动态来调整。近期在网上看到一段代码不错。跟大家Share一下。 在 -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{ 类中获取cell的高度: CGSize boundSize = CGSizeMake(216, CGFLOAT_MAX); cell.textLabel.text = @"12345678900123456789"; cell.userInteractionEnabled = NO; cell.textLabel.numberOfLines = 0; CGSize requiredSize = [cell.textLabel.text sizeWithFont:[UIFont systemFontOfSize:13] constrainedToSize:boundSize lineBreakMode:UILineBreakModeWordWrap]; CGRect rect = cell.frame; rect.size.height = requiredSize.height+5; cell.frame = rect;这时候获取到了cell的高度,然后在 - (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath { 类中改变cell的高度: UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; NSLog(@"cell height %f",cell.frame.size.height); return cell.frame.size.height; 这样以来cell的高度就依据cell里label的内容自己主动改变啦。 其主要出发点就是我有一个label。然后我要把这个label展示出来。我依据字体的大小还有行数来获取一个高度,这样cell的高度就有啦。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5350356.html,如需转载请自行联系原作者

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

spark入门知识和job任务提交流程

spark是Apache开源社区的一个分布式计算引擎,基于内存计算,所以速度要快于hadoop. 下载 地址spark.apache.org 安装 复制一台单独的虚拟机,名c 修改其ip,192.168.56.200 修改其hostname为c,hostnamectl set-hostname c 修改/etc/hosts加入对本机的解析 重启网络服务 systemctl restart network 上传spark安装文件到root目录 解压spark到/usr/local下,将其名字修改为spark 本地运行模式 使用spark-submit提交job cd /usr/local/spark ./bin/spark-submit --class org.apache.spark.examples.SparkPi ./examples/jars/spark-examples_2.11-2.1.0.jar 10000 使用spark-shell进行交互式提交 创建root下的文本文件hello.txt ./bin/spark-shell 再次连接一个terminal,用jps观察进程,会看到spark-submit进程 sc sc.textFile("/root/hello.txt") val lineRDD = sc.textFile("/root/hello.txt") lineRDD.foreach(println) 观察网页端情况 val wordRDD = lineRDD.flatMap(line => line.split(" ")) wordRDD.collect val wordCountRDD = wordRDD.map(word => (word,1)) wordCountRDD.collect val resultRDD = wordCountRDD.reduceByKey((x,y)=>x+y) resultRDD.collect val orderedRDD = resultRDD.sortByKey(false) orderedRDD.collect orderedRDD.saveAsTextFile("/root/result") 观察结果 简便写法:sc.textFile("/root/hello.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).sortByKey().collect 使用local模式访问hdfs数据 start-dfs.sh spark-shell执行:sc.textFile("hdfs://192.168.56.100:9000/hello.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).sortByKey().collect (可以把ip换成master,修改/etc/hosts) sc.textFile("hdfs://192.168.56.100:9000/hello.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).sortByKey().saveAsTextFile("hdfs://192.168.56.100:9000/output1") spark standalone模式 在master和所有slave上解压spark 修改master上conf/slaves文件,加入slave 修改conf/spark-env.sh,export SPARK_MASTER_HOST=master 复制spark-env.sh到每一台slave cd /usr/local/spark ./sbin/start-all.sh 在c上执行:./bin/spark-shell --master spark://192.168.56.100:7077 (也可以使用配置文件) 观察http://master:8080 spark on yarn模式 本文转自 ChinaUnicom110 51CTO博客,原文链接:http://blog.51cto.com/xingyue2011/1968175

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

Linux 小知识翻译 - 「i386」是什么?

i386是指 *CPU* 的种类,也可以指 *CPU* 的架构(architecture)。 现在的 CPU 一般都用 「Core 2 Duo」或者「Athlon」,「Xeon」,「Opteron」之类的比较酷的名称来称呼。 Linux诞生的时候,CPU作为一个重要的组件,一般用型号来称呼它。 i386的i代表 Intel。 Intel公司最先生产的,从4004开始的CPU系列中,386(80386)是第一个32位的CPU。 Linux刚开始就是作为386架构上兼容POSIX的内核来开发的。之后CPU的性能虽然越高,但是一直都兼容「386」架构的, 所以Linux上运行的各种程序,只要在「386」上编译之后,就可以在大部分的PC上运行了。 但是,「386」诞生于1985年,现在来看已经很古老了。 现在很多Linux发行版都是是针对「Pentium」之后的CPU的。 名称中包含「i586」的软件包就是针对「Pentium」架构的CPU的。 Linux中用 uname 命令看到的「i686」则是指「Pentium Pro」之后的架构。 可能我们会认为在「i586」或者「i686」架构CPU的机器上,使用针对「i586」或者「i686」编译的二进制应用程序会比兼容「386」架构的二进制应用程序更好。 但在实际使用中,在「i586」或者「i686」架构CPU的机器上,使用「i586」或者「i686」下编译的二进制应用程序并没有发现大幅度的性能提升。 因此,倒不如为了通用性,只在安装Linux时,选择和CPU架构相同的内核,而在Linux内核上运行的各种程序就可以直接使用在「i386」架构下编译好的软件包就行, 现在很多Linux发行版中的软件包就是这么做的,能够正常运行是最重要的。 本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/p/3751387.html,如需转载请自行联系原作者

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

Android中关于签名的一些知识

版权声明:本文为sydMobile原创文章,转载请务必注明出处! https://blog.csdn.net/sydMobile/article/details/74925168 1.签名的介绍 Android中的签名其实完全可以理解为我们日常生活中的签名,就是让你开发的应用和你有所联系,告诉人们这个应用是属于你个人的或者一个公司的。 2.为什么需要签名 最简单的说法就是Android系统的需要,也确实是这样,Android系统要求安装的每个APK必须要有签名。Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,有人可能会问了,我没有给我的akp签名为什么我也可以安装到我的手机上面进行调试呢,你没有给APK签名并不代表在调试的时候IDE没有给APK签名,其实IDE在打包调试的时候是默认给APK签名的,这个签名文件在C:\Users\Administrator.android里面,有个debug.keystore,这个就是默认的签名文件。 3.怎么生成自己的签名文件 这个我们利用Android Studio图形化界面就可以了,当然也可以用JDK自带的keytool来生成(这种就是在cmd下用指令生成) 这里介绍一下Android Studio的生成方法 1. 打开AS菜单栏的build 2. 选择Generate Signed APK..–>Create new…. 3. 填写内容创建签名包 4. 这个时候你所创建的签名包里面就有一个签名文件了,当然你还可以在这个签名包里面继续创建别的签名文件,只需要在第二步点击key alias后面的 ··· 即可。 到这里属于你的签名包文件就已将创建完了。 4.怎么查看签名包文件的详细信息 查看签名包文件信息的方式有很多种,有一些很方便的工具,这里我说一些使用命令符的方法: 输入keytool -help就可以出现有关的命令了,这里介绍的这种方法不仅适用于keytool这种命令符,以后你遇到所有的命令符都可以采用这种方式查看怎么使用。 我们看到命令下面给的提示 使用 “keytool -command_name -help” 获取 command_name 的用法 就是说如果我们不懂那个命令的话就输入 keytool -命令 -help获取帮助 比如我输入keytool -list -help 就出现下面这个说明 cmd–>到keystore目录下面–>keytool -list -keystore keystore的全名 -storepass 密码 这样就获取关于keystore的信息了。 keytool -list -v -keystore keystore的全名 -storepass 密码 就会详细输入信息。 5.怎么查看APK的签名信息 首先把apk文件重命名改成.zip文件,然后找到META-INF文件下的CERT.RSA,在命令符中到这个文件下面输入命令 D:>keytool -printcert -v -file CERT.RSA 就可以看到APK的签名信息。

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

你应该了解的数据分析入门知识

◆◆◆ 1、明确分析的目标 做数据分析,必须要有一个明确的目的,知道自己为什么要做数据分析,想要达到什么效果。比如:为了评估产品改版后的效果比之前有所提升;或通过数据分析,找到产品迭代的方向等。 明确了数据分析的目的,接下来需要确定应该收集的数据都有哪些。 ◆◆◆ 2、收集数据的方法 说到收集数据,首先要做好数据埋点。 所谓“埋点”,个人理解就是在正常的功能逻辑中添加统计代码,将自己需要的数据统计出来。 目前主流的数据埋点方式有两种: 第一种:自己研发。开发时加入统计代码,并搭建自己的数据查询系统。 第二种:利用第三方统计工具。 常见的第三方统计工具有: 网站分析工具 Alexa、中国网站排名、网络媒体排名(iwebchoice)、Google Analytics、百度统计 移动应用分析工具 Flurry、Google Analytics、友盟、Tal

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

声量引擎 2.0 正式发布,开放 GEO 全链路 API

现在越来越多的人遇到问题,第一反应是打开豆包或 DeepSeek 直接问。据中国互联网络信息中心(CNNIC)统计,我国生成式人工智能用户规模在 2025 年底达到 6.02 亿,到 2026 年上半年已超过 7 亿,普及率突破 50%——两年前,这个数字是 2.3 亿。放到全球看,ChatGPT 的周活跃用户在两年多里从 1 亿增长到 9 亿。入口变了,品牌被看见的方式也就变了。有人在豆包/De

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册