OrzLee - 随便写写
type: channel
link: https://www.orzlee.com/category/Just-write-something
description: 随便写点，比较杂。
items: 解决LG显示器无法通过DDC/CL切换输入源
items: JAVA RMI GDC每小时触发Full GC
items: 探索ChatGPT、NewBing和Google Bard：我与大型语言模型的初体验
items: telegram-終點站emby自动签到
items: 阿里云活动-答题送T恤
items: GTA5限免了-7天内领取
items: jetbrains 学生包 500个
items: laravel-admin 与 laravel-nova 使用感受
items: 广告投放，广告收入
items: 终于开始写博客了

解决LG显示器无法通过DDC/CL切换输入源
type: item
date: 2025-03-01T22:30:00+08:00
description: 前言 LG虽然是大厂，但是显示器DDC/CL却无法设置输入源。声音亮度等设置却没有问题，这是我目前最想要的功能。我有两个系统，共用两个显示器，不想买二进二出KVM切换器。国内这些KVM也就是个能用的程度。高刷和EDID几乎没有，就算有也不是所有接口都支持。 所以我有个想法，让系统来通过显示器DDC/CI控制切换，我再买个USB二进二出切换器，共用键盘和鼠标。写个程序监听USB设备，插入就通过电脑执行DDC/CI切换显示器输入源。 这样比KVM二进二出切换器多了很多优点： 少了连根视频线 显示器和主机直连兼容性更好 USB切换器便宜 支持高刷等显示器特性（EDID的话我目前切换没有乱桌面布局，我不确定） 我的两台显示器，一台是AOC，好多年了，DDC/CI没有任何问题。还有台LG 27GP95RP，这两年入的，DDC/CL能控制大部分功能，唯独输入源控制不了。国内LG DDC/CI相关讨论都很少，国外还是有讨论关于LG显示器DDC/CI的问题。 开搞 DDC/CI不支持，国外有大佬通过GPU来控制显示器切换。我不太懂，你可以看看这篇文章。虽然里面只列出少部分LG显示器型号，但是自己试试说不定也支持，27GP95RP上面就没有列出，但是确实可行。 先上输入源代码，其实很好区分，你先确定你的LG显示器有什么接口，例如两个HDMI和一个DP，HDMI就是0x90开始递增，DP接口就是0xD0递增，至于type-c就要自己找找了，应该是通过0xD0来递增，我这台显示器没有。 Input Source Value MONITOR_AUTO 0x0 MONITOR_DP1 0xD0 MONITOR_DP2 0xD1 MONITOR_DP3 0xD2 MONITOR_USB_C 0xD2 MONITOR_HDMI1 0x90 MONITOR_HDMI2 0x91 英伟达显卡可以通过NVapi-write-value-to-monitor项目来执行输入源切换。 你只需要修改两个参数，第一个参数0来选择显示器的序号，第二个参数是显示器的输入源（这里是切换到HDMI1，你要修改成自己想切换的输入源，看上面代码）。后面的0xF4 0x50不能动。我的是AMD显卡，具体显示器序号和他功能可以去项目里看作者的说明。 writeValueToDisplay.exe 0 0x90 0xF4 0x50 ADM显示可以通过amdddc-windows项目来执行输入源切换。可以执行文件在issue中找到，作者上传的txt文件，下载下来修改后缀exe即可。 先通过detect命令来查看显示器位置： amdddc-windows.exe detect 我这里适配器索引5，LG显示器是0，要切换的端口DP1 0xD0。你只用修改最后三个参数。下面通过命令来切换输入源到DP1接口： amdddc-windows.exe --i2c-source-addr 0x50 setvcp 5 0 0xD0 intel可以看看这个issue MAC OS mac os可以使用BetterDisplay或者m1ddc来控制，同一个作者。m1ddc我在M4 pro上使用过了没用，不管是不是LG显示器都无法切换，没有做过多研究。 BetterDisplay没有问题，但是发现了一个坑。如果使用扩展坞带的视频接口，那么大概率是残血DDC/CI，或者干脆不支持的。网上资料说是由于usb占用了两个引脚，导致功能残缺。我这边是发现不能切换，但可以调亮度和声音，这还是另一台支持DDC/CI切换输入源的显示上测试的。所以要转视频接口建议买质量好的type-C直接转HDMP或者DP，不要附带其他扩展接口。LG用HDMI直连所有功能都正常。 BetterDisplayLG显示器输入源：DisplayPort 1: 208, DisplayPort 2: 209, HDMI 1: 144, HDMI 2: 145, USB-C / DP 3: 210。CLI文档可以看文档。 显示器设备名称 UUID等信息去APP中可以看到，命令行的话看文档找找。 除了namelike，还有name uuid都可以指定显示器，ddcAlt就是输入源端口代码了。非LG显示器切换去掉两个参数Alt字母就好了--ddc=15 --vcp=inputSelect。 /Applications/BetterDisplay.app/Contents/MacOS/BetterDisplay set --namelike=ABC --ddcAlt=208 --vcp=inputSelectAlt 如果安装了betterdisplaycli可以简化命令，但是BetterDisplay不仅要装，还要启动，否则不行： betterdisplaycl…

JAVA RMI GDC每小时触发Full GC
type: item
date: 2024-05-06T21:16:00+08:00
description: 前言 最近倒腾Java，发现JVM并行收集器在还有大量堆内存的时候就开始触发老年代的回收，通过GC日志发现每小时都会执行GC和Full GC回收，回收是通过System.gc()调用。 那每小时都调用一次Full GC，我添加启动参数-Xms11g -Xmx11g分配11G堆内存只是为了好看吗？每次Full GC耗时在600ms，并行收集器老年代内存使用还不足5%，真是发神经了！ 过程就不做记录了，无聊又蛋疼。以下是在使用了RMI或者其他NIO对象的情况。 RMI DGC每小时触发一次Full GC 原因：DGC代码中调用System.gc()导致并行收集器触发Full GC。 解决办法： 修改DGC调用System.gc()执行时间，默认一小时，单位ms。启动参数添加： -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 禁止程序中的System.gc()，添加启动参数： -XX:+DisableExplicitGC 使用支持并发的收集器（CMS、G1、ZGC或Shenandoah），并且添加启动参数： -XX:+ExplicitGCInvokesConcurrent 方法1，治标不治本，延长时间触发Full GC会导致STW时间更长，可以配合并行收集器使用-XX:+ExplicitGCInvokesConcurrent来控制频率。 方法3，启用-XX:+ExplicitGCInvokesConcurrent参数可以尝试在垃圾收集时使用并发收集来减少STW时间，从而提高应用程序的响应性。 不建议使用-XX:+DisableExplicitGC来限制System.gc()。 因为从Java 7开始，Java提供了基于NIO的RMI实现，称为NIO-based RMI。这种实现利用了NIO的非阻塞I/O模型，能够更高效地处理大量的并发连接，减少了线程资源的消耗，并提高了性能和可伸缩性。通过使用NIO，NIO-based RMI能够更好地适应高并发和大规模的网络通信场景。 DirectByteBuffer是一种在堆外内存中分配的ByteBuffer，它与NIO密切相关，因为它可以直接映射到操作系统的内存中，从而避免了在Java堆和本地内存之间进行复制。在NIO编程中，使用DirectByteBuffer可以提高I/O操作的性能和效率，特别是在处理大量数据时。在基于NIO的RMI实现中，使用NioServerSocketChannel和NioEventLoopGroup通常涉及到DirectByteBuffer的使用。 虽然 DirectByteBuffer 对象本身是由 JVM 管理的，它们存储在 Java 堆内存中，但是 DirectByteBuffer 对象所持有的实际数据存储在堆外内存中。 JVM 通过 DirectByteBuffer 对象来管理对堆外内存的访问和操作。当 DirectByteBuffer 对象被垃圾回收时，它所持有的堆外内存也会随之被释放。 因此，触发 Full GC 通常是为了回收已经失去引用的 DirectByteBuffer 对象，进而释放掉它们所占用的堆外内存。 Full GC 在回收过程中会扫描整个堆内存，包括其中的对象和引用。当发现 DirectByteBuffer 对象已经没有引用指向时，JVM 就会将其标记为可回收， 待下次 Full GC 执行时进行回收。这样，间接地通过 Full GC 回收了 DirectByteBuffer 对象，也就释放了相应的堆外内存。 如果禁用了System.gc()，那么不会及时的清理 DirectByteBuffer 或者其他 NIO 对象导致堆外内存也不会释放。虽然最后也可能因为JVM堆内内存不足触发Full GC 来释放，但没必要冒险。参阅 监控程序调用System.gc()堆栈 可以使用 async-profiler 跟踪System.gc调用者： 预先开始分析： profiler.sh start -e java.lang.System.gc <pid> 发生一种或多种System.gc情况后，停止分析并打印堆栈跟踪： --- Execution profile --- Total samples : 6 Frame buffer usage : 0.0007% --- 4 calls (66.67%), 4 samples [ 0] java.lang.System.gc [ 1] java.nio.Bits.reserveMemory [ 2] java.nio.DirectByteBuffer.<init> [ 3] java.nio.…

探索ChatGPT、NewBing和Google Bard：我与大型语言模型的初体验
type: item
date: 2023-04-04T23:20:00+08:00
description: 前言 最近ChatGPT很火爆，不过我还是近几天才知道，平时也没怎么看新闻，有点孤陋寡闻了！既然都发布了那我也来试试看人工智能到底有多智能！这不，一口气体验三款AI，chatGP、Bing AI，还有Google Bard。 一个ChatGPT出来，后面就会有千千万万个ChatGPT如脱缰野马般涌现，那么那些跟趋势蹭流量的ChatGPT到底是人工智能还是"人工智障"？ 注册ChatGPT 刚接触到ChatGPT那就不得不提注册了。虽然注册也没什么难点，但是还是有限制，例如你的IP、手机号码等。当然伟大的国人总是能想到各种方法来解决问题。 IP问题科学上网就行了，我还是推荐多使用欧美地区节点，香港都不行，和大陆一视同仁了，唉~~~！ 注册也没什么难点，主要是短信验证，对号码有要求，国内、香港的反正是不行的，只能用其他国家。电话验证接码我使用的是sms-activate 【链接包含我的Ref,介意的话不要点击】，当然有很多选择，这个倒是无所谓。openai好像也只是用来验证你是真人，也没看见那里能设置或修改电话，目前来说应该是没有什么其他用途。 sms-activate必须要充值后才能使用，充值支持支付宝、银联卡等。 点击右上角充值： 选择支付宝即可，当然也可以用银联卡，什么方便用什么： 充值完了就可以选号码开始注册了，在右边搜索openai： 选择印度尼西亚（你可以试试其他的，但是不保证能收到验证码，没收到码一般也不会扣费），一般在openai验证手机号时等个3-5分钟，如果还没有接收到验证码，就可以X掉再换一个号码了，没收到验证码是会把扣费返还的： 他们甚至都为其出了官方教程：sms-activate注册openAI。 注册openai后就可以正常使用了，chatGPT-web版是免费的。听说是有次数限制的，这两天使用还是没有触碰到上限。 体验ChatGPT chatGPT-web版在对话中经常出现错误的情况，之前我以为是访问人数太多导致，这两天换了一个相对稳定的翻墙节点后稳定许多，否则会一直出错，需要刷新网页才能恢复，非常难受。 ChatGPT自然语言处理非常出色，精通多国语言，非常流利。最让人惊讶的是上下文关联，每次对话都会结合本轮对话上下文做出回答。 打个比方，你先问它"乔布斯是谁"，再问它"他对苹果公司有什么贡献"，这里的【他】是指我上一次问题里面的"乔布斯"。别小看了上下文关联以为很简单，其实对于提取上下文里面与本次对话有关联的关键词是非常困难的。这就类似于人类的记忆功能，你和刚会说话的小朋友对话时，他就可能经常出现"丢失上下文关联"，不理解你说的是指什么。 它甚至都能写论文、诗词、程序，在编程开发中，遇到BUG、异常它都能给出可能涉及的问题。这可比在搜索引擎里面一个个翻找答案的效率可快多了。何况中文垃圾站真是一片一片的，大大降低效率。提供给它的任何日志，让它总结分析，它都说得头头是道，有理有据。这确实在某些情况下对我有很大的帮助。 目前网上也出现了很多Chrome浏览器的ChatGPT扩展，总体来说体验还是不够好。 一些基于web获取chatGPT-web版的Cookie和Token，在chatGPT-web版中对话都经常断线要刷新网页才能继续，放到扩展中也一样断线，体验非常不好。 还有一种基于OpenAI-API，这种体验非常好，但是OpenAI-API收费。目前注册ChatGPT账号有5美金的体验金，而OpenAI-API的收费是按照字数来收取的，称之为Token，以下是价格： 关于token消耗，以下引用ChatGPT3.5回答： 在 OpenAI API 中，每个模型的 Token 数量限制是不同的，因此“1,000 tokens 约等于 750 个单词”这个说法的具体计算方式也可能因模型而异。一般来说，这种说法是根据一个平均单词长度为五个字符的假设得出的。在这种情况下，一个包含 1,000 个 Token 的输入文本大约包含 200 个单词。而根据英语写作的经验，每个单词的平均长度约为 4-6 个字符，因此约 200 个单词的文本约有 750 到 1,200 个字符，这就是通常将 1,000 个 Token 与 750 个单词联系起来的原因。但需要注意的是，这只是一个大致的估计，并不适用于所有情况。 这个token是双向计费，你提问的字数和AI回答的字数都是会消耗掉token的（包括标点符号等一系列其他符号）。虽然GPT3.5 1000Token只需要0.002美金，但是1000Token消耗非常快，特别是中文字符。如果使用上下文关联，需要用到会话ID，那本次对话所关联的会话也会再算一次token，你想想这个消耗有多大。个人使用都能感觉到肉疼，但是公开使用那就更不用说了。你看现在网上大把的免翻墙免费用Ch…

telegram-終點站emby自动签到
type: item
date: 2022-01-05T17:14:00+08:00
description: 前言 之前写过一篇文章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(an…

阿里云活动-答题送T恤
type: item
date: 2020-06-05T00:51:00+08:00
description: 前言 阿里云活动，限量 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 结语 赶紧去撸羊毛吧！！！

GTA5限免了-7天内领取
type: item
date: 2020-05-15T15:13:00+08:00
description: 前言 《侠盗猎车手5》（Grand Theft Auto V）从昨晚11:00开始免费领取了，昨晚官方站点已爆炸，直接500错误。今天缓解很多，可以正常领取了。活动截止到5月21日。 领取 领取地址 领取时最好不要用代理，如果IP领取次数太多可能会出现您的账户目前无法下载更多的免费游戏。epic对同一IP申请的游戏数量进行了限制（您单独的IP是绝对不会达到这个限制的），加速器可能会使大量用户使用同一IP，造成无法下载更多免费游戏，建议遇到这个问题的玩家尝试更改自己的IP 免费的东西总有很多人批量领取，然后你懂的。风气太差了，哎不想多说。 正在下载，游戏真的大！！！

jetbrains 学生包 500个
type: item
date: 2020-05-14T15:53:00+08:00
description: 前言 找到一部分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 13y66c3h1dxlxgj9f8u4xinu…

laravel-admin 与 laravel-nova 使用感受
type: item
date: 2019-05-06T20:27:00+08:00
description: 前言 两种后台管理扩展我都使用过，两个扩展既有很多相似点，却又有很多不同。接触过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…

广告投放，广告收入
type: item
date: 2019-01-10T17:59:00+08:00
description: 前言 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做的不是很好，只有比较简单的来源筛选，其他的就看自己了。比如说浏览器、操作系统、设备。 其实广告投放还是谨慎点，多花点时间观测流量趋势，如果太多流量质量不好赶紧修改广告计划，不求流量大，只求流量精准。像个人站长广告投放可不能像大公司一样财大气粗，最重要的还是要自己站点质量，要留的住客户才行。 结语 什么事情都…

终于开始写博客了
type: item
date: 2018-11-21T16:53:00+08:00
description: 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用的很溜。 结语 都说万事开头难，既然开头了，那就慢慢坚持吧（其实坚持更难）。