猫窝私语 — Makumo's Blog

玛酷猫的温馨小窝,记录生活点点滴滴。

@玛酷猫5月前

03/23
15:12
Ruby

Rails5踩坑系列——Vagrant和NFS共享文件夹

新年新项目,被老项目折腾大半年后,部门一直认为新项目要脱离老的Rails3.2版本,拥抱新版本。先准备前期环境,对应的安装了最新的Ruby2.5和Rails5.1.5,开始项目后台框架搭建工作。同事用vm搭建的虚拟机环境,没啥问题,我是用的Vagrant搭建的虚拟机环境,由于Vagrant自身共享模式很慢,一直配置着vagrant-winnfsd插件使用NFS来做文件共享,速度是快很多,就是经常性会遇到I/O错误,关掉日志防止频繁写入共享盘就好了。新项目跑起来就开始报错,报错信息类似如下

Errno::EEXIST at / File exists @ dir_s_mkdir - tmp/cache/assets/sprockets/v3.0/jG

网上搜了一下,发现一篇博文说到这个,传送门,大体意思就是NFS是大小写不明感,rails在运行中会将assets生成静态文件缓存,存在tmp/cache/assets/sprockets/v3.0/ 目录中,文件按照前两位字母建立文件夹归档,这时候就会遇到类似jg、JG、jG、Jg属于4个不同文件夹,但是NFS大小写不明感,就会认为是一个,在创建的时候就会返回文件夹已存在的问题,文中给出的方案是修改配置文件,将这个文件移出共享文件夹。由于不想将虚拟机原始文件系统里面放置额外的文件,这个方案被我否定了。查了下原来项目里面老版本文件缓存情况,类似的结构和生成方式,不过生成的文件缓存文件名都是大写,文件夹也都是大写,就不存在大小写的问题。本想找办法对应修改下,翻了下Asset Pipeline相关文档和sprockets的相关配置,都没有找到,遂放弃这个办法。在查看文档中,有关于静态资源文件缓存的存储方式的说明,默认似乎是文件方式,文档给出的修改例子是内存方式,于是在development.rb中添加这个配置,重启项目,一切OK。下面的禁用方式也试了下,影响速度还是很明显,同样不考虑。

此外上述文中还提到了其他几种由于NFS大小写不明感而引起的问题以及处理办法,目前暂时还没遇到。下次遇到了也心里有数了。

Rails5踩坑系列——Vagrant和NFS共享文件夹

@玛酷猫7月前

01/19
11:30
心情点滴

码农的35岁总结

岁月如梭,转眼间,一年已逝,都说码农35岁是个坎,回望一年,也是坎坎坷坷,有峰有谷。上半年悠闲下坡,下半年小跑上坡,总体来说,还是要比年初站得更高一些,也收获了不少。梳理梳理,记个流水账,也好给下一年立个标杆,至少不能做的更差吧。

上半年可以用乱七八糟来形容,公司几个领导意见分歧,项目也处于停摆状态,天天也不过是混日子罢了。待到五一,上层终于决定放弃线上部分,我们技术部门也理所当然的被裁员了。现在想想年初就应该选择离开的,与其无所事事在那边耗着,浪费时间精力,真不如离开调整调整。五月份调整了一个月,尤其是锻炼了一个月,整个精神状态恢复了不少,不再像前几个月那样浑浑噩噩的,另外一点额外收获就是熟练骑自行车,也多亏共享单车的火速普及。

六月份来到新的单位,正式开启了下半年提升之路。新公司第一个挑战就是开发语言,公司项目是用ruby on rails开发的,而我对于这个仅限于知道怎么读,幸好这么多年的开发经验在,了解摸索了2周,基本能上手开始改现有的功能,一个月后可以开始做新功能,这期间和同事一直在踩坑,原来项目里面各种坑,服务器部署各种坑,两个人踩得其乐无穷。越来越觉得编程就是理解开发思想,语言只是实现的一种方式而已,只要理解开发思路,用什么语言其实区别都不大。只要理解一种开发语言,学习其他的开发语言并不是很困难的事情。当然,如果想精通的话还需要沉浸其中多年才行。随着项目日趋完善,手机版的项目也提上了日程,考虑到现有团队情况,独立配备开发人员显然不太现实,讨论后决定使用hybird方式开发,由于去年曾用过angularJs(1.x)做过移动版项目,手机版的项目就决定还是用angular开发,最后决定使用angular(4.x+)的一个框架ionic和cordova一起开发,版本都启用最近的版本。刚开始就发现自己被自己坑了,angularJs(1.x)和angular(4.x+)完全就是两个东西,angular2.0+版决定推倒重写,以前掌握的1.x的知识大部分都用不上了。没办法硬着头皮啃新的,好在并不是太多复杂,仿照一个开源的项目,一点一点实现自己项目的功能,2周时间第一个web版就出来了,又花了一周搞定安卓版的编译签名,苹果版的稍微费了点功夫,申请开发者账号,折腾mac环境,xcode编译提交过审等等,苹果开发的坑真不少,好在都一一踩过了。后续又陆陆续续更新不少功能,迭代了6、7个大版本。等过完年重新设计下界面,作为一个新的大版本正式推广。

新的一年,准备多花点时间研究下nodeJs相关,毕竟在弄ionic的时候踩了不少nodeJs的坑,这方面还是要了解下,计划用javascript同时开发前后台做个小项目出来。此外,去年一整年就读了半本《上帝掷骰子吗——量子物理史话》,还没读完。看来读书习惯还是没有养成。今年除了完成去年的书籍,就加读一本书作为目标好了。锻炼身体还要坚持,去年初体检,各项指标都压线,再加上年底一位同窗突然去世,顿时感觉人到中年,身体是第一位的,其他都是扯淡,去年一年减了30斤,还是有点小成果的,今年再接再厉,再减40斤,回到一个比较合理的体重。

懒癌晚期这个问题看来是比较难解决了。一年博客更新寥寥,多次想记录下心得,每次也就写了个标题开了个头,然后就放那了,过段时日也不知道该写什么了,后台可见好几个草稿。估计懒癌还是比较难治愈的,看看今年有什么突破吧,哈哈。

码农的35岁总结

@玛酷猫10月前

11/3
10:46
Ionic(Angular)

Ionic3应用中添加Faye功能

公司rails项目中通过Faye来实现一个简单的好友聊天互动的功能,移动端需要开发简易的教师上课点名的小功能,想想正好可以利用Faye服务来实现,具体逻辑很简单,在课程页面,教师点击点名模块,设置密钥后进入点名页面,通过Faye发布该课程点名信息,学生接收到点名信息后在页面上显示签到按钮,学生点击签到按钮输入密钥,通过Faye服务传递到教师点名页面上,时时反馈签到情况,最后教师通过关闭按钮结束签到并通过Faye告知所有学生,学生页面隐藏签到按钮。

逻辑理顺了,页面搭建完毕,加入Faye犯难了,官方文档只是简单写了下浏览器端如何使用,引入Faye服务端js,然后可以使用subscribe和publish来发布和接受了。在Ionic3项目里面就傻眼了,第一步引入js就不知道咋搞了,网上翻资料,绝大部分都是使用ionic 1.x的资料,度娘里面居然还掺杂一大堆王菲的搜索页面。。。谷歌研究了半天,参考了一篇关于ionic3部署socket.io的文章,终于搞定。

首先还是安装Faye组件

npm install faye --save

新建一个服务provider,初始化同时把相关的推送接收用法写进去

import { Injectable } from '@angular/core';
import * as Faye from 'faye'

@Injectable()

export class FayeService {
  clientUrl: string;
  data: any;
  client: any;

  constructor() {
    this.clientUrl = 'https://your website/faye';
    this.data = null;
    this.client = new Faye.Client(this.clientUrl)
  }

  subscript(callback:any, channelName:string){
    this.client.subscribe('/' + channelName, function (data) {
      callback(data);
      // console.log('receiced data:'+data);
    })
  }

  publish(channelName:string, data:any){
    let publication = this.client.publish('/' + channelName, data);
    publication.then(function() {
    }, function(error) {
      console.log('There was a problem: ' + error.message);
    });
  }

}

最后在app.module.ts中引入这个provider并声明下就可以在项目中使用了。

此外还有一点,由于项目的browser版和接口都启用的ssl,直接使用http://your website:8080/faye 会报错,提示在ssl下访问非ssl存在安全问题balabala之类的,这个需要在nginx中设置端口转发。

在nginx的接口配置文件中添加faye的upstream

upstream faye-socket{
    server 127.0.0.1:8080;
}

接着在配置443的server下面添加转发规则

location /faye {
	proxy_pass http://faye-socket;

	proxy_http_version 1.1;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header Host $host;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
	proxy_cache_bypass $http_upgrade; 
}

保存后重新加载nginx配置即可。

nginx -s reload

Ionic3应用中添加Faye功能

@玛酷猫1年前

06/24
22:45
Ruby Linux

用Vagrant和VirtualBox搭建Windows下的Ruby on Rails 开发环境

PS:做个系列,记录下各个知识点,方便以后回顾查询,就叫Ruby:从入门到放弃好了(大雾)。

虽然都推荐在类Unix环境上面做Ruby的开发,更贴近于真实服务器的环境,同时也不会遇到各种Windows上奇葩的坑,不过考虑类Unix也同样存在学习成本,并不是主要学习方向,同时也需要在Windows下跑其他一些应用,比如游戏什么的,经过搜索娘的指引,选取这种折中的方法,在Windows平台下使用虚拟机跑类Unix系统。

首先还是安装对应的一系列软件了:

差不多就这么多吧,乱七八糟都装好后就开始配置了。
在工作目录新建一个文件夹,比如Ruby_project,win+x进入命令提示符,使用cd命令进入刚刚建立的文件夹,然后用下面命令配置

#添加box到vagrant列表,比如box存放在d盘根目录
vagrant box add centos7 vagrant-centos-7.2.box
#初始化,会在目录下生成Vagrantfile的配置文件
vagrant init centos7
#启用
vagrant up
#关闭虚拟机命令
vagrant halt
#重启虚拟机命令
vagrant reload

启动起来后,虚拟机会挂载Ruby_project到虚拟机的vagrant目录下面,这时候用secureCrt连接虚拟机,账号密码都是vagrant,root密码同样是vagrant
由于没有单独配置虚拟机的IP地址,默认虚拟机也会使用127.0.0.1来访问,这需要配置下Vagrant的环境,将访问端口映射到虚拟机上,编辑目录下面的Vagrantfile文件,加入下面的端口配置,整体文件看起来像这样

Vagrant.configure("2") do |config|
 config.vm.box = "centos7"
 config.vm.hostname = "dev"
 config.vm.network "forwarded_port", guest: 3000, host: 3000
 config.vm.network "forwarded_port", guest: 80, host: 8080
end

Rails端口使用3000,Nginx的80端口映射到本机的8080端口。其实单独配置IP更方便一些,以后端口一多,一个一个配置很麻烦。
重启后登录虚拟机,开始配置虚拟机的Rails环境

#更新yum
yum update
#安装EPEL
yum install epel-release 
yum repolist
#安装依赖库
yum install curl-devel nano sqlite-devel libyaml-devel
#安装RVM,安装指定版本的Ruby
gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
curl -L https://get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh #set up system environment for Ruby, 这步不可少
rvm reload
rvm install 2.0.0 #这里指定ruby版本
#由于众所周知的原因,修改gem的源
gem source -r https://rubygems.org/
gem source -a https://gem.ruby-china.org
#安装nodeJs作为JavaScript的运行环境
yum install nodejs
#安装指定版本的rails
gem install bundler
gem install rails -v 3.2.12 
#安装nginx
yum install nginx

到这里虚拟机环境基本配置完毕了,其他各个插件根据各个项目中的Gemfile在bundle install中进行安装和调整。
在vagrant目录下,输入以下代码

#新建一个项目
rails new hello_world
#进入项目目录
cd hello_world
#检查并安装对于的gem
bundle install
#启动项目
rails s

打开浏览器,输入127.0.0.1:3000 就能看到rails的默认欢迎页了。

启动RubyMine,在之前Ruby_project目录下会出现hello_world的项目目录,直接用RubyMine打开这个文件夹,就能看到该项目的具体源码,这样在IDE中的源码修改会直接作用于虚拟机上。

PS:在Windows下使用Vagrant存在一个问题,就是由于VirtualBox虚拟机的共享文件机制的I/O问题,项目跑起来后,在浏览器浏览很非常的慢,从日志上面看各种资源的读取时间都是几十甚至几百毫秒。网上都说更改共享方式,使用nfsd方式,不过我改过后无法挂载共享盘。问题还没有彻底解决。准备换种共享模式,虚拟机共享目录,本机连接虚拟机的共享目录,这样项目实质是存在虚拟机上,避免I/O的缓慢问题,IDE读取文件慢可以接受,毕竟不会一次打开很多页面。

用Vagrant和VirtualBox搭建Windows下的Ruby on Rails 开发环境

@玛酷猫1年前

06/10
22:51
心情点滴 Ruby

Re:从零开始的Ruby之路

离开上一家公司也有一个月了,告别繁忙的工作,卸掉各种压力,清空脑子里乱七八糟的字母符号,早上起来锻炼下身体,买菜做饭,洗衣带伢,虽然依旧很累,不过心态大不一样,节奏慢下来也蛮好,难怪很多人最大的理想就是不上班。不过修仙也还是要经济支持的,放松一个月,参加了下高中20年的同学聚会,带着家人到周边小玩了下,口袋就见底了。开始要苦逼的开始找工作了。正好一个朋友所在新公司正在招人,看我闲着就问我过来聊聊,真是刚想睡觉就有人送来枕头了。枕头是送来了,你能不能睡上去还要另说。约好时间聊了聊,项目还是不错的,教育领域、院校信息化、云平台,也都是现在比较热门的领域,不过一说开发语言就有点懵逼了,项目用Ruby on Rails开发的。ROR到不陌生,至少很久以前听说过,也简单了解过。那还是N多年前,在日常浏览订阅的技术文章时,看到javaEye的创始人robbin的一篇心路历程的文章,才知道Ruby这门语言的存在,那时候还属于菜鸟级码农,也就简单的了解了下,没想到多少年后,自己居然会走到这条开发道路上来。

答应朋友的邀请加入这个团队之前也考虑了几天。这几年的状态一直都不是很好,总说程序猿到了35岁是个坎,其实也就是借口罢了,虽然说随着年龄的增长,精力思维能力都有一定的退步,不过经验也在逐步的积累,两者相抵其实整体能力还是稳中有升的,最主要可能在PHP上面走进僵局了,一方面很长一段时间没有参与过大项目的开发工作,每天的时间都消耗在零碎的小事上,慢慢的也磨疲了,另一方面虽然PHP在不断的发展,很多新功能新开发思路和解决方案也在不断涌现,不过所在地方大部分公司所需要的也就是基本功能,没有太多更高层次的需求,更多的精力投放在怎么做业务,怎么盈利,对技术投入寥寥无几。其实上一家公司项目也很不错,项目领导人也很有想法,在本地还是空白,坚持做下来也很有市场和影响力,很可惜在现在这个大环境下,投资人更看重的是怎么更快的收回成本,如何更快的盈利,各方面降低成本,以至技术团队迟迟无法组建,项目开展缓慢,最终免不了项目完全砍掉的结果。其实这样也好,换一个环境,一切都是新的,都是未知的,说不定对自己是个很好的调整机会。面试的时候,技术股东对我说,其实单从转型来看,JAVA转Ruby是最快的,毕竟从思想上面来说,两者很多相通之处,在本地几乎没有Ruby的开发人员情况下,招人也大部分也是选择JAVA开发人员,PHP转Ruby是有些过程的,毕竟PHP很多面向对象的思想是缺失的,不过语言是相通的,他相信我这么多年的工作经验,这点困难应该不是什么大问题。于是乎,自己答应了对方的邀请,算是对自己的一次历练吧,或许有些新的突破也说不定呢

下周就要去上班了,套用从入门到放弃系列,自己P了张封面,大家共勉。

从入门到放弃系列Ruby版

Re:从零开始的Ruby之路

@玛酷猫2年前

12/22
00:42
计算机

猫窝搬迁至“小公寓”

阿里云买的弹性web托管要到期了,当初买的时候是蛮便宜的,买完了各种后悔呀,就是个虚拟空间么,还叫的这么高大上的名字,毫无自由度可言,充其量也就一个合租房。幸好也就放个博客,凑合着先用着了,之前海外的虚拟空间也就没退,继续续费着,放放测试站,还是可以的。

上个月双11的时候趁着做活动,买了个最低档的云空间,想着有时间就把网站转过来。谁想到懒癌晚期,一直拖到现在,眼看快24号到期,趁着没几天,赶紧弄过来。相对于坑爹的弹性web托管,云空间自由度高多了,就相当一台低配服务器,除了系统啥都没,就像小公寓,可以随便折腾了。不过各种环境包很多,坏境配置起来还是很快的。本着折腾的原则,php直接上的7.0.7,mysql由于内存太小,只能用5.5,Opcache和memcached也都加持上,web服务器用的nginx+apache模式,一方面是想尝试下这种模式的具体配置,充分发挥两者的长处,另外还想着以后在搭个node环境,用nginx做转发,这项也不会相互干扰,不过到那时候内存就要捉襟见肘了。

环境搭好,站点数据库建好,数据备份还原,站点程序上传,解析域名生效各种慢,等不及先改host调试了。都准备好后,打开网站的时候出现和上次博客迁入国内一样的问题,直接显示500服务器错误。估计还是插件的问题,在数据库中禁用所有的插件,页面顺利打开,然后进后台一个一个启用,除了2个插件报错外,一切正常,看报错信息貌似是php7的原因,正巧这两个插件也属于可有可无型,作者也是N年没更新过了,先这样吧,有时间在研究下怎么对应修改下。既然启用的Opcache,当然也要用上了,插件搜了下,选了个叫Opcache dashboard的插件,最后设置了下固定链接,大概试了下没啥大问题,搬迁过程还是蛮顺利的。

这几天测试下,一方面看看传说中的php7的性能,另一方面看看nginx+apache的组合是不是那么高效,还有就是Opcache和memcached的性能影响。有的折腾了,哈哈。

猫窝搬迁至“小公寓”

@玛酷猫2年前

08/3
16:07
计算机

windows 10周年更新蓝屏解决

终于等到windows10的周年更新,之前系统一直各种那种小问题,比如商店无法打开、应用无法打开、各种闪退等等,本想着重装系统,嫌麻烦一直凑合用着,顺便等周年更新(之前一直称为红石Redstone版),这种大更新就相当于重新装次系统,以上那些小问题或多或少会解决的,虽然可能会出现新的问题。官方说是2日放出更新,昨天刷了一天系统都没出现提示,今天上午刷了会也没提示有更新,直接下载官方的易升来升级了。后台挂着下载升级包,就去干活去了。不一会提示30分钟倒计时重启升级,保存下手头的工作,直接重启。然后就是等待那百分比的数字慢慢的跳动。

刷刷手机本想着一切顺利升级完成呢,结果屏幕DUANG的一下蓝了,蓝了,蓝了。。。。。顿时心里一万只草泥马奔过。屏幕显示 Driver IRQL not less or equal (CHDRT64.sys) 错误代码 C1900101-30018,新版的蓝屏居然还配一个二维码,还没来得及扫下看看啥内容就回滚原来版本。。。心想这不会这么衰吧,每次大升级都出点妖蛾子,重新试了次,这次是用微软的工具下载系统ISO镜像,然后使用完整镜像升级,这次留意了下,到32%的时候蓝掉了,还是同样的错误提示。网上搜了下,遇到这个的还不多,都没什么解决方案,无非都是重做系统,用数字大礼包修复系统。。。微软社区有人问了一样的问题,不过是1年前,应该是windown8.1升级到windows10遇到的(传送门)和我一样用的也是联想的yoga,不过下面给出的方法很官方的说法,啰里啰唆一大堆,无外乎磁盘错误扫描、文件完整性检查、系统错误检查、保持最新更新等等,其实没啥用(事实上又臭又长没仔细看,一目十行的看了下)

既然每次都是CHDRT64.sys这个文件引起的蓝屏,那就看下这个是什么东东,网上搜了下,结果也没有多少帮助的,好在在联想的官网上发现了点端倪(传送门),这个是Conexant Audio Driver声卡驱动的一个更新说明,其中有段写着

(Fix) Fixed an issue where BSOD 7E on CHDRT64.sys when overwrite-installing Audio driver from 4.XX.X.XX to 8.XX.XX.X

大概意思就是修复从覆盖安装时引起CHDRT64.sys蓝屏(BSOD:Blue Screen of Death)的问题,既然知道这个文件是声卡驱动,那就简单了,把你干掉看你还咋蹦跶。直接把声卡驱动卸载了,然后重新升级,这次顺利跳过32%那个坎,直接升级完成,问题解决。一起解决的还有之前所说的应用商店和应用的问题,又可以愉快的玩耍了。

windows 10周年更新蓝屏解决

@玛酷猫2年前

06/20
17:59
生活

新技能GET:周末撸了一个木镯

快到纪念日了,又开始纠结送给LD什么礼物好,之前看色魔张大妈(什么值得买)一群值友晒各种手工品,看的各种种草,一直没敢尝试,这次想着自己做个当礼物好了。翻了下以前收藏的帖子,仔细的研究了一下,觉得难度不大,应该可以做得来。所做就做,大淘宝买了套基础工具,顺便买了几块半成品料子。选料子真是各种纠结,二十几种,选了半天,后来选了一个尼泊尔紫檀,一个墨西哥黄花梨。买完了后才知道一般都会用柯檀或者紫苏,颜色花纹都会很漂亮,反正第一次弄,选一般的练练手,能熟练了在换好的。

Read More →

新技能GET:周末撸了一个木镯

@玛酷猫2年前

04/20
22:04
计算机 项目管理

再聊聊钉钉开发

之前吐槽了下微信的开发,最近在钉钉中开发一套业务系统,顺便也吐槽下钉钉好了。

起因也很简单,上一家公司一直再用钉钉作为办公OA,相对于传统OA,钉钉更注重移动办公,手机体验感很好,换新公司后,也推荐使用钉钉作为日常办公OA。设置好后,大家也都开始尝试使用,可能是公司大多数人之前很少使用此类软件,对于OA存在一定抵触心理,不过使用一段时间后也都还好,毕竟每天也就占用几分钟的时间。

钉钉里面的业务模块还是比较少,公司的一个业务模块找不到适合的模块改造,于是准备在钉钉下自己开发。最早是准备单独做,后来考虑到办公OA用的是钉钉,很多业务逻辑都在钉钉里面沟通或者下达,何不也一并做进钉钉里面好了,还省得在单独处理用户和登录认证模块,并且以后系统还可以打通。

说做就做,首先还是看文档,虽然两者的模式类似,都是获取相关认证授权信息,然后接口调用,相比微信简单明了的文档,钉钉的开发文档就显得过于复杂繁琐,经常A模块中出现一个参数b需要在B模块获取,有个链接跳过去,然后再看B模块中有个参数c需要在C模块中获取,然后绕来绕去,最后彻底晕菜了。微信的开发仅针对微信内置浏览器,接口也基本两种模式,一种是程序通过API接口进行数据通信,另一种是用JSAPI的模式数据通信。钉钉开发不仅针对内置浏览器,还有PC版软件和第三方APP,相对提供的接口方式就比较丰富。对于我这个项目而言,主要还是使用内置浏览器方式调用web页面方式。文档大概看了几遍,有了基本概念,加上之前微信开发的一些经验。准备着手开发,毕竟文档脱离了具体项目是很难完全理解的。

由于钉钉存在手机版和PC版,这个业务模块在钉钉两个版本都会使用到,PC版为主,移动为辅,这个就要求页面要自适应宽度,在不同的宽度版本(移动和PC)都要良好的提现,文档中也有对于两个版本的一些宽度尺寸的规范。模块的UI框架直接使用了Amaze UI,这个框架以前项目开发中使用过,文档和易用性都还不错,有些功能或者细节方面还不是很好,不够灵活。不过基本能满足一般项目。(其实还是懒得折腾),框架定好了,刚开始开发就遇到一个大坑,移动版和PC版的JSAPI居然不是同一个,这个一开始没注意到(最开始使用的PC版),等到登录开发完调试的时候才发现,PC版获取钉钉登录信息并自动登录业务系统没问题,移动版直接卡在获取钉钉登录信息那块了。后来多次调试加上仔细看了下文档才发现这个问题。知道问题就好处理,加个移动端判断调用不同的JSAPI文件解决。其实个人认为获取钉钉登录信息通过钉钉自身的接口更好一些,跳转到钉钉的一个认证页面上,获取后在跳转回项目并带着认证信息,钉钉文档里面也有这个接口,不过需要申请才能使用,好像还要有一定的要求,本着不折腾的原则(其实就是懒),暂时用JSAPI的方式处理。接下来就是正常的项目开发,暂时用到钉钉接口的地方不多,最多的也就是将项目里面的信息推送到群里面或者DING下某些人。

钉钉的调试也不是很方便,比微信好的地方就是调试非接口性的功能,钉钉可以在普通浏览器调试,而微信接口控件会直接提示请使用微信打开。但是调试接口方便的,微信可以在官方的开发工具里面调试,而钉钉就只能在客户端调试,好在有PC版的钉钉,至少不用老是在手机上面点来点去了,也希望钉钉会对应出个开发工具,至少方便项目的调试。

针对钉钉不断侵占企业OA这个市场,微信也针对的推出企业微信,虽然之前微信也推出过企业号,但是功能简单,易用性差加上功能没法定制,估计也没多少企业再用。这次的企业微信完全朝着钉钉去的,不可否认企鹅的借(chao)鉴(xi)能力,面对小企业基本能碾死一大片,这回面对阿里,最终结果还不得而知,不过借助微信的势,不可小觑。

再聊聊钉钉开发

@玛酷猫2年前

02/24
21:01
数据库

MySQL同一表中重复数据处理

PS:工作中的随手记录,并非最佳处理方式,仅作为一种思路。

筹备新系统的过程中,遇到这样一个情况,数据库中一个表已经添加了300条信息,这时候突然从外部直接导入了1000条信息,其中有一部分重复信息,在重复的信息里面,新加入的数据有一个字段数据是原来数据里面没有的。现在需要将重复数据中原来没有的那个字段数据更新到原始数据中,并且删除重复数据。假设数据表结构简约如下:

表A
id name phone
1 张三
2 李四
3 王五
-----------------------------
1000 李四 1234567890
1001 赵六 0987654321

其中虚线以上部分是原有数据,以下部分是批量导入数据,phone字段仅新插入数据有内容。

由于在一个表中,先查下有多少重复数据,SQL如下

select name,count(name) as num from 表A group by name having num>1

有一点要注意就是在group by的语句中where和having的区别,两者处理数据顺序不同,where是在group by之前处理筛选数据,having则是group by之后在处理筛选数据,其中重复的数据大概有接近200条。

下一步就是把重复的这近200条数据中,新加入数据中那一个特殊字段的数据更新到老数据中。思路为先从上面重复数据里面分离出后添加的数据,将后添加数据特殊字段内容更新到前面老数据中,假设后添加数据起始id为1000。

update 表A as aa 
inner join (select a.id,a.name,a.phone from 表A as a,(select name,count(name) as num from 表A group by name having num>1) as b where a.name = b.name and a.id >= 1000) as bb
on aa.name = bb.name
set aa.phone = bb.phone
where aa.id < 1000

这里不知道是不是mysql(5.6)版本问题还是其他原因,之前使用update……set……from……select……where语句来更新数据的时候报错,后来换成上述语句更新。

更新完了后就是删除重复数据了,主要还是删除后面添加进来的数据。

delete from 表A 
where id in (
  select aa.id from (
    select a.id from 表A as a,
      (select name,count(name) as num from 表A group by name having num>1) as b 
      where a.name = b.name and a.id >= 1000
    ) aa
  )

这里其实多套了一层select,由于mysql中不允许在同一个表中先select出数据在update这个表,会报类似这样的错误 You can’t specify target table for update in FROM clause,中间多加了一层select来规避这个错误的出现。

至此问题处理完毕。其实在一个表中做这样的处理是非常不好的方法,在数据导入的时候先导入一个临时表中,在进行两个表之间的数据处理,从逻辑上和语句上面都简单很多,出现意外错误的几率也会少很多,误操作影响原有数据几率也小很多。

MySQL同一表中重复数据处理