相关文章推荐
完美的鸡蛋面  ·  vue3 npm run ...·  2 月前    · 
急躁的毛巾  ·  502 bad ...·  1 年前    · 
重感情的饭卡  ·  Pytorch-cuDNN version ...·  1 年前    · 

财务接口6

381.在线程中访问xlwings出错。


一上线程,真假立现。同是天涯人。

pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize。', None, None)

安装pywin32

pip install pywin32

import pythoncom

pythoncom.CoInitialize()


多线程使用pywin32com估计有问题。win32com对象作为全局变量似乎有问题。


在多线程里面使用win32com调用com组件的时候,需要用pythoncom.CoInitialize初始化一下。

最后还需要用pythoncom.CoUninitialize释放资源。

Coinitialize是Windows提供的API函数(好吧,还是微软惹的“祸”),用来告诉Windows系统单独一个线程创建COM对象。也就是说我这个多线程的脚本里面的线程和这个COM对象的线程创建一个套间,令其可以正常关联和执行。


我的问题估计,pythoncom.CoUninitialize也解决不了。

应该是线程访问资源冲突的问题。

pywintypes.com 锁定的工作簿,自允许一个线程访问。

如果冲突要等另一个线程释放资源后再访问。多线程中碰到独占性资源的问题。

等大家都停下来,爱怎么用就怎么用。

同时多个进程、线程读写同一个EXCEL表,这有点难为EXCEL了。在半路能招待一个人已经不错了,还要接多个客人,有点过热,容易打架。

用完就释放,不要霸占这个方法是不错的,可以解决时分多用的问题。

在新的模块中捕获同一个工作簿相互不影响。


现在可以把问题缩小到模块内部资源争用的问题。估计模块间即使有争用也会根据时间顺序,读先来先到,写后来的保留的原则解决冲突问题。


在report模块中新一个,把EXCEL对像做为参数传入,就不会出现冲突的问题。并行不悖。report模块对所有线程来说是公共资源,在各自的线程中自建一个EXCEL访问接口让COM来协调是可行的。这家偷用另一家的资源是要被剁手的,除非对家已经准备扔了。

report.py

def getExcelSheetPublic(wb=None,ns="明细账py"):
    #global wb   
    if wb is None:
        wb = xw.Book(tSheet)
    name=[s.name for s in wb.sheets]    
    if ns not in name:     
        wb.sheets.add(ns)
    wb.sheets(ns).cells.clear_contents()#保留格式
    return wb.sheets(ns)


pythread.py

nbook=None
def getexcel(sheetname="getExcelSheetPlblic"):
    global nbook
    nbook=xw.Book(report.src)
    sh=getExcelSheetPublic(nbook,sheetname)
    sh.cells(1,1).value="pythread.py"
    return sh
 


另外一办法,把report改成class。


一不小心进入线程安全的领域。原来线程安全是要做这个事情。

如果在同一个进程里不同的线程访问,或许还能使用线程锁的方式控制,但是跨进程时就无法解决。
原理和写数据库时抢锁类似,每次访问文件前都必须首先改名(抢锁),只有抢到锁的进程才能进行后续操作。否则则等待其他进程释放



382.要玩一把进程间通信的戏法。

xlwings空值了excel,excel反过来与xlwings的宿主程序通信,控制xlwings。

信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。


前面的socket通信可以用上了。

再启动一个线程,进行socket监听。

进入windows命令窗口之后,输入命令,输入netstat -ano然后回车,就可以看到系统当前所有的端口使用情况。

开始了:

VBA怎么接招?VBA的TCP socket怎么办?


WinSockAPI

优点:功能强大,支持多种协议,使用灵活,WinSockAPI调用的wsock32.dll(28K)或ws2_32.dll(69K)为Windows系统自带函数库不必担心缺少文件。

缺点:使用复杂,编程量大,需要一定基础 适合于要求较高的网络程序


从杂七杂八的网站的角落竟然搜到想要的答案,世界之大,一碗装不下。

VBA with WinSock2: send() sends wrong data

原文来自:

VBA with WinSock2: send() sends wrong data

这篇文章比较散,做参考:

VB Socket通信函数_yuanxuaner的博客-CSDN博客

一大段奇奇怪怪的东西:

Option Explicit
' Constants ----------------------------------------------------------
Const INVALID_SOCKET = -1
Const WSADESCRIPTION_LEN = 256
Const SOCKET_ERROR = -1
' Typ definitions ----------------------------------------------------
Private Type WSADATA
wVersion As Integer
wHighVersion As Integer
szDescription(0 To WSADESCRIPTION_LEN) As Byte
szSystemStatus(0 To WSADESCRIPTION_LEN) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As Long
End Type
Private Type ADDRINFO
    ai_flags As Long
    ai_family As Long
    ai_socktype As Long
    ai_protocol As Long
    ai_addrlen As Long
    ai_canonName As LongPtr 'strptr
    ai_addr As LongPtr 'p sockaddr
    ai_next As LongPtr 'p addrinfo
End Type
' Enums ---------------------------------------------------------------
Enum AF
AF_UNSPEC = 0
AF_INET = 2
AF_IPX = 6
AF_APPLETALK = 16
AF_NETBIOS = 17
AF_INET6 = 23
AF_IRDA = 26
AF_BTH = 32
End Enum
Enum sock_type
SOCK_STREAM = 1
SOCK_DGRAM = 2
SOCK_RAW = 3
SOCK_RDM = 4
SOCK_SEQPACKET = 5
End Enum
' External functions --------------------------------------------------
Public Declare Function WSAStartup Lib "ws2_32.dll" (ByVal wVersionRequested As Integer, ByRef data As WSADATA) As Long
Public Declare Function connect Lib "ws2_32.dll" (ByVal socket As Long, ByVal SOCKADDR As Long, ByVal namelen As Long) As Long
Public Declare Sub WSACleanup Lib "ws2_32.dll" ()
Private Declare PtrSafe Function GetAddrInfo Lib "ws2_32.dll" Alias "getaddrinfo" (ByVal NodeName As String, ByVal ServName As String, ByVal lpHints As LongPtr, lpResult As LongPtr) As Long
Public Declare Function ws_socket Lib "ws2_32.dll" Alias "socket" (ByVal AF As Long, ByVal stype As Long, ByVal Protocol As Long) As Long
Public Declare Function closesocket Lib "ws2_32.dll" (ByVal socket As Long) As Long
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
Public Declare Function Send Lib "ws2_32.dll" Alias "send" (ByVal s As Long, ByRef buf() As Byte, ByVal buflen As Long, ByVal flags As Long) As Long
Public Declare Function SendWithPtr Lib "ws2_32.dll" Alias "send" (ByVal s As Long, ByVal bufPtr As Long, ByVal buflen As Long, ByVal flags As Long) As Long
Private Declare PtrSafe Function WSAGetLastError Lib "ws2_32.dll" () As Long
Private Declare Function VarPtrArray Lib "VBE7" Alias "VarPtr" (var() As Any) As Long
Sub TestWinsock()
    Dim m_wsaData As WSADATA
    Dim m_RetVal As Integer
    Dim m_Hints As ADDRINFO
    Dim m_ConnSocket As Long: m_ConnSocket = INVALID_SOCKET
    Dim Server As String
    Dim port As String
    Dim pAddrInfo As LongPtr
    Dim RetVal As Long
    Dim lastError As Long
    RetVal = WSAStartup(MAKEWORD(2, 2), m_wsaData)
    If (RetVal <> 0) Then
        LogError "WSAStartup failed with error " & RetVal, WSAGetLastError()
        Call WSACleanup
        Exit Sub
    End If
    m_Hints.ai_family = AF.AF_UNSPEC
    m_Hints.ai_socktype = sock_type.SOCK_STREAM
    Server = "localhost"
    port = "60001" '更改端口
    RetVal = GetAddrInfo(Server, port, VarPtr(m_Hints), pAddrInfo)
    If (RetVal <> 0) Then
        LogError "Cannot resolve address " & Server & " and port " & port & ", error " & RetVal, WSAGetLastError()
        Call WSACleanup
        Exit Sub
    End If
    m_Hints.ai_next = pAddrInfo
    Dim connected As Boolean: connected = False
    Do While m_Hints.ai_next > 0
        CopyMemory m_Hints, ByVal m_Hints.ai_next, LenB(m_Hints)
        m_ConnSocket = ws_socket(m_Hints.ai_family, m_Hints.ai_socktype, m_Hints.ai_protocol)
        If (m_ConnSocket = INVALID_SOCKET) Then
            LogError "Error opening socket, error " & RetVal
            Dim connectionResult As Long
            connectionResult = connect(m_ConnSocket, m_Hints.ai_addr, m_Hints.ai_addrlen)
            If connectionResult <> SOCKET_ERROR Then
                connected = True
                Exit Do
            End If
            LogError "connect() to socket failed"
            closesocket (m_ConnSocket)
        End If
    If Not connected Then
        LogError "Fatal error: unable to connect to the server", WSAGetLastError()
        Call WSACleanup
        Exit Sub
    End If
    Dim SendBuf() As Byte
    SendBuf = StrConv("Message #1", vbFromUnicode)
    Dim buflen As Integer
    buflen = UBound(SendBuf) - LBound(SendBuf) + 1
    ' !!!!!!!!!!!
    ' !! Send() does not seem to send the right bytes !!
    ' !!!!!!!!!!!
    'RetVal = Send(m_ConnSocket, SendBuf, buflen, 0)
    RetVal = Send(m_ConnSocket, SendBuf(0), buflen, 0)
    ' The following does not work either:
    ' RetVal = SendWithPtr(m_ConnSocket, VarPtrArray(SendBuf), buflen, 0)
    If RetVal = SOCKET_ERROR Then
        LogError "send() failed", WSAGetLastError()
        Call WSACleanup
        Exit Sub
        Debug.Print "sent " & RetVal & " bytes"
    End If
    RetVal = closesocket(m_ConnSocket)
    If RetVal <> 0 Then
    LogError "closesocket() failed", WSAGetLastError()
    Call WSACleanup
        Debug.Print "closed socket"
    End If
End Sub
Public Function MAKEWORD(Lo As Byte, Hi As Byte) As Integer
MAKEWORD = Lo + Hi * 256& Or 32768 * (Hi > 127)
End Function
Private Sub LogError(msg As String, Optional ErrorCode As Long = -1)
    If ErrorCode > -1 Then
        msg = msg & " (error code " & ErrorCode & ")"
    End If
    Debug.Print msg
End Sub


让VBA干socket的活,有点像古人学英语的味道。VBA没有专门与其他进程通信的模块,就像闭关锁国。这么好的内功,要去外面发泄发泄。让socket成为EXCEL的气门芯。打通任督二脉,外加无线wifi、5G通信。

感谢各TV,连接是成功了。

但中途掉链子了。查。感觉是还没接收完呢,就被vba咔嚓了。


世界已经丰富到,你廉价接受现成的成果,但是你要在原来的成果上改进一点点的代价可能就是一辈子。


把close注释掉,成功。下面应该找到接受server的应答信息的方法。


野蛮使用的结果,端口一直被占用。

VBA的客户端close后的状态,应为server已经退出了。

好像不影响使用server,server重启后自然进入listening。

科学办法是,client接受到server接受完毕的信息后关闭连接。野蛮一点就是发送一个空消息,然后关闭。服务端已经按了机关,发送q,可以退出服务器,这时client也可以关闭连接。

能够关闭,说明也可以退出相应的线程。开第三个线程专门监听来自excel的消息。


这条TCP连接是专线,可以不关闭,在excel关闭的时候再关闭。也可以野蛮关闭 。netstat查出PID,然后taskkill

netstat -ano|findstr "60001"

taskkill -F -PID 56632


解决传送中文的问题。在中文windows中decode('gbk')。

这是我担心的,不关闭,就出现运行一次client就建立一条连接。单工模式下,选择关闭可行。根据程序的实际情况,建立UDP连接也是可以接受的。


thread1 = myThread(1, "Thread-1", 1,'全家桶()')
thread2 = myThread(1, "Thread-2", 2,'getCmd()')
thread3 = myThread(1, "Thread-3", 3,'socketserver()')

线程能够启动server,但是不能够回显输出信息到控制台。

还是excel处于编辑状态的老问题,如果excel处于编辑状态,会阻塞其他线程对excel的访问。

奇事天天有,这都能和socekt起冲突

#t2 = __import__("socketServer")
#r2 =[name for name,_ in inspect.getmembers(t2,inspect.isfunction)]


远程就是事情多。莫名其妙就连接不上了。

excelMultiRankAccountTable函数能够触发四次[a1]的change事件。东西多了就容易打架。

这回通畅了。通信建立,现在要解决在EXCEL中怎么触发命令。:


想打一下EXCEL新建窗口这个功能的主意。可以产生一个伴随窗口,相当于任务面板的功能。


383.象这么回事,效果基本可接受。如果要完美一点就是折腾怎么把窗口拾掇拾掇。


384.进入心心念念的数据分析模块。

看不到别人眼里的自己,别多想,别乱动就是。
Thinking too much of others makes you nothing in their eyes
 把别人看得太重,令自己在别人眼里无足轻重


用EXCEL做UI的乐趣就是,随时随刻数据打包带走。


对于df的取值还是心慌慌,老是报错:

print(tdata[('净利润','Balance')])#error
print(tdata[('营业收入','DC')])#error

正确打开方式。没有loc的是直接操作列的简写方式。兼容数组的语法。如果放着数组这么简洁自然的语法不用也是一种犯罪。对行操作就没那么方便的语法,不知道是不是加一个axis能解决,如果加axis的话,与用loc的语法相比,两者的复杂度也不相上下。

print(tdata.loc[('净利润','Balance')])
print(tdata.loc[('营业收入','DC')])

这丫返回的好像是个series。

netprofit['value_7'],不能用netprofit('value_7')。括号在python中对应的就是函数的参数。只要前导的字符串不是一个函数,就不要用括号。

要解决tdata中没有0月的数据。当初解决了yearInit,但还是需要单独一列来记录年初数。




385.一路bug,一路走

如果不是一次借贷不平,都没有发现这个问题。应该是最后的排序闹得。

df_mon=df_mon.sort_values(['Count','De'],ascending=[True,False])

原因是进项税转出的问题,造成当期的进项税金额不是进项发票的合计数。应该是减去进项税转出后的金额

转出的其他流动资产与计提的增值税进项相同,本期的进项税转出不影响其他流动资产的转出。进项税转出并没有在进项勾选中体现,而是在保税时直接报表扣除。


埋的很深的炸弹,refresh=False。把refresh做成全局比较好。



386.一分钱难倒英雄汉

TypeError: a bytes-like object is required, not 'str'.

str→bytes:encode()方法。str通过encode()方法可以转换为bytes。



387.天下没有免费的午餐。免费体验,结果流量、IP收费。没毛病。给个100层房子住,就是不给楼梯,准备你自己选择跳楼,要么走收费通道。这不是活脱脱的trap吗?

多少年了,还是那么黑。IPV6不给建的原因明明白白的。

腾讯云服务器,找到一个可以搞搞的地方。记得有高级的可以window界面,难延要收费?

开启秘密花园:

命令行重度依赖症,完全不惧,不有点小兴奋。


安装python3

第一步,安装依赖项。

yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

wget python.org/ftp/python/3


tar -zxvf Python-3.8.8.tgz

mv Python-3.8.8 /usr/local


开干之前的小碎步:

ll /usr/bin | grep python
rm -rf /usr/bin/python

cd /usr/local/Python-3.8.8/


./configure

有点心慌慌。成功但有不成功的模块:

make

虽然不明白,但是照做就是,世间本没有那么多的为什么。看到pip install sucess,这心就定下了。

make install


rm -rf /usr/bin/python
ln -s /usr/local/bin/python3.8 /usr/bin/python
python -V


pip搞了半天竟然老说找不到命令。猛然一想原来,蓦然回首,那人就叫pip3。

测试安装一下国宝pandas。收获满满的幸福,感觉幸福已经来敲门:

vim,来个hello

完美!


就是这个输入的过程很不美好。搞开发不是GUI的界面妥妥的。光身的LINUX适合做服务器

服务启动:

用用这个地址,不知道能不能联系得上。

目标计算机积极拒绝,无法连接。应该是云服务器在内网的原因。


lsof -i

端口60001在监听。没问题。

查看本机IP,过不奇然,毫无悬念。

1.ifconfig -a 或 ifconfig | grep inet (展示更为简洁)

2.ip addr 或 ip addr| grep inet (展示更为简洁)


搭建FTP服务器

云服务器 Linux 云服务器搭建 FTP 服务


WinSCP 是一个在 Windows 环境下使用 SSH 的开源图形化 SFTP 客户端,同时支持 SCP 协议。它的主要功能是在本地与远程计算机之间安全地复制文件。与使用 FTP 上传代码相比,通过 WinSCP 可以直接使用服务器账户密码访问服务器,无需在服务器端做任何配置。

云服务器 Windows 系统通过 WinSCP 上传文件到 Linux 云服务器


现在才发现端口、域名都是为了解决IP地址的问题。


ls -l /var/ftp/test

chmod +w /var/ftp/test

local_root=/var/ftp/test
allow_writeable_chroot=YES
pasv_enable=YES
pasv_address=xxx.xx.xxx.xx #请修改为您的 Linux 云服务器公网 IP
pasv_min_port=40000
pasv_max_port=45000



像个不想还钱的主,开始各种作妖。刚开始还是杠杠的。


这是因为yum采用python作为命令解释器,这可以从/usr/bin/yum文件中第一行#!/usr/bin/python发现。而python版本之间兼容性不太好,使得2.X版本与3.0版本之间存在语法不一致问题。而CentOS 5自带的yum采用的是python2.4,当系统将python升级到2.6或3.0后,出现语法解释错误。

$ vi /usr/bin/yum

将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2"即可。

# vi /usr/libexec/urlgrabber-ext-down

将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2"即可。

yum -y update

$ vi /usr/bin/yum

将第一行"#!/usr/bin/python2" 改为 "#!/usr/bin/python"即可。


yum install telnet

艰难的前行。本地telnet 127.0.0.1 80 成功


后面telnet半天出不来,quit ctrl +c,ctrl+D,都不好使。ctrl+],搞定。

关于telnet退出,还有一个最标准的退出方法是。 ctrl+] 组合键, 可以退出到telnet命令行

换公网IP,faild。

换局域网地址也嗝屁,这是什么道理?


算了。玩一遍FTP看看。

yum install -y vsftpd

systemctl start vsftpd

netstat -antup | grep ftp

useradd ftpuser

passwd ftpuser


mkdir /var/ftp/test

chown -R ftpuser:ftpuser /var/ftp/test

vim /etc/vsftpd/vsftpd.conf

systemctl restart vsftpd

ftp服务可用

telent,也可以。


各种手段都可以了:


怪就怪在21端口放行,80端口拒绝。




netstat -antp |grep 80


自己搞了一个乌龙。HOST=‘127.0.0.1’

import inspect
import socket
HOST='110.40.167.142'
PORT=80
sk=socket.socket()
sk.bind((HOST,PORT))
while 1:
        sk.listen(5)
        conn,address=sk.accept()
        buf=conn.recv(1024)
        result=buf.decode('gbk')
        print(address,result)
        if result in ['q']:
                break
sk.close()


继续试错。服务器的HOST用内网地址就可以。公网地址报错。O yeah。妥妥的。

import inspect
import socket
HOST='110.40.167.142'
HOST='172.17.0.11'
PORT=80
sk=socket.socket()
sk.bind((HOST,PORT))
while 1:
        sk.listen(5)
        conn,address=sk.accept()
        buf=conn.recv(1024)
        result=buf.decode('gbk')
        print(address,result)
        if result in ['q']:
                break

客户端:

服务端:


拾穗者。新技术进入拾穗阶段,也意味着监听革新的开始。


388.清源 CPM (Chinese Pretrained Models) 预训练模型

清源 CPM (Chinese Pretrained Models) 是北京智源人工智能研究院和清华大学研究团队合作开展的大规模预训练模型开源计划,清源计划是以中文为核心的大规模预训练模型。首期开源内容包括预训练中文语言模型和预训练知识表示模型,可广泛应用于中文自然语言理解、生成任务以及知识计算应用,所有模型免费向学术界和产业界开放下载,供研究使用。

https://bj.bcebos.com/v1/ai-studio-online/ffb6bed9360147f4bf513c5970ad5a5e742cabeb298e4f51b16a3e2d21dde837?responseContentDisposition=attachment%3B%20filename%3DCPM.tar.gz&authorization=bce-auth-v1%2F0ef6765c1e494918bc0d4c3ca3e5c6d1%2F2020-11-28T08%3A39%3A10Z%2F-1%2F%2F59c43785123712fa76ea11ce46d9348ccfb2739ccbdb1d6fcaa09a87cf2ce17f

飞桨AI Studio - 人工智能学习与实训社区


389.竟然出现摘要相同的没有在一起。

问题出在这里了。要实现按原银行流水序列,没办法这么简单来实现。

g=g.sort_values(['index','Summary','De'],ascending=[True,True,False])


相同元素初始化list

newindex.append([bankindex[0]]*vrows)

newindex.extend([bankindex[0]]*vrows)

390.构建免费的类似Power BI的“总裁仪表盘”,将所有数据汇总实时监控


391.纯软件申请发明专利


392.云端、客户端双工模式改造。

关心的是接受recv怎么判断已经接收完毕,或者说是否一直等待接收?

TCP是有多少就收多少,如果没有当然阻塞Socket的recv就会等,直到有数据,非阻塞Socket不好等,而是返回WSAEWOULDBLOCK。UDP,如果没有数据,阻塞Socket就会等,非阻塞Socket也返回WSAEWOULDBLOCK。如果有数据,它是会等整个发包到齐,并接收到整个发包,才返回。


说得好,正常人类的想法。这就放心了。

当应用程序调用recv函数时,recv先等待s的发送缓冲 中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数 据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到 协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。


393.服务器连接两个client,完成两个client之间的通信中转模式。

粗暴解决:

        try:
             obj.connect((HOST,PORT))
        except:
            #已经连接,跳过
            pass


obj.connect((HOST,PORT))

OSError: [WinError 10056] 在一个已经连接的套接字上做

了一个连接请求。


服务器端怎么维持两路连接,并相互传递消息。再用线程?

答案:不必。在单用户的条件下,建立两条专用连接就可以。连接在服务器端以公共变量的形式维护。

调试场面,很壮观:


394.本地调试好好的,到服务器端开始作妖。而且已经安装了python3,重启后竟然回到python2。重新再装一遍。


换上python3后,一切变得美好。曾经被python2代码页、code折磨的一地头发的日子,真是操蛋。python2这个二货,不会自己判断文件的编码,一定要加个# -*- coding: utf-8 -*-,中文前面要加u。想想那个岁月,气不打一处来。

看看这文章,解释器这二货:

关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 - 转



服务器莫名其妙会退出:ssh

找到一个解决方法:

nohup python /var/ftp/test/test/ cloudSocketServer.py &

nohup python cloudSocketServer.py &

查看运行中的进程:

ps -ef




与data服务器的连接丢失


recv()会一直等,如果连接丢失就傻等了。

经过测试, 发现通道断开或者close之后,就会一直收到空字符串。 而不是所谓的-1 或者报异常。这个跟C 和java等其他语言很不一样

几乎可以断定,python的socket是来逗比的。

最终是通过多进程的方法来完成。只能说python的thread、socket简直是垃圾

main中:

process = multiprocessing.Process(target=startdataservice, args=())

主线程中:

 if instr in ['q','exit','quit']:
                process.terminate()
 print("pythread 程序退出!")

Python | Different ways to kill a Thread - GeeksforGeeks


忽然想到另一条思路,线程卡在recv()上。如果这时候主线程中把socket给关了,recv()是不是就不傻等了呢?也不用死磕关闭线程了。不能关闭线程这股又黑又暴力,反D反社会的恶势力留待日后解决。


实测,顺利kill thread,但是很黄很暴力,岸上被拔气门芯,水里被拔氧气管的样子:

            if instr in ['q','exit','quit']:
                outtag=False
                #同时退出其他线程
                #closeserver()
                socketClient.isgo=False
                #print(socketServer.sk)
                socketServer.sk.close()
                process.terminate()
                #break
                print("pythread 程序退出!")
                break






395.OpenSSH

mls-software.com

不错,速度比网页版的好很多。



一段时间后运行的python脚本退出。随着ssh一起退出。

用ssh登录远程服务器运行脚本,发现断开ssh连接后程序就会停止运行,百度一下,产生的原因简单来说就是,断开ssh连接时产生的 挂断信号(SIGHUP) 信号会终止程序的运行。

解决的方法有两种:

1.让进程忽略 SIGHUP 信号

2.让程序运行在不属于ssh的进程中

使用nohup、&似乎实测。客户端多请求几次,经过几次莫名其妙的回显以后,数据服务器端与云端重新连接,终于成功了。虽然ssh已经退出,但是cloudSocketServer.py还在运行。tcp连接的断开,可能是超时或者云端的其他设置造成的。有点感觉,这费心巴力干的似乎就是传说中的代理服务器。

重新用ssh登录以后,果然还在。nohup & 妙,nohup &好,nohup &呱呱叫。

nohup python /var/ftp/test/test/cloudSocketServer.py &

方法二,未测试:

虽然nohup很容易使用,但还是比较”简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。

screen vi test.c


396.进入服务器维护梦幻折腾中:

ftp命令行不是很给力,纠缠于主动与被动,结果命令行的ftp登录了没法传文件。

神的奇了,今天突然就行了。主动模式、被动模式其实就是 cloudSocketServer.py 干的事情。主动模式就是云端可以Call远程客户,而被动模式是云端开了socket被动等远程客户Call过来。原因很简单,客户藏得比较深,没有自己独立的公网IP。妥妥的呼唤,IPV6什么时候能够普惠全宇宙。

send F:\python\autovoucher\ cloudSocketServer.py cloudSocketServer.py


一步到位:

>ftp -s:f:\python\autovoucher\ftp.txt

f:\python\autovoucher\ftp.txt

open 110.40.167.142
ftpuser2
密码
cd test
send F:\python\autovoucher\ cloudSocketServer.py cloudSocketServer.py
bye
quit


397.运行在命令行的微信 cmd-wechat-terminal。收到连个宝物,node.js & GitHubDesktop

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

Download | Node.js

When you install node.js, npm is automatically installed. However, npm gets updated more frequently than Node.js, so be sure that you have the latest version.

To test, run npm -v .


GitHub - oneatletico/cmd-wechat-terminal: WeChat running on the command line, can send and receive messages, based on itchat

# clone this repository
git clone git@github.com:oneatletico/cmd-wechat-terminal.git
# enter this repository
cd cmd-wechat-terminal
# install dependencies
pip install itchat
# run wechat.py directly
./wechat.py


GitHub Desktop


github.com/oneatletico/

就这么一个文件就行啦?

很简单,但结果很无奈。燃起的小火苗熄灭了。继续socket






怀疑node.js 是微软派来催你升级的。高版本的node.js 不支持windows7。windows7的版本号6.1。



npm install -g cnpm --registry=https: // registry.npm.taobao.org

cnpm install -g node-wechat-terminal

wechat-terminal


398.把编程划入文学范围,不知道有没有人反对。


399.断开以后重新连接还是有去多奇奇怪怪的东西


400.开始完善数据服务器的功能。

401.发现检测report汇总的公共变量会出现问题。公共变量会被其他函数改变。几个程序公用时会出现污染。

增加月份的检测语句:

index='value_'+str(mon)
if not index in list(tdata.columns):
tdata=initTableDataMutiKey(mon)


pythread,增加一个server,监听本机的socket请求



402.库存运行软件突然跳保存对话框。

wb.Close savechanges:=False


403.python脚本转exe

丢弃VBA的有一个理由,EXCEL运行VBA期间,系统剪贴板被控制。如果在其他程序中使用,会造成污染。


pyinstaller --onefile --nowindowed CloudsocketClient.py

pyinstaller --onefile --nowindowed pythread.py

pyinstaller --onefile --nowindowed --hidder-import pythread pythread.py

--hidden-import果然有用,但是要放在后面。

pyinstaller --onefile --nowindowed pythread.py --hidden-import pythread

生成的exe巨大,几百M。

pyinstaller打包后程序体积太大,如何解决?

pyinstaller -i logo.ico -F -w Main.py -p Project1.py -p Project2.py -p Project3.py --hidden-import Project1 --hidden-import Project2 --hidden-import Project3

pyinstaller动态引入会出问题

t2 = __import__("pythread")

或许你的一些脚本中使用了 import ()等格式的导入,这是pyinstaller无法识别的包导入格式,或者在运行时操作sys.path的值等等。这些都是pyinstaller无法直接识别的。需要你手动做一些其他的工作帮助pyinstaller识别这些内容。






404.在线程中运行localsocketserver,会重复运行。奇怪。单独运行的时候没有这个问题

把HOST、PORT、bind()放到私有函数体中,就没有这个问题。但是在显示中,还是看到重复运行了localsocketServer.py。问题是明确的,HOST、PORT公共变量没问题,问题在bind()应该放到函数体中,因为localsocketServer.py可能被多个模块引用。

但要命的是,包中压根没有其他模块引用呀?


def socketserver():
   global sk
   #time.sleep(5)
   HOST = '127.0.0.1'
   #HOST =172.17.0.11
   PORT = 60003 
   sk.bind((HOST,PORT))



405.连接中,服务器突然断开异常的处理,及恢复。

二道贩子的文章太多。还是看原版:

socket - Low-level networking interface - Python 3.8.11 documentation


406.python模块的依赖项。

$ pip install pipdeptree

$ pipdeptree

pip show tornado


407.目前唯一会卡死的情况。在数据服务器未上线,而客户端已经发送命令的情况。

查询云端数据服务器是否上线,或者本地增加一个强制退出的功能。

客户端卡死:等待数据服务器上线的过程中,云端服务器掉线。客户端需要重新连接,而客户端一直处于上一次的recv状态。在数据服务器端,计入了mutiprocess,可以强制结束,客户端还没有这个功能。可以加一个守护线程,定时查询连接是否存在,如果连接已经断开,尝试重新连接,连接不成功就就强制结束。


现在的顺序很尴尬,只能是先开服务器,等两端上线。

数据服务器上线后,云端不能把客户的请求再次转发。客户端虽然连接着可还是卡死。

造成的原因是,数据服务器重新连接后,云端没有相应的操作。

设计思想是,另外建一个线程,定时重新连接云端。守护线程看来是少不了的。



所有连接关闭后,服务器自己卡在那里了。


即使客户端重新连接后,服务器也不能正常工作。

408.需要被守护。

需要一个观察者的角色,解决愣头青线程的问题。

经测试,python的socket能够接受信号量的。触发连接关闭信号,recv能够理会。现在阻塞模式下最大的卡点就在recv上。

提供上线、下线通知。

感觉是重新写QQ程序。


把recv放在线程里,实现异步,就不会出现卡死。这样守护进程都不需要了。My God,太神奇了。

但是客户端会出现误操作。

thread_ret = threading.Thread(target=getret)

            
def getret():
    global ret
    ret = str(obj.recv(1024),encoding="gbk")
    print(ret)
    

解决客户端的问题,下面要解决服务器端的问题

逻辑上,数据服务器上线才能工作,否则客户端连接没有意义。


409.懒到极点。ssh,在windows下自动登录。

发现ssh命令行里没有密码选项。

windows下还有一个xshell可以用。

产生的密钥对,没有在所谓的home目录下,而是在cmd的当前目录下。

下面是神操作:

linux 客户端
ssh-copy-id -i alivio@sina.com.pub root@110.40.167.142

windows下复制生成的公钥到远程主机里面 ~/.ssh/authorized_keys 文件中。如果没有.ssh目录,需要自己建立一个,并更改目录权限为700


[root@localhost ~]# mkdir ~/.ssh

[root@localhost ~]# chmod 700 ~/.ssh/

[root@localhost ~]# vim ~/.ssh/authorized_keys

openssh用密钥登录不胜其烦。


果断弃用openssh。下载xshell

Download XShell 7 Build 0076

看到Xhell的界面整个人就不好了。


适用于 Windows 的 OpenSSH 密钥管理


为了一个无密码登录折腾半天,get到的新技能是linux下的公钥与私钥的机制。

windows安装openssh并通过生成SSH密钥登录Linux服务器_Linux_脚本之家


众多垃圾文章,抄来抄去,就是不说最后的用私钥登录的命令。还是博客园的文章靠谱。

windows cmd下ssh连接免密码问题解决 - newalan - 博客园

ssh -vT root@110.40.167.142

ssh -T -i C:\Users\Administrator\.ssh\id_rsa root@110.40.167.142

仍旧要输入密码,那搞什么。

都要输入密码

这里取真经:

如何用.bat批处理带密码登录ssh服务器 - 『悬赏问答区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn


小病毒,因为ssh.vbs与ssh同名


还是土办法搞定,sshauto.vbs:

Dim WshShell 
Set WshShell=WScript.CreateObject("WScript.Shell") 
'WshShell.Run "cmd.exe"
'WScript.Sleep 1500 
WshShell.SendKeys "ssh root@110.40.167.142"
WScript.Sleep 1500 
WshShell.SendKeys "{ENTER}"
WScript.Sleep 1500 
WshShell.SendKeys "root_abc123"
WshShell.SendKeys "{ENTER}"


如虎添翼,爽度++:

410.客户端进程被关闭的情况下,服务器的反应ConnectionResetError。

也是要谢天谢地,客户端给云端发送了信号,recv能够退出,而不是卡死。讨厌的recv,真的出错了还不能让recv把线程给搞挂了。真是活宝。

客户端再次打开就出现,服务器端口未开。ConnectionResetError的时候,服务器应该能够初始化,或者捕获错误,不导致socket关闭,不导致线程的退出。


加入try后,解决:


同样的问题,dataserver意外退出后,服务器没有挂掉,但是失灵了。dataserver再次上线后,就失去作用。客户端始终提示数据服务器未上线。

添加调用sk2Online()重置服务器,重新监听端口连接。全局标志位dataserverstate,告知客户端,未数据库服务器未上线之前不调用数据服务器API端口。

	if not issk2: 
		if dataserverstate !='connecting':   	  	
			sk2Online()			
		return "数据服务器未上线,请等待。。。"


					if dataserverstate !='connecting':
						data=socketserver_cloud_for_data(str(result))
					if dataserverstate =='connecting':
						data='数据库服务器未上线,已重置,等待连接中...'
					if data=='':
						data='返回结果为空...'										
					conn1.sendall(bytes(data,'gbk'))


下面的问题是服务器重启以后,客户端可能不知道服务器重启了。通过捕获

except ConnectionResetError:
print("服务器已重启,请重新连接")
break


在dataserver下线的情况下,服务器端没有像刚启动时一样显示客户端的请求cmd。表面看起来像阻塞。


把sk2Online()放到线程里解决。虽然dataserver也是一个独立的线程,但是不知为何sk2Online()会阻碍到云端与客户端的会话连接。反正再开一个线程有效。应该是原来那个线程本身已经退出不存在了,所以新调用sk2Online()并没有运行在原来的线程里,而是在clientthread这个线程里,所以会阻塞clientthread的运行。

	if not issk2: 
		if dataserverstate !='connecting':   	  	
			datathread=threading.Thread(target=sk2Online)					
			datathread.start()
		return "数据服务器未上线,请等待。。。"



411.一篇有意思的文章:又搞到一个新东西uve

从一心进大厂到银行科技部,我这一路的薪路历程(终于想起CSDN密码了,此次更新2021年5月14日)_infent的博客-CSDN博客_银行科技部出来跳槽去哪


Vue3 教程 | 菜鸟教程


412。开始作,多客户端。

貌似多客户端能和运端进行连接。但是只有最初的一个能和数据服务器互动。如果最初的下线后,存在多个客户端的情况下,谁都用不了数据服务器。

可以实现一个客户端退出后,另一个进入使用。也就是不能并行。

很奇怪,服务器已经退出,客户端没有退出,结果服务器无法重启,说是端口被占用。

非阻塞的recv方法会继续向下执行,若超时得不到数据则会抛出异常。

Python实现一个服务器监听多个客户端请求 - 码农教程


云端通过连接轮询的方式响应客户端的连接。

忽然发现所谓的负载平衡就是多个数据服务器之间分配任务。


解决了多客户端,单服务器多请求怎么办的问题待解决。

多个客户端,申请同样的命令,一个回复结果,另一个回复cmd error。


而且后面,无论是谁请求都是error cmd。应该是有公共变量被污染了。

通过队列完美解决数据服务器的访问控制问题。遗憾的是quene竟然不属于python的内建变量。list捏吧捏吧不就成了吗。后来先出的话可以直接list,处于公平还是用队列。


413.处理信息接收不全的问题。小米加步枪的时代不会超过buf的size。现代加特林就出现数据一次接收不完的问题。

和一个啥都不懂的人,解释序列化,对象传输简直是对老虎弹琴。不解风情,还有危险。

连接稳定性问题出来,数据服务器自己会下线:


本地运行是没有问题的:


lsof -i:

云端主动断开,处于listen状态:


netstat:

本地还显示处于建立状态。解决这个问题,一个是查云端主动断开的原因,另外一个是本地守护线程,定时检测与服务器的连接是否有效。


414.下一步可以实现一下,点对点的通信。目前还是单通道的通信。初步设想在信息上加个头,区别信息是请求服务还是发送聊天信息,或者消息cmdstr中自带区分标记。后者会出现特定词汇必须留作关键字不能再聊天中使用。借鉴ruby的"`"反单引号(backquote)操作。


415.解决一个多进程与多线程,公共变量不通用的问题。


416.服务端的端口不能及时推出,还是那个问题。客户端还挂着。如果多客户端存在,始终回事个问题。


417.python 解决端口占用:

def kill_process(port):#解决单口占用
    ret = os.popen("netstat -nao|findstr " + str(port))
    #注意解码方式和cmd要相同,即为"gbk",否则输出乱码
    str_list = ret.read().decode('gbk')
    ret_list = re.split('',str_list)
        process_pid = list(ret_list[0].split())[-1]
        os.popen('taskkill /pid ' + str(process_pid) + ' /F')
        print("端口已被释放")
    except:
        print("端口未被使用")

418.服务器断开后,本地的socket没有初始化。先要杀掉本地端口



419.云端的这段代码不能预想得工作。问题出在服务器的recv并不是随时的,而是根据客户端的请求队列来的。所以在datasrv发送测试字符时,是缓存在接收缓存上,知道请求队列发来请求时一并读取。如果要实时在云端显示测试字符串,要另想办法。如果仅是保证结果,可以在接收的字符串中replace掉测试字符串,有一个风险就是巨量的测试字符串导致不能一次接收完实际的数据。高处不胜寒,处处漏风的感觉。

云端队列中没有请求时,仍然要一个监听进程。这个进程只属于云端与datasrv的二人世界。

发送的测试字符为空字符串也是一个不错的选择。这样两不相欠,各部麻烦。

                    while True:
                        result = data.decode('gbk')
                    #在阻塞状态发的消息,原则上会在
                        if '`_test' in result:
                            print("Get from DataSRV teststring  %s :%s"%(address,result))
                            result=''
                        else:
                            break

420.服务器向客户端广播消息,却发现客户端没有监听云端的消息。

还是要干在服务器端杀进程的事

ps -ef


fuser -v -n tcp 8080

kill -s 9 1154(自己的进程号)

lsof -i


def kill_process(port):#解决单口占用
    print("kill_process:",port)
    ret = os.popen("lsof -i|grep " + str(port))
    str_list=ret.read()
    print(str_list)
    ret_list=str_list.split('\n')
    pid=[]
    for l in ret_list:
        ll=l.split(' ')
        if len(ll)>5:
            print(ll[5])
            pid.append(ll[5])
    for r in pid:
        os.popen('kill ' + str(r))
            print("端口已被释放:",r)
        except:
            print("端口未被使用:",r)


421.现在看来,socket收发是可以异步的。用两个线程分别操作发送与接收。

通过两个线程,客户端与云端实现双工。

def cloudClient():#cmdstr发送进程
    #if 1:    
    global obj,ret
    while isruning:
        cmd = input("Please input cmd:\n ")
        #cmd='q'
            if isruning:
                obj.sendall(bytes(cmd,'gbk'))
            if cmd =='q':#自己退出,不发送
                print('remote client quit')
                break  
            if cmd =='cq':#通知各方退出
                print('server、client quit')
                break   
        except ConnectionAbortedError:
            print("连接服务器已经断开,请重新连接!")
            break
        except ConnectionResetError:
            print("服务器已重启,请重新连接")
            break
    obj.close() 
    print("client: send closeserver")
def recvThread():    #接收进程
    global isruning    
    while isruning:
        getret()

422.有点理解为什么以太网有广播功能的重要性。

间隔两天后再连接云端服务器,云端服务器还是正常运作。实测nohup ...&的作用有效:

nohup python /var/ftp/test/test/ cloudSocketServer.py &


423.如晶体管到集成电路之旅,会计如何涅槃重生,如何杠上开花。边走边学习

如何快速成为数据分析师?

愿意去学这个的就是企业可以用的人。获得意识比工具更重要。作为人工智能的前端。

哪些企业到了需要数据分析的地步:企业管理者转型。数据分析师,更有承前启后,更好衔接的名称是:数据管理者。数据是企业的一项资产,管理者一般是企业的中层。

淘宝,支付宝没了,对世界毫无影响,就像黑夜过去了,就是白天,轮回。
  • 数据存储层:Access、SQL Server、DB、Oracle等
  • 数据处理层:Python、Hadoop
  • 数据报表层:Finereport
  • 数据展示层:Tableau、Powerbi、Finebi


此外Tableau是国外的工具,一是服务体系不够全,出了问题要解决很久,这是不能接受的;二是价格实在是太高,动不动就上百万。

FineReport

FineBI


424.财务数据报表布局


425.运行中发现数据服务器连接失效,但是并没有发现。问题还是处在测试信号没有得到服务器的应答。实测socket底层未发送错误消息。看人脸色的事情未必靠谱。

datasrv莫名多次掉线。

可能是真的断了,也可能是云端的变量污染了。


诡异,服务器清理了端口,再ssh中重新开了一个云端服务器,竟然和nohup的进程同时有效。


bug造成。没有注释掉HOST='127.0.0.1'。编程服务器监听本机的内部端口了。所以都不冲突


nohup &开启的进程,没法通过杀端口的方式消灭。

ps -ef|grep cloudSocketServer2.py



426.对云端、数据服务器端都是主线程+接收进程改造。

一问一答,缠缠绵绵,到天涯。海枯石烂,只要不断电。

再在信息上加一个时间戳会更高级一点。



427.数据化以后派生的岗位,数据运维。

数据库运维、数据安全运维。数据优化、数据应用。

DBA+网管+网络架构


428.一个完整的具有收发功能的模块有三个线程:监听+发送+守护进程。监听功能提供多客户端的广播与轮训功能。发现我是不是搞了一个花生壳

花生壳价格:



阿里的确走得快。



看割韭菜的套路:


这认证那认证以后,还是异常。看到DNS设置次数限制。

可以故意卡速,要求用本地的辅助dns



分用户刮油,个人用户、企业用。简单的事情被奸商套路得到处是坑。

诱骗进入后,要求升级才给DNS解析选项

注册域名,然后DNS服务再收费。

莫名其妙正常了。


体验一次后就可以ping通


ftp可以正常使用。

一会儿后,阿里云发来消息,一个公共DNS实例创建成功。请登录公共DNS控制台查看及管理。


心理慌慌,实在不明白这所谓的公共DNS与域名解析的关系,是不是二道贩子,还是李鬼,能不能不要这个阿里的关系户呢?注册了域名,域名解析不应该包的吗?要不然注册域名你收的什么费呢?我注册一个域名不用是玩寂寞吗?我注册域名可以不用你解析,但是你不能不提供解析功能吧。


一入贼门深似海。




429.文件的域名话改造,这样更通用一点。IP说不定什么时候改了。花一次停车费的钱租一年的域名,也算可以接受。呼唤IPV6。

get到两个技能,socket还能解析域名。问,能不能直接bind域名呢?

数组还可以这样用, res[0][4][0],三维,有点查找树的感觉。


>>> import socket
>>> url='clouddata.ltd'
>>> res = socket.getaddrinfo(url, None)
>>> print(res)
[(<AddressFamily.AF_INET: 2>, 0, 0, '', ('110.40.167.142', 0))]
>>> ip = res[0][4][0]
>>> print(ip)
110.40.167.142


有域名,走域名化道路。ssh域名好像搞不定。

ftp改造完成。

open cloudData.ltd
ftpuser2
cd test
send F:\python\autovoucher\cloudSocketServer.py cloudSocketServer.py
send F:\python\autovoucher\cloudSocketServer2.py cloudSocketServer2.py
quit



430.阿里云服务器


终端多开比腾讯的好:


阿里叫workbench。


没有Python,这日子怎么过。腾讯有个2.7版本的。


再来一遍:

yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel


速度不是很美好:

wget python.org/ftp/python/3


tar -zxvf Python-3.8.8.tgz

mv Python-3.8.8 /usr/local


开干之前的小碎步:

ll /usr/bin | grep python

有个python3.6,尴尬了


rm -rf /usr/bin/python

cd /usr/local/Python-3.8.8/

./configure

make

make install

rm -rf /usr/bin/python

ln -s /usr/local/bin/python3.8 /usr/bin/python #link的意思,创建一个快捷方式

python -V


lsof -i

1.ifconfig -a 或 ifconfig | grep inet (展示更为简洁)

2.ip addr 或 ip addr| grep inet (展示更为简洁)


云服务器 Linux 云服务器搭建 FTP 服务

ftp服务器

yum install -y vsftpd

systemctl enable vsftpd

systemctl start vsftpd

netstat -antup | grep ftp

useradd ftpuser

mkdir /var/ftp/test

chown -R ftpuser:ftpuser /var/ftp/test

vim /etc/vsftpd/vsftpd.conf

这个vim舒服多了。

anonymous_enable=NO
local_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES

ipV4和ipV6不能同时被监听,这边需要去掉一个监听设置,常规情况下只要去掉ipV6得就可以了。

  1. #listen_ipv6=YES


local_root=/var/ftp/test
allow_writeable_chroot=YES
pasv_enable=YES
pasv_address=xxx.xx.xxx.xx #请修改为您的 Linux 云服务器公网 IP
pasv_min_port=40000
pasv_max_port=45000


  1. vim /etc/vsftpd/chroot_list

i 进入编辑模式,输入用户名,一个用户名占据一行,设置完成后按 Esc 并输入 :wq 保存后退出。


  1. systemctl restart vsftpd

小虫虫,ipv6与ipv4不能同时监听


上次忘了记录怎么设置ftp用户的密码了。

vim /etc/vsftpd/chroot_list

ystemctl restart vsftpd

用户一行,密码一行。这么明晃晃的密码有点不符合潮流。

理解错误,chroot_list是列出可以访问上级目录的用户。

passwd命令。看来用户是全局管理的。


发现无法创建文件夹:

chown -R ftpuser2:ftpuser /var/ftp/test




平滑过渡到阿里的服务器:


碰到一个问题nohup &方式在阿里这里不管用。

nohup python cloudSocketServer2.py &

netstat -antp |grep 60001

lsof -i

ok。看到EXit 2,信息。是错误退出。cd /var/ftp/test/,再运行。ok!






431.有域名就好玩了。添加二级域名a.cloudData.ltd指向阿里的服务器。



432.飞桨

飞桨AI Studio - 人工智能学习与实训社区


飞桨PaddlePaddle-源于产业实践的开源深度学习平台

bash -c "$(curl -X GET http://ppoc-filecenter.bj.bcebos.com/install_paddlecloud_stable.sh)"; source ~/.bashrc


pip3 install requests
pip3 install rsa

paddlecloud gen_token --email=alivio@sina.com


-bash: install_paddlecloud_stable.sh: command not found

命令前加bash install_paddlecloud_stable.sh就行。节操

可能是ssh远程登录的原因吧。怪不得飞桨大佬群里对这个问题默不作声。

vim .bashrc

linux 花花肠子多。

在一般的 linux 或者 unix 系统中, 都可以通过编辑 bashrc 和 profile 来设置用户的工作环境,

login shell 和 no-login shell
“login shell” 代表用户登入, 比如使用 “su -“ 命令, 或者用 ssh 连接到某一个服务器上, 都会使用该用户默认 shell 启动 login shell 模式.
该模式下的 shell 会去自动执行 /etc/profile ~/.profile 文件, 但不会执行任何的 bashrc 文件, 所以一般再 /etc/profile 或者 ~/.profile 里我们会手动去 source bashrc 文件.
是什么 shell 可以通过 finger [USERNAME] 命令来查看
bashrc 也是看名字就知道, 是专门用来给 bash 做初始化的比如用来初始化 bash 的设置, bash 的代码补全, bash 的别名, bash 的颜色. 以此类推也就还会有 shrc, zshrc 这样的文件存在了, 只是 bash 太常用了而已.

理解 bashrc 和 profile





ln -s ~/bin/paddlecloud/paddlecloud/paddlecloud ~/bin/paddlecloud

ln: failed to create symbolic link '/root/bin/paddlecloud/paddlecloud': File exists

ln -s ~/bin/paddlecloud/paddlecloud/paddlecloud ~/bin/paddlecloudlink

想到一个好主意:

ln -s ~/bin/paddlecloud/paddlecloud/paddlecloud /usr/bin/paddlecloud

paddlecloudlink gen_token --email=alivio@sina.com

user_id: b254affb9032d4c36ee7d0fd558d1dff

paddlecloudlink plsc

paddlecloudlink query_job --job_id=job-ebd980fc9b3be8dbc9805803b58a54fe

paddlecloudlink get_files --job_id=job-ebd980fc9b3be8dbc9805803b58a54fe --download=1

rm -rf output/ #删除目录


语意理解:

阿里服务器自动屏蔽了github的链接。鸡贼得很

wget ppoc-filecenter.cdn.bcebos.com

unzip -q ernie.zip


submit.sh

#!/bin/bash
# 1) wget https://ppoc-filecenter.cdn.bcebos.com/ernie.zip
# 2) unzip -q ernie.zip
# 3) cd ernie
# 4) mv * ./job
if [[ ! -f "./job/CoLA.zip" && ! -f "./job/ERNIE_Base_en_stable-2.0.0.tar.gz" && ! -f "./job/ERNIE.tar.gz" ]]; then
    echo "Please download https://ppoc-filecenter.cdn.bcebos.com/ernie.zip && unzip ernie.zip && cd ernie && mv * ./job"
    exit -1
paddlecloud submit_job --files=job --start_cmd="sh run.sh"

估计可以换一个阿里的服务器试试

阿里开始作妖:



受不了阿里服务器的鸟速度,下个cygwin。当头一棒。cygwin鸡肋了。

cygwin默认不安装yum在线更新软件,所以,在windows上用cygwin命令行安装软件时,不能用yum安装


win7 vmware12


aistudio.baidu.com/bdcp



这阿里服务器的ssh反应速度让人有点吃不消。

对阿里的速度専次失望。我这是装了移动宽带吗


这是和谁在一起呀?后生可畏。


433.让linux与linux对话吧 。好在现在设备内存、cpu已经不可同日而语。

安装是图形,登录一抹黑。这是什么情况。

看来全国统一python 2.7



网关设置:

cd /etc/sysconfig/network-scripts

哭死了,安装的是最小版本,连个vim都没有。还好有vi

反正也不知道为什么要sudo,反正跟着做呗。

sudo vi ifcfg-ens33

修改后:


service network restart

终于OK

IPADDR有讲究,突然想起不能是0,0是广播地址。


centos7 网络配置_greatxiaoting的专栏-CSDN博客_centos7网络配置


网络铺通了就可以为所欲为了。

在胡作非为之前,先安装一个vmare的键鼠、剪贴板功能。

在 Linux 虚拟机中手动安装或升级 VMware Tools

Linux命令行安装 VMware tools 工具的方法

mkdir /mnt/cdrom

mount /dev/cdrom /mnt/cdrom/

cp VMwareTools-10.2.5-8068393.tar.gz /tmp

tar zxvf VMwareTools-10.2.5-8068393.tar.gz

yum install perl

cd vmware-tools-distrib

ls

./vmware-install.pl //安装开始

谁说linux好的,坑贼多。

yum install net-tools
yum install gcc
yum update
yum install  build-essential
yum  install  libx11-6 libx11-dev libxtst6 xinetd
yum install  linux-headers-` uname  -r` build-essential


先是将kernel、kernel-headers、kernel-devel全部卸载
安装kernel:yum install kernel-$(uname -r)
安装kernel-headers:yum install kernel-headers-$(uname -r)
安装kernel-devel:yum install kernel-devel-$(uname -r)

好像命令行里vmware tools没什么毛用。剪贴板就没用。

yum groupinstall "X Window System"  //注意有引号

yum grouplist

yum groupinstall "GNOME Desktop" "Graphical Administration Tools"

startx

systemctl get-default

systemctl set-default multi-user.target

reboot


剪贴板可以用了。下面解决中文输入法

通过设置来选


先按住Ctrl按键,再按space空格键!!!

按Ctrl+Alt+F2到命令行界面。

按Ctrl+Alt+F1到图形界面。


再再来一遍,享受来来回回的乐趣。幻觉,其实啥都没做,即使个搬砖工:

yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

wget python.org/ftp/python/3

速度稍好一点400K/s,问题还是源的问题。

tar -zxvf Python-3.8.8.tgz

mv Python-3.8.8 /usr/local

ll /usr/bin | grep python

rm -rf /usr/bin/python

cd /usr/local/Python-3.8.8/

./configure

make

make install

rm -rf /usr/bin/python

ln -s /usr/local/bin/python3.8 /usr/bin/python #link的意思,创建一个快捷方式

python -V

为了上飞桨,不受阿里云的鸟气:

再上飞桨


飞桨AI Studio - 人工智能学习与实训社区

飞桨PaddlePaddle-源于产业实践的开源深度学习平台

bash -c "$(curl -X GET http://ppoc-filecenter.bj.bcebos.com/install_paddlecloud_stable.sh)"; source ~/.bashrc


pip3 install requests rsa

ln -s ~/bin/paddlecloud/paddlecloud/paddlecloud /usr/bin/paddlecloud

paddlecloud gen_token --email=alivio@sina.com

user_id: b254affb9032d4c36ee7d0fd558d1dff


语意理解:

文心ERNIE-领先的百度语义理解技术与平台

github.com/PaddlePaddle

阿里服务器自动屏蔽了github的链接。鸡贼得很

wget ppoc-filecenter.cdn.bcebos.com

速度可观,也算不枉折腾一上午。阿里这老鸟,呸。

unzip -q ernie.zip

mv ernie job

cd job
cp ./script/run.sh run.sh

sh submit.sh

submit.sh

#!/bin/bash
# 1) wget https://ppoc-filecenter.cdn.bcebos.com/ernie.zip
# 2) unzip -q ernie.zip
# 3) cd ernie
# 4) mv * ./job
if [[ ! -f "./job/CoLA.zip" && ! -f "./job/ERNIE_Base_en_stable-2.0.0.tar.gz" && ! -f "./job/ERNIE.tar.gz" ]]; then
    echo "Please download https://ppoc-filecenter.cdn.bcebos.com/ernie.zip && unzip ernie.zip && cd ernie && mv * ./job"
    exit -1
paddlecloud submit_job --files=job --start_cmd="sh run.sh"

create job: job-d639f9877ef34a0d86ff83600fa46998


PaddleCloud/README.md at ppoc · PaddlePaddle/PaddleCloud

PaddleCloud/example/ernie at ppoc · PaddlePaddle/PaddleCloud

速度是上去了,结果来了一个interal error。砸盘了。

paddlecloud query_job --job_id=job-5cae08f03849d3ffa9833b0e02d8e181

paddlecloud get_files --job_id=job-5cae08f03849d3ffa9833b0e02d8e181

paddlecloud get_files --job_id=job-5cae08f03849d3ffa9833b0e02d8e181 --download=1


434.面上看怎么入套。

1.流量上找事,购买流量包

2.带宽上来事。要求办理不限流套餐




435.学一下AI理论

确定模型参数

这个有趣的案例演示了机器学习的基本过程,但其中有一个关键点的实现尚不清晰,即:如何确定模型参数(w=1/m)(w=1/m)( w =1/ m )?

确定参数的过程与科学家提出假说的方式类似,合理的假说至少可以解释所有的已知观测数据。如果未来观测到不符合理论假说的新数据,科学家会尝试提出新的假说。如天文史上,使用大圆和小圆组合的方式计算天体运行在中世纪是可以拟合观测数据的。但随着欧洲机械工业的进步,天文观测设备逐渐强大,越来越多的观测数据无法套用已有的理论,这促进了使用椭圆计算天体运行的理论假说出现。因此, 模型有效的基本条件是能够拟合已知的样本 ,这给我们提供了学习有效模型的实现方案。

这个 衡量模型预测值和真实值差距的评价函数也被称为损失函数(损失Loss)


高级语音概念:

不是所有的任务都像牛顿第二定律那样简单直观。对于中的美女照片,人脑可以接收到五颜六色的光学信号,能用极快的速度反应出这张图片是一位美女,而且是程序员喜欢的类型。但对计算机而言,只能接收到一个数字矩阵,对于美女这种高级的语义概念,从像素到高级语义概念中间要经历的信息变换的复杂性是难以想象的!这种变换已经无法用数学公式表达,因此研究者们借鉴了人脑神经元的结构,设计出神经网络的模型。

人工神经网络包括多个神经网络层,如卷积层、全连接层、LSTM等,每一层又包括很多神经元,超过三层的非线性神经网络都可以被称为深度神经网络。通俗的讲,深度学习的模型可以视为是输入到输出的映射函数,如图像到高级语义(美女)的映射,足够深的神经网络理论上可以拟合任何复杂的函数。

  • 神经元: 神经网络中每个节点称为神经元,由两部分组成:
    • 加权和:将所有输入加权求和。
    • 非线性变换(激活函数):加权和的结果经过一个非线性函数变换,让神经元计算具备非线性的能力。


  • 多层连接: 大量这样的节点按照不同的层次排布,形成多层的结构连接起来,即称为神经网络。
  • 前向计算: 从输入计算输出的过程,顺序从网络前至后。
  • 计算图: 以图形化的方式展现神经网络的计算逻辑又称为计算图。我们也可以将神经网络的计算图以公式的方式表达,如下:

Y=f3(f2(f1(w1⋅x1+w2⋅x2+w3⋅x3+b)+…)…)…)Y =f_3 ( f_2 ( f_1 ( w_1\cdot x_1+w_2\cdot x_2+w_3\cdot x_3+b ) + … ) … ) … ) Y = f 3​( f 2​( f 1​( w 1​⋅ x 1​+ w 2​⋅ x 2​+ w 3​⋅ x 3​+ b )+…)…)…)

由此可见,神经网络并没有那么神秘,它的本质是一个含有很多参数的“大公式”。如果大家感觉这些概念仍过于抽象,理解的不够透彻,先不用着急,后续我们会以实践案例的方式,再次介绍这些概念。


深度学习改变了很多领域算法的实现模式。在深度学习兴起之前,很多领域建模的思路是投入大量精力做特征工程,将专家对某个领域的“人工理解”沉淀成特征表达,然后使用简单模型完成任务(如分类或回归)。而在数据充足的情况下,深度学习模型可以实现端到端的学习,即不需要专门做特征工程,将原始的特征输入模型中,模型可同时完成特征提取和分类任务,如 图12 所示。


以计算机视觉任务为例,特征工程是诸多图像科学家基于人类对视觉理论的理解,设计出来的一系列提取特征的计算步骤,典型如SIFT特征。在2010年之前的计算机视觉领域,人们普遍使用SIFT一类特征+SVM一类的简单浅层模型完成建模任务。


将数据集划分成训练集和测试集,其中训练集用于确定模型的参数,测试集用于评判模型的效果。为什么要对数据集进行拆分,而不能直接应用于模型训练呢?这与学生时代的授课和考试关系比较类似

对每个特征进行归一化处理,使得每个特征的取值缩放到0~1之间。这样做有两个好处:一是模型训练更高效;二是特征前的权重大小可以代表该变量对预测结果的贡献度(因为每个特征值本身的范围相同)。【每一列,每一个特征向量的标准化】

Python 3以后 : " / "就表示 浮点数除法,返回浮点结果;" // "表示整数除法。

模型设计是深度学习模型关键要素之一,也称为网络结构设计,相当于模型的假设空间,即实现模型“前向计算”(从输入到输出)的过程。【所谓专家就是不好好说人话】

如果模型中含有非线性变换,或者损失函数不是均方差这种简单的形式,则很难通过上式求解。为了解决这个问题,下面我们将引入更加普适的数值求解方法:梯度下降法。

在现实中存在大量的函数正向求解容易,但反向求解较难,被称为单向函数,这种函数在密码学中有大量的应用。密码锁的特点是可以迅速判断一个密钥是否是正确的(已知xx x ,求yy y 很容易),但是即使获取到密码锁系统,无法破解出正确的密钥是什么(已知yy y ,求xx x 很难)。

这种情况特别类似于一位想从山峰走到坡谷的盲人,他看不见坡谷在哪(无法逆向求解出LossLoss Loss 导数为0时的参数值),但可以伸脚探索身边的坡度(当前点的导数值,也称为梯度)。那么,求解Loss函数最小值可以这样实现:从当前的参数取值,一步步的按照下坡的方向下降,直到走到最低点。这种方法笔者称它为“盲人下坡法”。哦不,有个更正式的说法“梯度下降法”。

观察上述曲线呈现出“圆滑”的坡度,这正是我们选择以均方误差作为损失函数的原因之一。 图6 呈现了只有一个参数维度时,均方误差和绝对值误差(只将每个样本的误差累加,不做平方处理)的损失函数曲线图。【说得象那么回事,老师肯定不给补课不会说】


而绝对值误差是不具备这两个特性的,这也是损失函数的设计不仅仅要考虑“合理性”,还要追求“易解性”的原因。

运行上面的代码,可以发现沿着梯度反方向走一小步,下一个点的损失函数的确减少了。感兴趣的话,大家可以尝试不停的点击上面的代码块,观察损失函数是否一直在变小。

在上述代码中,每次更新参数使用的语句: net.w[5] = net.w[5] - eta * gradient_w5

  • 相减:参数需要向梯度的反方向移动。
  • eta:控制每次参数值沿着梯度反方向变动的大小,即每次移动的步长,又称为学习率。【又是一个砖家术说】

大家可以思考下,为什么之前我们要做输入特征的归一化,保持尺度一致?这是为了让统一的步长更加合适。

图8 所示,特征输入归一化后,不同参数输出的Loss是一个比较规整的曲线,学习率可以设置成统一的值 ;特征输入未归一化时,不同特征对应的参数所需的步长不一致,尺度较大的参数需要大步长,尺寸较小的参数需要小步长,导致无法设置统一的学习率。


在上述程序中,每次损失函数和梯度计算都是基于数据集中的全量数据。对于波士顿房价预测任务数据集而言,样本数比较少,只有404个。但在实际问题中,数据集往往非常大,如果每次都使用全量数据进行计算,效率非常低,通俗地说就是“杀鸡焉用牛刀”。由于参数每次只沿着梯度反方向更新一点点,因此方向并不需要那么精确。一个合理的解决方案是每次从总的数据集中随机抽取出小部分数据来代表整体,基于这部分数据计算梯度和损失来更新参数,这种方法被称作随机梯度下降法(Stochastic Gradient Descent,SGD),核心概念如下:

【又是一个装B】

通过大量实验发现,模型对最后出现的数据印象更加深刻。训练数据导入后,越接近模型训练结束,最后几个批次数据对模型参数的影响越大。为了避免模型记忆影响训练效果,需要进行样本乱序操作。



436.迁移一下vmware。

生命不止,折腾不止。



cd /etc/sysconfig/network-scripts

sudo vi /etc/sysconfig/network-scripts/ ifcfg-ens33


重新生成MAC地址:

00:50:56:39:0B:26

预装了视窗系统,startx

service network restart

迁移成功!


437.接下来要搞的事情是把飞桨上的一个项目弄到paddlecloud上去运行。

飞桨AI Studio - 人工智能学习与实训社区

这次搞到了一个牛的环境:

这样的配置还不够?


os.environ[‘FLAGS_eager_delete_tensor_gb’] = “0.0”

主要作用是 GPU memory garbage collection optimization flags


curl bootstrap.pypa.io/get-p -o get-pip.py

python3 get-pip.py

我们经常通过pip安装东西时常常会出现ERROR: Could not find a version that satisfies the requirement xxx的问题。该问题常常会误导我们认为是下载的安装包之间存在冲突,因而花费大量的时间去配置各种各样的环境。

其实出现这个问题的原因是python国内网络不稳定,直接导致报错。

~/.pip/pip.conf

[global]
timeout = 3000
index-url = http://mirrors.aliyun.com/pypi/simple
[install]
trusted-host=mirrors.aliyun.com

pip3 install paddlehub==2.0.0b1

pip install paddlehub No matching distribution found for easydict

ERROR: Could not find a version that satisfies the requirement easydict (from paddlehub) (from versions: 1.0, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9)
ERROR: No matching distribution found for easydict

pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple easydict

Python3中有个内置模块叫ctypes,它是Python3的外部函数库模块,它提供兼容C语言的数据类型,并通过它调用Linux系统下的共享库(Shared library),此模块需要使用CentOS7系统中外部函数库(Foreign function library)的开发链接库(头文件和链接库)。
由于在CentOS7系统中没有安装外部函数库(libffi)的开发链接库软件包,所以在安装pip的时候就报了"ModuleNotFoundError: No module named '_ctypes'"的错误。

python ctypes的外衣下真正依赖的东西:

yum install libffi-devel -y

再重新安装一下python3.8.8
tar -zxvf Python-3.8.8.tgz
mv Python-3.8.8 /usr/local
开干之前的小碎步:
ll /usr/bin | grep python rm -rf /usr/bin/python
cd /usr/local/Python-3.8.8/
./configure
make install
rm -rf /usr/bin/python ln -s /usr/local/bin/python3.8 /usr/bin/python python -V


所有招都用上,总算是行了。

pip3 install paddlehub==2.0.0b1

pip3 install sentencepiece==0.1.92





import paddlehub as hub

AttributeError: module 'paddle' has no attribute 'Tensor'


估计是虚拟机玩不了paddle。不管了,直接

pip3 install tensorflow

pip3 install paddlepaddle

import paddlehub as hub

Error: Can not import avx core while this file exists: /usr/local/lib/python3.8/site-packages/paddle/fluid/core_avx.so

ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /usr/local/lib/python3.8/site-packages/paddle/fluid/core_avx.so)

不管理,病急乱投医:

yum install anaconda


验证安装失败 .

属于疑难杂症。估计要熄火了。

pip install --index-url test.pypi.org/simple/ --extra-index-url pypi.org/simple easydict

pip3 install paddlepaddle==2.0.1

pip3 install paddlenlp==2.0.0rc7 tb-paddle==0.3.6


问题出在系统库上,学到新技能:

strings /usr/lib64/libstdc++.so.6|grep CXXABI

可能是画蛇添足的安装tensorflow造成的。

单独下载libstdc++.so.6.24

ln -s /usr/local/bin/python3.8 /usr/bin/python

cd /usr/lib64

rm libstdc++.so.6

cp libstdc++.so.6.0.24 libstdc++.so.6

这一关是算过去了。import paddlehub as hub,又出幺蛾子

batch = batch.batch

NameError: name 'batch' is not defined

pip install batch


解决,在出错

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/git/__init__.py", line 87, in <module>
    refresh()
  File "/usr/local/lib/python3.8/site-packages/git/__init__.py", line 76, in refresh
    if not Git.refresh(path=path):
  File "/usr/local/lib/python3.8/site-packages/git/cmd.py", line 305, in refresh
    raise ImportError(err)
ImportError: Bad git executable.
The git executable must be specified in one of the following ways:
    - be included in your $PATH
    - be set via $GIT_PYTHON_GIT_EXECUTABLE
    - explicitly set via git.refresh()
All git commands will error until this is rectified.
This initial warning can be silenced or aggravated in the future by setting the
$GIT_PYTHON_REFRESH environment variable. Use one of the following values:
    - quiet|q|silence|s|none|n|0: for no warning or exception
    - warn|w|warning|1: for a printed warning
    - error|e|raise|r|2: for a raised exception
Example:
    export GIT_PYTHON_REFRESH=quiet
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.8/site-packages/paddlehub/__init__.py", line 28, in <module>
    from paddlehub.utils.paddlex import download, ResourceNotFoundError
  File "/usr/local/lib/python3.8/site-packages/paddlehub/utils/paddlex.py", line 19, in <module>
    from paddlehub.server.server import module_server
  File "/usr/local/lib/python3.8/site-packages/paddlehub/server/__init__.py", line 17, in <module>
    from paddlehub.server.git_source import GitSource
  File "/usr/local/lib/python3.8/site-packages/paddlehub/server/git_source.py", line 24, in <module>
    import git
  File "/usr/local/lib/python3.8/site-packages/git/__init__.py", line 89, in <module>
    raise ImportError('Failed to initialize: {0}'.format(exc)) from exc
ImportError: Failed to initialize: Bad git executable.
The git executable must be specified in one of the following ways:
    - be included in your $PATH
    - be set via $GIT_PYTHON_GIT_EXECUTABLE
    - explicitly set via git.refresh()
All git commands will error until this is rectified.
This initial warning can be silenced or aggravated in the future by setting the
$GIT_PYTHON_REFRESH environment variable. Use one of the following values:
    - quiet|q|silence|s|none|n|0: for no warning or exception
    - warn|w|warning|1: for a printed warning
    - error|e|raise|r|2: for a raised exception
Example:
    export GIT_PYTHON_REFRESH=quiet


yum install git

好长的路,终于看到了成功的第一步。


import paddlehub as hub


关闭客户机,扩展一下硬盘到40G


sudo fdisk /dev/sda

m

n

w

sudo fdisk -l

shutdown -r now

partprobe /dev/sda3

pvcreate /dev/sda3

df -h

不想经历第二次的感觉

VMware 扩展CentOS磁盘容量


paddlehub的玩法:

!pip install --upgrade paddlepaddle -i https://mirror.baidu.com/pypi/simple
!pip install --upgrade paddlehub -i https://mirror.baidu.com/pypi/simple
import paddlehub as hub
lac = hub.Module(name="lac")
test_text = ["今天是个好天气。"]
r=lac.cut(test_text)


总体感觉,中文输入不是很美好,python的编辑器不是很美好。没法与vscode相比。感觉和胡巴分词没什么两样。







paddlehub、paddlepaddle 不是同一个东西吗

PaddlePaddle 是起源于百度的开源深度学习平台。它是简单易用的:你可以通过简单的十数行配置搭建经典的神经网络模型;它也是高效强大的:PaddlePaddle可以支撑复杂集群环境下超大模型的训练,在百度内部,已经有大量产品线使用了基于PaddlePaddle的深度学习技术。
paddle hub是什么,PaddleHub 是基于 PaddlePaddle 开发的预训练模型管理工具,可以借助预训练模型更便捷地开展迁移学习工作,旨在让 PaddlePaddle 生态下的开发者更便捷体验到大规模预训练模型的价值。PaddleHub 目前的预训练模型覆盖了图像分类、目标检测、词法分析、Transformer、情感分析五大类别。
paddlehub与pytorchhub对比,PytorchHub 目前支持18个模型,PaddleHub支持29个,PaddleHub支持的模型数量有绝对的优势;而PytorchHub涉及的方向更多,但是每个方向的模型并不多,对CV的支持更多;PaddleHub涉及的方向只有两个,CV和NLP,但是对NLP的支持尤其多,高达22个,不仅包括目前最潮的BERT,还有百度自己研发的知识增强语义表示模型Ernie,在多个中文NLP任务中表现超过BERT。pytorchHub不支持命令行运行,但PaddleHub支持,命令行运行就是指我们安装PaddleHub后,可以无需进入python环境,即可快速体验PaddleHub无需代码、一键预测的命令行功能。需要注意的是,在PaddleHub中,既可以支持命令行使用,即在终端输入。
PyTorch是一个 开源 Python 机器学习库,基于Torch,用于自然语言处理等应用程序。
Torch是一个广泛支持机器学习算法的科学计算框架。易于使用且高效,主要得益于一个简单的和快速的脚本语言LuaJIT,和底层的C / CUDA实现:
Torch7 maintained by Ronan, Clément, Koray and Soumith.







这个鸡肋在,肯定要坏事,卸载python2.7

yum remove python2

yum 好狠,自己都要删除。

Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。 [1]

python2还在。放放在修理,据说yum必须靠python2。惹不起。




要传输文件再装个ftp吧

yum install -y vsftpd

systemctl start vsftpd

netstat -antup | grep ftp

useradd ftpuser

passwd ftpuser


mkdir /var/ftp/test

chown -R ftpuser:ftpuser /var/ftp/test

vim /etc/vsftpd/vsftpd.conf

systemctl restart vsftpd

service vsftpd restart


$ vi /usr/bin/yum
将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2"即可。
# vi /usr/libexec/urlgrabber-ext-down
将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2"即可。
yum -y update
$ vi /usr/bin/yum
将第一行"#!/usr/bin/python2" 改为 "#!/usr/bin/python"即可。


访问虚拟机上ftp服务器,在虚拟机上的FTP,FTP访问模式(匿名)_陳寶平的博客-CSDN博客


sudo vi /etc/sysconfig/network-scripts/ ifcfg-ens33

VMware虚拟机下Centos7 桥接方式网络配置完整步骤

IPADDR:设置和宿主机同网段ip

NETMASK:子网掩码和宿主机相同

GATEWAY: 默认网关和宿主机相同

DNS1: 跟宿主一样

桥接的模式。这样可以直接访问虚拟机。如果NAT,对主机端口的访问谁来转发给虚拟机呢?

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO="static"
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=ba2592eb-070f-477b-afd3-c54f747cc5d2
DEVICE=ens33
ONBOOT="yes"
IPADDR=192.168.69.63
GATEWAY=192.168.69.1
NETMASK=255.255.255.0
DNS=192.168.69.1
DNS1=192.168.69.1

FTP服务

vim /etc/vsftpd/vsftpd.conf

systemctl restart vsftpd

云服务器 Linux 云服务器搭建 FTP 服务


搞得怀疑人生,虚拟机上已经可以了。为什么局域网上不行?

没天理,只能说是vmware自己的问题吧。

主机上ping虚拟机也是没有问题的。


明天看看host-only模式能不能拯救地球。

VMware虚拟机三种网络模式详解--Host-Only(仅主机模式)_wx5aa8fe213e51f的技术博客_51CTO博客

Host-Only,想想还是待研究吧。先在主机上搞个ftp服务器,让虚拟机来下载也是可以的呀。

sudo vi /etc/sysconfig/network-scripts/ ifcfg-ens33


TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO="static"
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=ba2592eb-070f-477b-afd3-c54f747cc5d2
DEVICE=ens33
ONBOOT="yes"
IPADDR=192.168.139.101
GATEWAY=192.168.139.1
NETMASK=255.255.255.0
DNS=192.168.139.1
DNS1=192.168.139.1


桥接,桥接,桥接。

可以看出:如果你想利用VMware在局域网内新建一个虚拟服务器,为局域网用户提供网络服务,就应该选择桥接模式。


438.主机建ftp服务器。

不堪回首梦魂中,今日又重来。小楼昨夜又东风。

还是windows点点快。



新建一个ftp


访问不了。可能是没有安装IIS服务,也可能是没有绑定。



删除ftp发布重新发布,选择绑定ip,然后去掉SSL。可以访问。记得是不需要安装IIS的。

虚拟机上可以访问,但是中文名字一片乱码:




439.安装vscode in linux

Documentation for Visual Studio Code


wget code.visualstudio.com/s

az764295.vo.msecnd.net/


tar -zxvf code-stable-x64-1629375493.tar.gz


mv VSCode-linux-x64 /usr/local/

chmod +x /usr/local/VSCode-linux-x64/code

cp /usr/local/VSCode-linux-x64/resources/app/resources/linux/code.png /usr/share/icons/

vim /usr/share/applications/VSCode.desktop

[Desktop Entry]
Name=Visual Studio Code
Comment=Multi-platform code editor for Linux