首页
留言
动态
归档
推荐
音乐
工具
Search
1
Emby公益服-上万部电影电视剧免费看
37,564 阅读
2
openwrt-docker部署lxk0301京东自动签到脚本
11,408 阅读
3
QuantumultX-京东签到撸京东豆
8,722 阅读
4
微信-域名被封监测以及自动更换被封域名
8,361 阅读
5
LXK0301京东签到脚本-自动提交互助码
8,010 阅读
随便写写
科学上网
Web开发
瞎折腾
登录
Search
标签搜索
quantumultx
laravel
openwrt
laravel nova
laradock
telegram
薅羊毛
google adsense
jd_scripts
京东签到
ubuntu
oh-my-zsh
web开发环境
nginx
工具
shadowsocks shadowsocksR
RBAC
权限管理
内网穿透
Python
orzlee
累计撰写
42
篇文章
累计收到
589
条评论
首页
栏目
随便写写
科学上网
Web开发
瞎折腾
页面
留言
动态
归档
推荐
音乐
工具
搜索到
7
篇与
随便写写
的结果
telegram-終點站emby自动签到
2022年01月05日
3,198 阅读
8 评论
3 点赞
2022-01-05
前言 之前写过一篇文章Emby公益服-上万部电影电视剧免费看,如今账号快到期了,需要考核后才能延长账号有效期。正准备去考核时发现不是三天一次考核机会了,而是每日签到获取积分后才能考核,一次考核需要40积分,每日签到获取的积分不固定,好像1-5分都有!考核失败还是需要72小时后才能再次考试! 这就有点蛋疼了,他们bot签到是需要回答问题验证的,之前好像没有。本想实现自动签到,就用telegram-cli试了一下,发现根本不支持内联键盘消息!!!毕竟好几年前的代码了,作者也没有在维护。那么现在只能找找其他的telegram client api集成包玩玩了! 皇天不负有心人,找到了一个python包python-telegram,赶紧上手试试看支不支持内联键盘消息! 开搞 python-telegram命名空间和python-telegram-bot有冲突,如果装了两者没法用。 有两种解决办法,要么卸载掉python-telegram-bot,要么使用virtualenv环境隔离。 python-telegram没办法在windows下使用,还不支持! 先来将环境隔离,创建一个工作目录,然后在目录下安装隔离venv是隔离环境名称: mkdir python-telegram-client cd python-telegram-client virtualenv venv # 进入隔离环境 source venv/bin/activate # 安装python-telegram pip install python-telegram # 建个文件写代码 nano server.py 退出隔离环境使用: # 退出隔离环境 deactivate 安装python-telegram 在Github看了下作者的例子和文档,随便找了个试一试。tg.get_chats()返回的都是chat_id,找不到哪个chat_id对应的群组/bot。想了个办法,查看每个chat_id最后一条消息,然后自己一个个找: from telegram.client import Telegram import re,time ... tg = Telegram(...) tg.login() result = tg.get_chats() result.wait() if result.error: print(f'get chats error: {result.error_info}') else: print(f'chats: {result.update}') # 查看所有会话的最后一条消息,用来查找对应的chat_id chat_ids = result.update['chat_ids'] for chat_id in chat_ids: chat_history = tg.get_chat_history(chat_id=chat_id,limit=1) chat_history.wait() print(f'chat id:{chat_id},message:{chat_history.update["messages"][0]["content"]}\n') ... 找到了对应的chat_id就可以和签到bot交互了。在发送签到命令之前,还需要监听新消息: tg.add_update_handler('updateNewMessage', send_verification_code) def send_verification_code(update): # 所有的新消息都会被监听,增加判断只监听自己感兴趣的 if 123456789 == update['message']['chat_id']: # print(update) # 提取问题并且计算 question = update['message']['content']['text']['text'] print(question) a = re.findall(r"\s\s(.+?)\+", question, re.M) b = re.findall(r"\+(.+?)=", question, re.M) if a and b: print(a, b) c = int(a[-1].strip()) + int(b[-1].strip()) answers = update['message']['reply_markup']['rows'][0] print(f'{a} + {b} = {c}') # 用答案和内联键盘值做匹配,一旦匹配执行按钮点击效果 for answer in answers: print(f'答案:{answer["text"]}') if int(answer['text']) == c: payload = { '@type': 'callbackQueryPayloadData', 'data': answer['type']['data'], ##每一个内联键盘都带有data数据 } # 发送答案(点击内联键盘) result = tg.call_method(method_name='getCallbackQueryAnswer', params={'chat_id': update['message']['chat_id'], 'message_id': update['message']['id'], 'payload': payload}) result.wait() if result.error: print(f'getCallbackQueryAnswer error: {result.error_info}') else: print(f'getCallbackQueryAnswer: {result.update}') break 以下是签到验证内联键盘消息部分报文: ... 'content': {'@type': 'messageText', 'text': {'@type': 'formattedText', 'text': '签到需要确认问题并选择您认为正确的答案:\n\n25 + 1 = ?\n\n请在 30 秒内作答', 'entities': [{'@type': 'textEntity', 'offset': 22, 'length': 10, 'type': {'@type': 'textEntityTypeBold'}}, {'@type': 'textEntity', 'offset': 37, 'length': 2, 'type': {'@type': 'textEntityTypeBold'}}]}}, 'reply_markup': {'@type': 'replyMarkupInlineKeyboard', 'rows': [ [ {'@type': 'inlineKeyboardButton', 'text': '26', 'type': {'@type': 'inlineKeyboardButtonTypeCallback', 'data': 'Y2hlY2tpbi1RbWFYT3Z5SzlKb0VMZmtmUURMN3ZYcVZMeFIxNk1CRQ=='}}, {'@type': 'inlineKeyboardButton', 'text': '22', 'type': {'@type': 'inlineKeyboardButtonTypeCallback', 'data': 'Y2hlY2tpbi1PVkdOSjliZTJncXgxdDdmQTFQdnc5b2RtTXoxNlJ4WA=='}}, {'@type': 'inlineKeyboardButton', 'text': '85', 'type': {'@type': 'inlineKeyboardButtonTypeCallback', 'data': 'Y2hlY2tpbi1EV1gwTDYxTzRvWmxqRjFmYTlkMThBcFZ4OW1ZbmR5Sg=='}}, {'@type': 'inlineKeyboardButton', 'text': '66', 'type': {'@type': 'inlineKeyboardButtonTypeCallback', 'data': 'Y2hlY2tpbi1WR05KOWJlMmdxeEUxaTdmQTFQdnc5b2RtTXoxNlJ4WA=='}}, {'@type': 'inlineKeyboardButton', 'text': '68', 'type': {'@type': 'inlineKeyboardButtonTypeCallback', 'data': 'Y2hlY2tpbi1sNUJrbVBOd1hxQnhWZnpmMmJBUVZMclFKN0RSOXlqeA=='}}]]}}} 最后发送签到命令: result = tg.send_message( chat_id=123456789, ##chat_id自己找一找,虽然都一样! text="/checkin", ) result.wait() tg.idle() 这就完成了一个账号的签到,如果是多个账号使用tg.idle()就不行了,tg.idle()会堵塞当前进程,需要终止信号终止。要跑多个账号只能等待一段时候后自动停止,然后再执行下一个账号。需要修改下代码,让他可以跑多个账号: accounts = ['+123456789', '+456789123', '+789456123' ...] for account in accounts: tg = Telegram(... phone=account, ...) tg.add_update_handler('updateNewMessage', send_verification_code) tg.login() ... print(f'当前账号:{account}') print(f'等待15秒,接收签到验证信息并且验证签到') time.sleep(15) tg.stop() python-telegram是支持多账户的,会保存用户凭证,所以登陆一次即可,新账户登陆还是需要输入验证码的。 现在我们将他打包成可执行程序: pip install pyinstaller 打包 pyinstaller -F server.py 打包完成在dist文件夹下。 如果直接跑起来会报错:..../libtdjson.so的话可以下载作者编译好的libtdjson.so,也可以自己编译td build。libtdjson.so的位置可以在代码中指定: tg = Telegram(...,library_path='/path/to/libtdjson.so') 这时候退出隔离环境deactivate,跑一下../dist/server,没有其他问题的话加入crontab, 设定每天执行一次即可自动签到! 结语 我个人感觉python-telegram在可编程上比telegram-cli要好用,之前LXK0301京东签到脚本-自动提交互助码一文中使用telegram-cli虽然也可以达到效果,但是不如直接敲代码来得舒服。telegram-cli更多的还是作为一个linux的telegram客户端。 python-telegram用来做签到只是个引子,更多的还是各种自动化非常简单了,毕竟官方提供了所有API。本来以为要自己集成实现API,还好有大佬做好了!
2020-06-05
阿里云活动-答题送T恤
前言 阿里云活动,限量 Linux X Hands-on Labs T恤免费领,参与linux实验并答题送T恤!!! 开搞 活动6月1-10号 获取路径: 访问 https://summit.aliyun.com/hol 体验馆-《Linux命令入门》 体验Linux场景,通过10道测试题 拿90分,T恤 Get 点击开始体验,实例创建完成,然后直接结束体验,再点击再次体验,再结束就可以开始做下一个任务了。 每天凌晨刷新200件,上午11点刷新300件好像是这样的,听说8-9号每天1000件。 可以先完成所有任务包括考试,等到刷新T恤后直接领取,领取要填写姓名,手机和收货地址 T恤有码,活动后统一收集! 考试答案 题目都一样,只是顺序可能不同。 1,下面哪个命令可以用于删除文件而无需确认 B A. rm B. rm -f C.del D.remove 2,下面哪个命令可以获取到当前工作目录的绝对路径 B A.passwd B.pwd C.whereis D.whois 3,下面哪条命令可以把f1.tst 复制为f2.txt? C A. cp f1.txt | f2.txt B.cat f1.txt | f2.txt C.cat f1.txt > f2.txt D. copy f1.txt | f1.txt 4,为了让文件的所有者有读(r)和写{w}的权限,而其他用户只能进行只读访问,权限应设置为 C A.566 B.655 C.644 D.744 5,在vim 编辑器中的命令模式下,键入( )可以光标当前所在行下添加一新行 A A.o B.p C.i D.a 6.在ps命令中,哪个参数可以用来 显示所有用户的进程? A A.a B.b C.u D.x 7,如何在文件中查找显示所有以“*”开头的行? D A. find \* file B.wc -l * < file C.grep -n * file D.grep '^\*' file (多选)8,下面哪些命令可以看到文件的大小? ACD (D选项存疑 自行判断) A.wc B.df C.du D.state (多选)9,Linux下用哪些命令可以在管道统计一个文件中单词出现的次数?ABD A.grep B.wc C.find D.awk (多选)10,下面哪些命令可以停止sshd服务? ABD A.ps -ef | grep sshd | xargs kill -9 B.killall sshd C.kill -9 sshd D.pidof sshd |xargs kill -9 结语 赶紧去撸羊毛吧!!!
2020年06月05日
826 阅读
0 评论
0 点赞
2020-05-15
GTA5限免了-7天内领取
前言 《侠盗猎车手5》(Grand Theft Auto V)从昨晚11:00开始免费领取了,昨晚官方站点已爆炸,直接500错误。今天缓解很多,可以正常领取了。活动截止到5月21日。 领取 领取地址 领取时最好不要用代理,如果IP领取次数太多可能会出现您的账户目前无法下载更多的免费游戏。epic对同一IP申请的游戏数量进行了限制(您单独的IP是绝对不会达到这个限制的),加速器可能会使大量用户使用同一IP,造成无法下载更多免费游戏,建议遇到这个问题的玩家尝试更改自己的IP 免费的东西总有很多人批量领取,然后你懂的。风气太差了,哎不想多说。 正在下载,游戏真的大!!!
2020年05月15日
564 阅读
0 评论
0 点赞
2020-05-14
jetbrains 学生包 500个
前言 找到一部分jetbrains学生包领取码,分享给大家。500个学生包(让你爽一年jetbrains全家桶),领完就没了。 使用 登陆你的jetbrains账号,然后拼接链接https://www.jetbrains.com/shop/eform/students/request?code=加上下面的code,在登陆的浏览器打开链接,下面是500个学生包code: a1ys9j11ho0gznptueydc7kmo 1fn11mctn5o3w77cdxwvij5m6 a9pjjx1ommm33sh617xymejqw 70gm6f47o654e42xdt7gi3sw5 8kcz8nk8nrg1ez1fit1fxhejh 71znawiuth942frbm9hxl4z9s 6onm2yttj081k5mgf91ajj859 1u7rmph8e9h79luuwi6avnvqz 575jycq0lsghaxauvgqdyof5l 1z2sicdpclrpasss7w8mezxcd 3inceny3o2q5jvl7gnv9ivvc4 aaw0gdgweac8v4jz6wgtdqbho cxrilafk5w7dwobsrsj98ekoa de1cdyyk5coq6n18l9sg478ix dk5rfrtlbnu8gu32rrrkfz46y 2n2l0jqserhoxnvqp748nh9cc 752sxb43wlv6kpwtrcdmc9oig bbj4kvxlvcsv0957ch58xn8s4 551ofkn5oo1llgbkxxyiuecq5 ezm1em2doh7vcdh21m58sf2vj 22f7yf06b0ldxwqh84qgezoli dvamfusy9mvoqnbxsg15iz2xb 6wdxb6y0bx2deh1ij5blibhuu 88ph0ndl9vcrcoc5qzzv1hefx 8bfcl789ysy4g7vcqt4qix89n egu0rp627hn3pm8r8b4e9abn3 43myqmm80ya1qs4wwl29wkavk 1ir72n12u0818sptofcgx918u 4gui8p7di4h3wf9jngk4metvc cg62hrmqdr62q05ivea3cprhv 2l27ea99qqby8q7wk4iwi4we 65da9zpk5v6qgm5i6lveu5hbi 858qf7psg85n0f9jnziyq0v9d 5qjpiy3j5ch7bj28x7l1op8ew 2dy0uime2wp7b1a2jns4onlob a9eejeco8ella0dyzknnwdfif e9icd3z8xg6fwtr322h3wlozf 2e164sqay2k42je7gxlqzzi11 21k7ar53iqd5m7uf95rqh4rpb 4g1cv00mzb6i19eiaztgiae7g aifpm0qihnmektz7ixbwg2hkb 3rw3ack62cdjxjik3hl14x0jd 49ta0025b7xen7uzseh6hwm4o 5ptf61mvs920kl9424buof3ib 8hnpopzktzk2x9smqetiup1hb flwu756j3eng7t08jj5ba4jo 6izv80ko8ob0ub2swp2kt7hn1 57j0zroy21mvmts3u9jdsdiv7 5996f0mnu313qhi8cs67a7iux 8t2t3y27m2xsyn3qo1ayg1agp edgqnqpeuff432gobfo9yi98q bpqeedqn3g05rdonvfwnx53pg bha7vhm7obl2mitx8mr9ca02u dwsggvft4srp2043erf7lqsxh 1bt9op8mdbe8yvvfk2661p5gw 4eaz7cd8f6eif555z0cxra7o0 8g13tt42kz8xeibz76czqo26q mcxieql6bgz2z64b9y2zyszj 8ynpqwf0zhcwwynqhhfsm72c9 1t70tzll100rwjwytqml3gurt 32fg6el0okwgr9jdlazy78rvv dj6aj2638mase96n0nm1l7f7h 4rkv6xoafvy4oxgodl4z8k466 65pu9fbnsx3cauig826mh92he avuao8jvriardzjyscohgdl5a bvulstsxcvlfyzxsdsa9bglqp 5mmvssxj68t4fom98m76e9q9g tq9h731emxu8bj4ghvxd8ckx 2jkffukbvx39uk9hw8g2dug9q 13y66c3h1dxlxgj9f8u4xinua 71a40maqjsnvgidtihsabshf9 a7ghifeu14xs56bn9tsw32qvf 46d421bv69f25zyy0bo7gvtm2 cds86t50qy0c3vd3c6e86ocva 6ia9ctlr4rpg5necl4c8xuj42 65vbqj9xh3uckay102ohzi6x9 b4t8f5kiqlod3a1gyusfv0hej 210ltg5lt6xva8u4yrvq7b9rm 67itw48x2bermtek4a0wz3akk cc70400dng6mvo416s7kn54ie 636lksxeqdy8pzzrytoupsbhk dw6d69xgpx7s4vlibws74dg9q d7snq55iu52x7u0uofoyhz7mq 7cg94ong6cjnsjn1z5wj0e745 9cvas6eiu6bborb9l7amnedyt vp2n0iskt8ssexrprkxctxkp 4gvpv023bwopk5o6e4m8ofefg 5t36otvgd92v72c2gmpk9x7x3 48ar905nfzooeh65u4d7vrpz6 cjk0udxkidou5r2ly9csl6l9y 7ttt9omwx7unw64cp0cvetufl 44qre7zqh6dylbbcdcos0clyj 172135jehftcije2sf69q36sw 70ou9w1eeetm3f5824pgovdzt 62m3amr2ezo6ci9oh6hc1cuqz 9q98usyypvdopi9hsvg7ta9gn 6jv9p85wwxp0slzbpu5vdqrdj bzy3nk8cq7jdk4zm3k09tjpp6 907a65synhz4clqrnpr5abuok 16evb5eq2c481zapmdhxqu7xt dthzdxkgy39mhr4yxfh1i09u7 42fqa4w37h6stdtco76htj2v0 3wm5uxjcsv7nmps34apsugn42 6tvdsno543rahhbll13ljhkwm 1diymr6kdqd951qct3vsho1m6 b7g6g1b98ibnoa6rh208e4wjs c44cckhqup3cpi537wtnvqn1e 8y0sdjx1kuv5orx2b3y9hs2xr 5e4lk0s87vh79zgaal4ydqc4l 7yr8gx7drzknky3wx14r6npxe zq2o40p57d5jb1f2aqex9fta 2zrrqy06y72gv1z65mpb0zohg bb05yheqk7aus2jotd7xvrj5w eqsggefmxonra8xaz1wa5luz1 41ibj1o17droy698ro9u3mcu0 3zuhxu1od7q8snrdh62gd1qdy 31kmrd3q7so0neu0a3km4zitm b9dbv4fpggxrb7rx75ixbycu6 6qzunx0oy2zb9ldavceh1f6al bhdjpmtcdr8972itslcbirvor emfg4d9w0zvsq536t1wnk03tg b073f115pd45j86bthgu53s8p aslr0ivqmcd9bfb5gl5val7h9 2vvthdvnuj4qe8n7ox0q5es8a 20a0sa8ad8ja3s194pbt4nfgy 1e6qclo1qnzhdbft1b50if6t3 4lx1hwsqcoim2zw0i7u9h42py ejax44s5p0lqypunlmbhypfu bvu8gp95e1419ed1ph59123bn 8ztsxgguf5bgliksqtwxlmuz2 1ccxtf0iqs7wzbrqyvb8matjo aj6rzl56qu8qoknwtp0npgwvx bwtdyggkx5txe72chtvp7s3c ntncswqozls41p4k79wiy4pz 851a3kzpa6lmgaleuslu3t94h cvbr5b5ckv0dp2grpyjye2zec 8naq9rd3gxv0531nbyl88yfm0 5z1qlbq1qk2lj4tae96wb4s72 5099hdcn02lilpp59g3ay9rlt eydrkpq7hfv330yc0768l6u43 6bd2vvw2rvkq39t2bdgaacj5i b7jdg339jcetu3ggalsjjpmu5 avcgx6or0p5dfsl02eqyk4fsz 2fgl1izsodnsxpvemwvrz9dri dudg69lzzcnnijt09c5n571lc 4p672xoulhls3wu7kw0db365w 396pp48igvrjrag34pcou8c6s 6x6u4tbt8ygdphos03bg4wr4v 1q410gvqb716i7xzbuk3tpqif 4ukvfgavggfcqw4fmc9xykj8k kqkqjxfd7qhsik852jb9lmwl 86evjcgsz67scmr3p3pszujge b1383debllopietw07gum02nu 14bf5cj9xvbj0bqtmv7tmtshn 4epzzj2yijx36rp09bk9gocby 4sfqbzy4t7eg7mc622ddj4j6j 4v3bvykjtk4a9igtwqg6crngi 3rkg9fm3p9d6dqazy7mp87ldv 1452o399ulgekroz155mxjv2 mbrum25jqrv4d8rt7y828fes eb1eq48ws6s6727va5e2pqe83 44ae38lft8e9uoostutfeoaf2 8s4ejc7qh6h5g3ked50y0hknc 1dg9cfgz1f32yq1r85ahp9m91 53aj9h12d6cwn9leagt1t1kfx 665smsbk4tyuj6zujjqgbk72j egeg1j2k03vccadjit81w33l3 12pqv962bpwgnj7jjtk67o6vm ex57kvw9ftonbqfg735lrunri 5r2y58tuza8i3i46bzh2yu15e beftz7pxsl419ony8m7lef34b edav9gnyyi3tx0jswknukhe25 59szyzhspjmiaeynyoztwaal5 1k5qpvvc8xuymm9lzkzjbsxf5 anoll8k3sep3lkd5dg8q9uwd eajo5gy1u4tzwza39x1bhrut9 3qi6xdgza4m04jis0k3x8eev2 fn5vuocq3xfpmc61t49dfin4 dm9lxognqpisedi76uuou1jcc 97fe2tfdk0yfd0o42a3n1dl2l cqcl05br4vhcsm2tqv9badxtf 38bltii1m9jym329g93sqpkia 80rqul6ocprxmee2skffe2b6c c0j101805d0gbtg7s4xi8advi 19o8nq2zzu94q8l4i9miet8z8 bnkkfyeykv4t63xfy0wmy352k w0cqsm5twphjxi1la60cw5ga 4bygvwxvywxgxoedggg3hgafz 5cpaic6uxicn7oixfk2ia51ad cvp32bc3vi2kcbzwlbr8addu9 6hcmzzru4wmhtuczc8fwcfa4 dzg301g3uemf4wtzmxw9ttnwt 47r8jr01fz3taldqqpgby8aud 8ayevxq67ess0di9tzli527ag djp93d2zcgbzbzju4u17nx11x 12m5o1s15owzcxz6kopmx4roy 63oar10rccelbmz4w2e1nr3mi 1pbjzi1kmqprkwckfermkjyr8 6y5alezj47cti453w93bxrzk 2fihtyo754w2peoqdn11h13v5 10w52i1h3zrkbha0zwd4yshri 9cy77ofzr97sueuwczic6a2oo 12zlagt3l5gba82hhaqgzj482 3r3xi1jzpsz78iwv9vi0kesbi be5gnh4l2td2d44hhvrfwnwvo bw50nh8ca01gmorp3vw6dajtg ehglyxuwr9dr4twprvqxsbvw4 9w1u1tksxcelv2u6eepm0ql1l dplr9bw2ysjirzzcbpylrt2m9 7cpn3zqpdsup4twonshcyw8rh ekbmzrwbkv0h1hmrgloph1fla cvedj63zzx8yd40qy4ileqjhw 8ybidwxixdnoctnzr2gjrrlbb cciemiizalj6hrb1ntbdr6yq2 crvcyh5zl51tytn6cqtn11h6f e9t41pqy4d8eerh2bhs4wazec d7z53lg5ftlqzumrobq02din 7z3raqetqxgfgs8a6vmlbjpx1 eh635578cs82427u5rwdpmwnz bkpqedgfc9hfhjjc0g5inzs8l 1tywjw1gcjianj4d984rs3uyr 7dcus27vp3wmr3uptjm42kx1s 4pbfvnxuvs56ajxjsr73kxp35 a73nee2zxjmznwt42ercozmeq 94ogie2v6po71yn5azxituin6 ec9vi249qtbuizr153j7sn67h ao7sw7ip4ain6yb7x2otyebi6 c07sskia6brjpg924rfsxl6ja 999x3ecp64ee4z0ehslpoxb2r 34nik9ouvlyhgmihc75jfwz54 alr6s9yl0lwnv7j7o8vy1zbjk 91yo99o3r45epnonea1go66ee bpbyrnr37g0wlprifnixl7x84 7nnprg99lwj155ya4jyax4b27 80nptpf2vua2dj32pmbcq9u4 es8cjagwamdkm1utfzpgr3e5h aa96lnuum088x2zmzi9x95nqh ey485dm2zdpk81axgbitd55vn 4r5aahlxa4ghqhuvkeyyxdsl1 1hnnrjgcxfhwpi4168wb7qc4o 1rm5mieelpumnk9yx3q60j926 7vmz76tiyeh9hkel6dk394vdu 88rfrc1ibnjdknovttezgchm3 c1dhzw40lf0119dwmkl91zo3r ahdnk89nglgxurl5ja6u89xyo 4t8jkmhoet983zh4zfnazicmp 2ssul0lo64uj6rz50ajxg1fmh 40labewa808b4krderzspnrcx 42i78x99sjbrn2nxmrjd6dmul 45m3czoaaz46ldjw9m9n1ywv1 982vq5jzrod3oj3p3fg7d9kmp 4d59taxdtf3ik**uqtjvg0b1 7ch57im09h0ug5nduundd6wwx cn6bqsy4jz5iuxho7rgwpclov eiw0nxverf7wsznyc01dm2rwy 12vy5yok1k7bvhlbeoreqlzxj 2gky2gi8f25h5epythbyi92q0 c0vwwzu8d27r8eca2siqymcca 2a20z477jwwu5pw6zpp8yvxgi 36eo6436fktyn6unem4ar2l0b 925qbaw90v64tikbu5tl6o1be er7hrx64eaqgz13r5cjoh5kde c2677hyvjxcbmd9jf101fl386 3hlzb4b0k7kvemxpfpwao29dw 7vur6n2mz8ynzg3xk85rde1kg 8xm7sd2puv8pt7w0gzjm6883n aa3n7br1qbl78xgkl887oy80 1duucdri7oip1t29txwzgdssn eqpvgd501vxkf25bp0gyb4x5h 16suyms7ws89r3y2uqnv76vkj a83v66klg2c8fokpia99gg4ig 61vgll9osdqja0z5qhx1rlkse 1dh5m850luq788nv5lvjvui7w bch9hm9zx6n1lu5i6r2o5omba bl5jffhr7ytok9sn8f9gt2voh 8frhkt5vv3tuncmbjgfckx5zu 17ekeuw002hbeorl4e61uagza 8b34h8l88xuafnz05fh1bq79x d1e3z4eo9k1nzlkcd9edmhh9l 7bgbwtq0vujmyq29o6k5i8o4g 4glyhu0ffetmwa62nj4h1d9x9 31956p2mowvubzw3cvyhqjzi0 a32e0nahgqulrricarotsigra c5rnlzbn9vatd7ak3rx2lg72y 4q3s3q5i6p6ya0ckp3slubxgc dvzfeprnqug1zq6e2wol4xsy0 a58a6q7hm8jragcyl0c092zal c44f1khvcq5lp0tztg4wm7ea2 c3t4lmiimpd60l6hpp3jgdkqg cgwyazq7yvlqkssscs6awlv3u 8zruj1y8o4a2vlygap13gk4et 8iwhqnzczjbsq0c0999j1s8wh 5vigkqigbipffd6418gnt80gd ahotsny4ykdhmv3rhilqb8k6h dioxi6rk8ozmeyc7wryvteszv 7x0qbej4xjb580perumj9nlcj 9lxibxvvcx34gzwxyosnmhj5n 4bi5dxwiwctv5xjxqok1n3x09 9uhjjolej9fqiph12xyp5e00p c4j0wz3ixdo313r2ffco8srbe 1h987lxm1r1w6pr3yc0gsz3ip ds3t2t5kz2lc82zephf41c3b3 bibzbsnryc59rf0q3vdydj63x egjs0obnv1h8gee26fanvxw8b f1yo9d482l4a85m9kupm3emht 3pnj2xxqbdbf10sbll03x6wve afvamwfwmscoobt6gf0ovz5jm f14s9nq7lay90c8z959dcnty 1s5i3wg3i7n043qkzwer1by3a 4c8ejvcc1wqbikri8oeuaqysb co338b66qjivrptbepsz0c08m 7mldkuzr8vkrl3rk43441zg16 3sd02hjrcwjxl2xusydbx5vc1 31i47lnyaeu6wgypheqo3pwzd 5kishche3dwgrh4boutnz3d8s 2gv1tf4y0c16gdwmjwvfnpmew 49velndurayyspfuoy6cncrlq 30vhhi5fu8avf455qg95ezsok aaxdqive0unbnwoiy11fmhx6o 4t91ht0y5bmwyynmz5qhipnx 56u7bgbla0x32w0nfu7t4jv8z 9shhi9d4dgqkkrsjwqkladlqw duo7swzxu60vhnydjuie6vtbb 7akgfn8xkan3lcwayz8o141wo 3ug2pfdwicn905rwnnj0opepl 17i5xv2w7625d2p9r1ephlzgl 3cf1ruslqa7lt7mblpt5t2by0 1uaxuof6tujsnakrrqhv4gc6k 72hs3972da0cigcidfedbxdnw a9w2nuiloof59muuiacuvhe4b 6vk28kwma0b4d4edz41zqnksz 8i4b3v4k3vm67rj1u31iwicq8 eyp9m2ukg3541i69ktczg8bxi 1s29npl30faal3sx1g1rud9xo byts3bi0ashd40f8qihug2mfr efw4zpje3s65h7l7k0yv4rdii eo4t4aa9efe9p3g3dwkk12e0i 4mzqifwbdcaai3w1obcip27c1 ebnkecqgr9j7j4ktpq49961wf 3unjqfrfv5br6lqkw60xkukfa 5hfgkqb5eyzearg5h9fl3lqcb 4h0o6ta6en78osxcfp4r8qwma e0etx1b4q486gl485v0atb1uh adh01zyf08ia4tmpgiumi5fm5 1yjrzu3d0xxdnpinlob9rbc1l 66d1u2rl8pss6g4k1l8sb61m3 54t9snxzrysvphxa8fsfkh78a 8vjucis05k9j9knglgkdplfst 2236dyoequfn3klqkw7iu7xn9 8vsa0ta2airv7gtpfuhcrsb1 bjnrgmbc9xpp7r8oqe0rl863n 4xgvrca0zceeal2i91lwcyy96 oqydeeo1wx9w0h1mbvx1day1 7xy91bu21nxz172qrhgrn01rr 6tmle7x2o66obc75fl7y3awct 1caks9vr22btb470t20qyrjb3 7uh5jedeyblqamlnaxjqcnxzn a8lb4fztr1g52zl8xg2hj2alz c3xbtuh1rhbso3dx51h0lm2n 9ifk5bvct2trktyeo88coqbv 4ok5pixbffdyj9f900li5d07m 961terh0e8ipyueleniuslto3 7mdz77yx3tir86nc8xbnviy1u cmtdswut3bk6cn8sz2vkkb1ai bcgpn8cbycf9tkqhkv6y9yn0v 3ab5ni18y5bd8zdr72foiuvn5 2d9mp9jrbc93ttd7aph8ra32h 8lrslvsiygpssre08hz31uoid 6lwjv7ky8ht08374oe8es94ku bn1q83iz9tgduh1pslr82ojjc ab8pwz8w3ndlbkcg5q1tvypw4 c51rkuy2735o10m27515sash9 3c9vmqgn2uvnmatiqem4sbp22 d5uoykfcqfrjabmxp5oe3nujk 4xdbhrbixxpm8rsyilo49alga 4wmj46odsqrsbga1lzpghee8k 6zc9fcazrm3cu72z8z7trxxqn 1gu1ad88k4ali8td7qh5u8uuz azjeu2t9i6unuoeqcvx1v2li9 9axe8rv1ggjgzk3f3bmx07c88 bhkyyjwc33bvqautu41c7tplr ucmf8gpr1xkyqsdmbvdv9ulu 3rsgvmniutsly1fmuh5wo8nmu bkl8lpx711o8h0px4y13edb9h 4swvzmfrldcodersgy5j3e2xv c27aho4r9qdy9ecmnb4ja3nxz dnnnkw4svn1iele4nq1titmd9 42rjmab18tq5he1e2mvlc3mr5 d5fl67b04rsuxssl0awsb10q8 czeydcwmewr6xf4q8xmmjjdl5 dgyrmwqdcrds55feg62fjz96e gxfmtcdszg787b3y3t8xqqj3 327fg7wudceo7nkign6fbhfsy 5zwbw64swzits0z3xz0duk8y8 1ri8t74f797nzy75dmd4jl06s 80kmm7xia0y1frx6qfufvqw3w uv3m4nje8gyero8iidhghy33 2fdn60h8qq4n6dfm79ffji1wt 4cm1jpzqk4ydgsg5xodypdkfj ejpsd6davj2di1irvvtgrwyej 13w4o8046ev5i794zkpjwmv0u 3etqvhaxkthhhov4tdpkdg34j ecdv9lg5fq74a6ppkk1kgw05m u3i3pmahrv9a5eble2g7m6ku 9crmllkoomdjqne9u1umfe1e2 cpcocbpuect7t4i5tyt3swrfx 640el5d6u4mzk7zi2et0etmtv dc0dc7gqz5rxfqwlrhkx1uz9j 77re3oqv9jygowbe51nzr2ime 296zgefacz2ctae4ggy6im5ge vkjjfty7q71knjvd108ifbf0 6otvuxc2gkaj2z7abjq3eg6wp 9wwj7acfleqb08r5tp3g0z4k baac45w53i6fyu8jdoccop7k5 5fcprf3apbvv29i5w9ah0xdna 3qzkj3pwgp5fagb379t6p1rc2 chpbhihfkaposwpvwh4o44nqi 7sfwmcev6utmom3pkjagnb30s 4zigt23edivik37xq06ztpgph 541q14oly9b9s97a33vthz274 3svhdavtlma9xz0ag5flzeq64 d8sc6bo0mf9jcya9gl9qggz79 asg6yxxk7ozlqza7s04vfo456 av5xy88kwrdo3orvnybzhdiq9 a5zxptqj5qhcu32rtb16meem0 ehot8e1k7uaa0ybv5zhyzi8uo 7mdit3dkxb3xmr015dph7ubk8 30chg9fjlzmeiyb3rhfhd0rct 5q0y0c4y2eh6an51ys4k8vf2d 1vviccpxltp0iy7xjm2dmyo81 17ad429ogoqgplrwitqp5n0uo 3bxct227tyoapn7zg6dhygke3 12zchcgtj6hwupe8ug5odg207 e674df6mytv50vp0y1ty54hb6 b4rntonleum4jcen5vbuhob5b 4shtodz2g4oy5jv0l3113erpo djpuiawhg5erjm5wdzm7144nq 8fek5rtcmw9f8cijsuwi8c8lx 2hgmz0naaxx49yvc9sdqftqqj 4zk2lkfylyg95m1vgdhqhv1xf bs1ix4ifg54flbx2ep20kg9bt 27omr37rjs2wmd528spluep2i 44jow559auwkw7f31ymiia9z0 cgmokrwre2dp7567gde3hmz0b 4wpr027bvo6rmlcw99t5xifmv 72n988hdv3avwq5p1w4sploya 3b1l9nm8p11cliry9atxpslaq 4wbqp5n1dxd400lzwj5027fqb a8f8l5b0fdqzea86b5pejk4r4 7xmsgdptim5rzv659uo3u1soy 1ut35s8n3gch3s2u8n92po9xa 62gau6g56l4tk0z9kvradrj3d ckrtaslxjos9na3mwq7m46twb 1c9u1caw1ujchllkveq2oggm0 2i9horgp2hw9ywqm3xr8p4xlw 1hqq0pponbhkr1ced6wiiwstx 957k81updxije0zdm2m4p79rb dvdhbiusuhl7g5i5zfshv7v1f 26b8sr3ufn0n91dpixvql9prd 9ungr2hzx1hjoyykja1m9bkq2 3z5bk43oyn1pi02txxc76d7vh 6int508q42sz8l0elb74ocmlc 83a1m7kz3v8uw2m4j2gy3xwkl 6tqpkrnweda0m1kq0yn3n2wbj a4a83l411ffw3bt1hfnrurzup aufetm82g2el984pdrwq4vvlc 2gpfzy3ava40rvvdvd6cg1q8c e6ccyrsu5j1sa70qgo00fvl8x 1cu8cik5q22uhjii9zt6qvfqh 5g5pnn1r2t4ck3oz5p23ialyd e0xby9sknm28cb4p9dqcgk98h 2h90h8yn2s3k5aifm4quu69x3 71v6zldr2is8qyv8jvg0kynj8 8d6vtz9i9xw8jjlv02u0ueys0 7tsjqcbxu209qqg3bsz5loy4n 36dk4h8xp5uj6yw7hz6uxrm1o exnfs8e6y2jj5xa8w980wlvlc 2keyfnsso3g5v14lm12x0elec dbvfu3ud577r4jfwlj320wwb0 95ogfluh1izz0hqdtn24pjfq0 cqgyaydiunyr20ycd0bekkj5o 6xe7m8w8qsht5llhvmhzioydp 6b46ghava2q4oxbjwwxapi1xt 7dnbcgig61md966vsxwkr7zs6 dgci7uiae3gyv4qeiem0ary87 dwu36p3sx66uv9goc6a5z6fix 2dc7r4yqjpxr3w51jm25uu0xi 5y6er5gz31jia4wl6x12dz0q9 2x067vvk9n4xsayk4p849fn1w 6jiln85xesx3nmufzvnbc92yx 4hz7ontepmqvkrkrfllekt3ix otx7omf73czm2q8w4idmrygq 5a1fbz5axqo98yxuifnef240t 3pslpvafjxr0hf02r9xg3nskl 5xxkq6bjqk385gs2e8vmf0z61 9smokkesa5jpysb7u8jbgw3rq cmo8i802p8fa6162x38txdxlr 33pzs6gfsth9p5kma5x7dvo2a e4vxudaxxq499ngi7e0ue80a0 4ocrx9k7r4fmmhgu9b9snb7ax
2020年05月14日
2,604 阅读
2 评论
0 点赞
2019-05-06
laravel-admin 与 laravel-nova 使用感受
前言 两种后台管理扩展我都使用过,两个扩展既有很多相似点,却又有很多不同。接触过laravel nova之后,再接触laravel admin有种莫名的熟悉感,发现在开发中有很多类似的设计思路。 接触laravel admin时间只有一个来月,时间还不长,随便写写吧。有不足之处还请多多指教。 感受 其实laravel nova就是laravel admin的进化版,显然laravel admin是开源扩展,而laravel nova是付费使用的(99刀一个授权可不便宜),在这不考量两者使用授权方面。 laravel admin是一个中国开发者,做出这样的扩展确实非常了不起。扩展设计合理,但是优化上没有laravel nova那么好。 其实最开始接触laravel nova之前是考虑过laravel admin的,由于laravel admin已经封装好了权限管理,自己替换处理又相对麻烦(其实就是懒),才放弃的。laravel admin的权限管理没有做缓存处理,每次使用都要从数据库查询,其实完全可以缓存起来减轻数据库压力。相对于laravel nova这个功能已经交给开发者实现(我还写过一篇关于 laravel nova 权限管理 的文章)。类似于这样需要缓存的还有菜单功能,因为网站上线后这些几乎不变的的数据却又频繁读取,缓存能解决不少数据库压力(有时间自己处理下)。 laravel admin模板还是使用HTML(对于我这种前端弱的一逼的程序员来说真是非常友好),而laravel nova使用vue.js,相对来说vue.js体验感更好,但是技术要求也相对较高。折腾vue.js多多少少还是要翻几次文档。在扩展字段的时候前端模板就相当重要了(反正我写的CSS无法直视)。 laravel admin更加符合国人操作习惯,我使用admin LTE开发过几个后台,基本上不需要教如何使用,大多数功能、按钮一目了然。而laravel nova很多功能、按钮藏的比较深,很多同事反映过找不到地方... 在代码层面,laravel admin我总感觉没有laravel nova那么简洁、灵活。列表页,详情页,编辑页总共需要些三个不同的模板,我是用laravel localization本地化功能,所以需要将三个模板全部修改翻译,而laravel nova只需要编写一次模板,不需要在某个页面显示的字段可以单独关闭: //laravel admin 列表页、详情页、表单,其实还需要三个控制器动作分别输出不同的模板 /** * Make a grid builder. * * @return Grid */ protected function grid() { $grid = new Grid(new ProductSpecification); $this->gridViewPermission($grid); $grid->id('Id')->sortable(); $grid->name(trans('product/specification.name'))->sortable(); $grid->created_at(trans('admin.created_at'))->sortable(); $grid->updated_at(trans('admin.updated_at'))->sortable(); return $grid; } /** * Make a show builder. * * @param mixed $id * @return Show */ protected function detail($id) { $show = new Show(ProductSpecification::findOrFail($id)); $this->showViewPermission($show); $show->id('Id'); $show->name(trans('product/specification.name')); $show->attributes(trans('product/specification_attribute.index'),function (Grid $attributes){ $this->gridViewPermission($attributes); $attributes->setResource(route('admin.product.specification.attribute.index')); $attributes->id()->sortable(); $attributes->name(trans('product/specification_attribute.name'))->sortable(); $attributes->created_at(trans('admin.created_at'))->sortable(); $attributes->updated_at(trans('admin.updated_at'))->sortable(); }); $show->created_at(trans('admin.created_at')); $show->updated_at(trans('admin.updated_at')); return $show; } /** * Make a form builder. * * @return Form */ protected function form() { $form = new Form(new ProductSpecification); $this->formViewPermission($form); $form->text('name', trans('product/specification.name')) ->rules('unique:product_specifications') ->required(); $form->hasMany('attributes', trans('product/specification_attribute.index'), function (Form\NestedForm $form){ $form->text('name',trans('product/specification_attribute.name'))->required(); }); $form->saved(function (Form $form){ $form->model()->forgetCache(); }); return $form; } ... //laravel nova 表单、列表、详情 public function fields(Request $request) { $guardOptions = collect(config('auth.guards'))->mapWithKeys(function ($value, $key) { return [$key => __('nova-permission-tool::roles.guard_names.'.$key)]; }); $userResource = Nova::resourceForModel(getModelForGuard($this->guard_name)); return [ ID::make()->sortable(), Text::make(__('nova-permission-tool::roles.name'), 'name') ->rules(['required', 'string', 'max:255']) ->creationRules('unique:'.config('permission.table_names.roles')) ->updateRules('unique:'.config('permission.table_names.roles').',name,{{resourceId}}'), Text::make(__('nova-permission-tool::roles.guard_name'), function () { return __('nova-permission-tool::roles.guard_names.'.$this->guard_name); }), Select::make(__('nova-permission-tool::roles.guard_name'), 'guard_name') ->options($guardOptions->toArray()) ->rules(['required', Rule::in(array_keys($guardOptions->toArray()))]) ->onlyOnForms(), DateTime::make(__('nova-permission-tool::roles.created_at'), 'created_at')->exceptOnForms(), DateTime::make(__('nova-permission-tool::roles.updated_at'), 'updated_at')->exceptOnForms(), BelongsToMany::make(__('nova-permission-tool::resources.Permissions'), 'permissions', Permission::class)->searchable(), MorphToMany::make($userResource::label(), 'users', $userResource)->searchable(), ]; } 通过以上代码对比可以看出两个扩展在代码简洁性上有蛮大区别的。一个个字段写入翻译蛮麻烦的。在关系字段处理上需要关联表的控制器,然后增删改查又是一套... 当然这样也是有好处的,高度自定义,只不过一个后台管理用处不多,大多数可以自定义字段扩展出来。 laravel admin几乎把所有字段所需的 javaScript放在后端输出,其实这样对前端不友好,现在都前后端开始分离了,前端代码放在PHP中嵌套写蛮乱的,后期维护也相对困难。 结语 laravel nova和laravel admin都是非常好的扩展,只是国内大多数只知道拿人家的用,却很少去贡献,生态不如国外。两个扩展都朝着相同的目标,节省后台开发时间,但是一个收费,一个开源,而且laravel nova还是laravel作者团队开发的(框架加持)。扩展都是好扩展,要按项目需求和自己的熟练程度来选择使用哪种扩展开发后台,有能力两种都试试,深深体会一下。
2019年05月06日
2,969 阅读
0 评论
0 点赞
2019-01-10
广告投放,广告收入
前言 Google给我邮寄的PIN已经发出第三封了,我估计国内能妥投的概率非常低(都当废纸卖了),等月底了上传资料验证身份好了。这几天一直在研究广告,包括广告收入和广告投放。之前没接触过广告这一块,不过多操作几次还是能得到不少经验的。 广告收入 网站有些访问量了,闲着没事干想着申请了Google Adsense投入广告。其实站点访问量并不大,但是好奇想着试试网站盈利是一种怎样的体验... Google Adsense的收入对于orzlee来说只是一个尝试,其中出现了很多简写单词: CPC - Cost PerClick 每次点击费用,即点击单价。 CPM - Cost Per Mile 千次展示费用,广告展示一千次需要支付的费用。 eCPM - Effective Cost Per Mille 千次展示收入。 RPM - Revenue Per Mille 千次展示收入(与eCPM同意,只是不同的广告联盟名称有所不同)。和CPM类似,RPM是针对广告展示商(比如Adsense商户)而言的。 CTR - Click-throughRate 点击率,点击次数占展示次数的百分比。 作为广告流量主来说这些最基本的还是要了解。Google Adsense目前自动广告虽然已经非常聪明了,但是还达不到完美,如果懒得折腾确实非常方便。很多样式并不是特别友好,甚至有些体验很糟糕。 orzlee就在一个以手机流量为主的站点使用过自动广告,经常展示广告会把整个网站向下顶,广告显示在网站顶部。说实话我都不想用了,其实是网站前端代码一塌糊涂,Google也无能为力。自动广告主要还是要靠前端布局规范(说实话我真的不喜欢折腾HTML,特别是css,这些才是真正的无聊),那样自动广告就会非常融洽,怎么也不会那么突兀。 最近也试了一下Google Adsense广告单元,只是可以稍微自定样式,这样出来的广告就比较完美了。而且Google Adsense的广告很聪明,移动端会自适应布局,不会乱七八糟。 Google Adsense几乎是所有广告联盟中收益最高的了,但是也非常严格。orzlee也试过其他的广告商,如popcash、exoclick这些,说真的一天收入不如Google Adsense几次点击。貌似他们只算展示量,点击次数用来计算CTR,而CTR会提高你的eCPM。也就是说点击率高,你的千次展示收入就会越高,纯靠展示量获得收入,如果展示量很高但是点击率低,那你网站流量对该广告没有起到什么作用。归根结底就是展示广告目的就是引导用户广告发布商的网站(貌似现在没什么注册、安装的广告收入了,不过这类广告确实恶心),网站流量大,广告没人点,自然没什么收入。就连Google AdsenseRPM也是如此,一直在不停的波动,只不过Google Adsense计算点击收益,这个收益真的非常可观,我见过一次点击1.x美金,真是豪。 还忽略了一点,是我最喜欢也是最讨厌的,那就是AdBlock。这估计是所有站长的克星,现在用AdBlock的人真的非常多,这减少站长一笔收入,很烦。这东西真的没什么好的办法,Pornhub 使用WebSocket绕过广告屏蔽插件确实很犀利,但是对于一般的站长都是依赖广告联盟,想绕过广告联盟展示广告没什么资源。也有很多站长会提示自己的用户,要求对自己网站关掉AdBlock,甚至有些更加严格,网站都不让用户看。其实做站不容易,屏蔽掉哪些恶心的弹窗,入侵式广告就好了。 广告投放 广告投放只是小试牛刀,体验一下。我在popcash上投放的广告,最低0.5美金千次展示。 刚开始几乎没有怎么过滤流量,但是设置了单日最大金额,我设置的是1美金,创建一个Campaigns,一直在pending。等我过了两分钟再刷新立马1.3美金消费,我都设置单日最大限额1美金了,居然都拦不住,再去看站点流量真是猛,流量非常大,但是因为投放没有过滤,进来的流量几乎都是无效流量,短短几分钟就退回平常值了。我暂停了Campaigns,重新编辑过滤,限制非常严格,让流量更加精准有效。现在几乎一小时花0.01美金,流量不会瞬间上去了。 观察了几天流量小了很多,但是质量要高不少,最起码进来的流量停留时间要比开始长得多。毕竟不是做垃圾站,量多不如量精。首先我限制了流量语言,orzlee的站点并不是多语言站,先限制中文,国家也只选了几个中文用户较多的。还有一个就是流量来源,popcash做的不是很好,只有比较简单的来源筛选,其他的就看自己了。比如说浏览器、操作系统、设备。 其实广告投放还是谨慎点,多花点时间观测流量趋势,如果太多流量质量不好赶紧修改广告计划,不求流量大,只求流量精准。像个人站长广告投放可不能像大公司一样财大气粗,最重要的还是要自己站点质量,要留的住客户才行。 结语 什么事情都自己尝试一下,经验收获比看书看文章强多了。做网站运营广告是第一收入来源,当然不包括收费站点。终于知道站长有多恨AdBlock了,但这个是双向的,如果以前广告不那么恶心,也不至于逼得作者开发AdBlock,友好的广告也没人讨厌。中国垃圾站群真是多如牛毛,超恶心,搜索引擎一搜全是垃圾站。原创文章也越来越少了,写文章很花时间,多尊重作者吧。自己尝试了就明白他人的难处,总之多动手,学到的经验比现在赚到的钱价值高多了。现在学到的知识,以后会用金钱成倍的返还给你。
2019年01月10日
6,819 阅读
2 评论
0 点赞
2018-11-21
终于开始写博客了
1. 为什么开始写博客 很久以前就发现同行很多人开始写博客了,归根结底就是自己太懒,不喜欢动手。 其实只要勤奋什么都可以做好,想想自己学习编程语言的那份激情,深更半夜还在敲代码,如今不也给我带来了收货吗。 2. 准备以哪主题为主 其实这个还有准备,想到什么就写什么吧,也没有硬性要求,这种感觉比上司安排工作限制时间轻松多了。真的渴望这种自由感。 博客也是一个知识累计的呈现,而orzlee又比较喜欢折腾各种新鲜有趣的东西,可能多数为这样的文章。 3. 说说自己吧 orzlee是一名PHPer,没有系统的学习过。接触过C,C++,JAVA。很多东西都是上网找资料(不过我学习之前就会翻墙了,google对于一名开发者真的是不可或缺的,至于百度真的不想多说什么)。在几年前还在写C#,而PHP已经崛起,接触的第一个框架就是laravel,然而过去几年了,还是用的laravel。 最近还抽风似的买了larvael nova,不过作者团队代码真的写的很好,刚出不久坑也很多,一路爬过来的。有时间可以去看看larvael nova介绍,Laracon 2018 - Taylor Otwell - Keynote(墙外),看Taylor Otwell敲代码真的很爽,sublimetext用的很溜。 结语 都说万事开头难,既然开头了,那就慢慢坚持吧(其实坚持更难)。
2018年11月21日
1,421 阅读
0 评论
0 点赞