2019年10月

如果是在一个平面里面来计算两个点之间的距离,那么我们可以直接使用勾股定理,那么问题就来了,地球是一个球啊,面是球面啊,那就这么计算

from math import radians, cos, sin, asin, sqrt

#公式计算两点间距离(m)

def geodistance(lng1,lat1,lng2,lat2):
  lng1, lat1, lng2, lat2 = map(radians, [float(lng1), float(lat1), float(lng2), float(lat2)]) # 经纬度转换成弧度
  dlon=lng2-lng1
  dlat=lat2-lat1
  a=sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 
  distance=2*asin(sqrt(a))*6371*1000 # 地球平均半径,6371km
  distance=round(distance/1000,3)
  return distance

  • 修改配置文件后,更新新的配置到supervisord,执行supervisorctl update
  • 重新启动配置中的所有程序supervisorctl reload
  • 查看正在守候的所有进程supervisorctl
  • 启动某个进程supervisorctl start program_name(program_name=你配置中写的程序名称)。
  • 停止某一进程pervisorctl stop program_name(program_name=你配置中写的程序名称)。

    • 如果停止所有的进程使用all,即supervisorctl stop all,用stop停止掉的进程,用reload或者update都不会自动重启。
  • 重启某一进程supervisorctl restart program_name(program_name=你配置中写的程序名称)。

小编使用的是Ubuntu16.04的服务器,在使用ssh命令进行连接的时候发现无法连接到远程服务器,那么小编来说下解决办法。
首先你得确保你的服务器安装了ssh服务,并且开启了ssh的服务。
sudo ps -e | grep ssh检查你的服务器是否开启了ssh服务,如果没有开启,请使用:sudo service ssh start开启。
如果没有安装的话,请使用 sudo apt-get install openssh-server来进行安装。

如果你的服务器安装并且开启了ssh服务的话,还不能连接,并且出现REMOTE HOST IDENTIFICATION HAS CHANGED这样的错误:下图所示:
WechatIMG842.jpeg

出现这个问题的原因是,第一次使用SSH连接时,会生成一个认证,储存在客户端的known_hosts中,所以一般情况下这个是由于服务器重新安装系统导致的。

解决办法

执行以下命令:

ssh-keygen -l -f ~/.ssh/known_hosts
ssh-keygen -R +输入服务器的IP

然后重新连接就可以了。

小编在做一个微信小程序的多选框的时候用到了bindchange这个函数来实现多选的实现,但是小编需要解决冒泡问题,这时候发现catchchange这个方法居然解决不了问题,无法阻止冒泡,经过一系列的尝试最终发现了解决的办法:在checkbox添加一个view,给view添加一个catchtap操作,指向一个空函数即可,冒泡到view的时候,在这几就结局了。代码实现如下:

 <view catchtap="catchtap">
      <checkbox value="{{_id}}" checked="{{item.checked}}" />
 </view>

catchtap.jpg

微信小程序的轮播图也是十分的方便,我们可以直接调用,不用自己再写多余的逻辑了,这样也极大的方便了我们的开发,在使用过程中,小编发现原生的小程序无法满足需求了,小编想在图片下方添加行文字,但是原生的轮播图无法满足小编的基本需求了。所以小编自己进行了部分修改,一起来看下。
先来看下效果图:
lbt.png
实现代码:

 <swiper indicator-dots="{{true}}" style="height: 200px;">
            <block wx:for="{{covers || []}}">
                <swiper-item>
                    <image src="{{item}}" class="slide-image" style="width: 100%; height: 100%;" mode="aspectFill" bindtap="onImageClick" data-images="{{covers || []}}" data-index="{{index}}" />
                    <!-- 关键代码 -->
                    <view style="font-size: 18px;width:{{width}}px;padding:10rpx; color: black; font-weight: 800; padding: 2px 0;background:rgba(0,0,0,0.4);position: absolute;bottom:0;left:0%;transform:translateX(0%);text-align:left;">
                        <text style="color:#FFFFFF;padding-left:30rpx;">{{product.name}}</text>
                    </view>
                </swiper-item>
            </block>
</swiper>

小编也不知道这个叫什么。 反正就是俩M形状的东西,两个锁在一起了,然后需要分开。
1.jpeg
其实呢,解开的时候只需要理解是怎么进去的就可以,我们先来看下怎么进去的,
2.png
就是让两个开口的地方对齐就可以直接进去了。
进去之后就是这样的了
3.jpeg
你发现一退就可以出来了。
所以呢,我们解开也只需要这样的状态就可以了。让m之间的缝隙对齐就可以了。
4.jpeg
推出来就可以了。

JavaScript打乱一个数组的顺序的两种方式

  • 方法一:利用sort函数

      arr.sort(function() {
          return .5 - Math.random();
      });

    这种方式可以打乱一个数组的顺序,但是并不是真正的乱序,所以建议不要用在严谨的打乱顺序上。

  • 方法二:自己封装一个函数

    function rand(arr) {
          var len = arr.length
          //倒叙遍历该数组
          for(var i = arr.length - 1; i >= 0; i--) {
              // 产生一个在数字长度内的随机数
              var randomIndex = Math.floor(Math.random() * (i + 1));
              // 作为数组下标去取数组该位置的值
              var itemIndex = arr[randomIndex];
              // 随机的位置与该位置互换
              arr[randomIndex] = arr[i];
              arr[i] = itemIndex;
          }
          return arr;
      }

微信小程序本身是没有开屏的,所以我们通过我们自己的逻辑制作一个自己的开屏,需求就是,当用户打开小程序的时候我们会先显示一个开屏,然后开屏自动关闭。如果进入的不是首页那么我们的开屏就不展示。并且还要使用各种手机的屏幕。
我们的开屏其实是显示的一张大图片,我们让宽度等于屏幕的宽度,高度通过图片的宽高比计算出来,在图片外面加一个view,这个view的背景色和图片的背景色一样这样就可以适应不同的屏幕了。
首先我们先来写下样式

 <!-- 开屏 -->
    <view wx:if='{{kaiping}}' style=' position: fixed;top: 0;left: 0;display: flex;flex-direction: row;justify-content: center;align-items: center;width: 100%;height: 100vh;z-index: 99999999;background:#a00b0a;'>
        <view style='position: fixed;'>
            <image src="../../kaiping.png" style='width:{{width}}px;height:{{width*1.51}}px' />
        </view>
    </view>

然后在我们的js里面写下逻辑:
在data里面设置:kaiping: false
在onload里面把kaiping: true

that.setData({
     kaiping: true
})

在onshow里面写一个定时器关闭开屏

if (that.data.kaiping) {
        setTimeout(function() {
             that.setData({
             kaiping: false
        })
     }, 4000);
}

  • 标题title

    title: {
          show:true, //是否显示
          text: 'ECharts 入门示例', //标题文字
          subtext:'学习ECharts就来慕课网', // 附标题
          left:'right', // 数字就是像素值 ,也可以是 center left right这种位置值
          borderColor:'red', //标题的边框颜色
          borderWidth:5, //标题边框宽度
          textStyle:{ //标题字体样式
              fontSize:40
          }
      },
  • 工具箱toolbox

    toolbox: {
          show: true,
          feature: {
              dataView:{ //数据内容
                  show:true
              },
              restore:{ //数据还原
                  show:true
              },
              dataZoom:{ //选中区域
                  show:true
              },
              saveAsImage: { //取消选中区域
                  show: true
              },
              magicType: { //切换图
                  type: ['line', 'bar']
              }
          }
      },
  • 弹窗组件tooltip

    tooltip: {
          trigger: 'axis'
      },
  • 标记线、标记点

    series: [{
          name: '销量',
          type: 'line',
          data: [5, 20, 36, 10, 10, 20],
          markPoint: { // 标记点
              data: [
                  {type: 'max', name: '最大值'},
                  {type: 'min', name: '最小值',symbol:'arrow'}
              ]
          },
          markLine: { // 标记线
              data: [
                  {type: 'average', name: '平均值'}
              ]
          }
      }]
  • 缩放

      dataZoom: [{
          type: 'slider',
          start: 10,
          end: 40
      }],