手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表查看gouki的文章

Safari 11.1: ajax/XHR form submission fails when input[type=file] is empty

有时候真不知道苹果都在做些什么。。这次safari的更新会导致 form在使用xhr提交的时候,如果表单里有<input type="file" />但没有选择文件,这时候表单就提交失败了,本文的标题就是stackoverflow上面的人提出的问题。
大部分奇技淫巧(或者说奇巧淫技)都是说,如果判断input type=file,如果length==0,即没有选择文件,就先将它disable掉,然后new FormData后,再将它恢复。
 
原文看这里,提供了两个解决方案,一个是用jquery的,一个是不用的:https://stackoverflow.com/questions/49614091/safari-11-1-ajax-xhr-form-submission-fails-when-inputtype-file-is-empty
 
用JQuery:
JavaScript代码
  1. var $form = $('form')  
  2. var $inputs = $('input[type="file"]:not([disabled])', $form)  
  3. $inputs.each(function(_, input) {  
  4.   if (input.files.length > 0) return  
  5.   $(input).prop('disabled'true)  
  6. })  
  7. var formData = new FormData($form[0])  
  8. $inputs.prop('disabled'false)  
 
 
不用:
JavaScript代码
  1. var form = document.querySelector('form')  
  2. var inputs = form.querySelectorAll('input[type="file"]:not([disabled])')  
  3. inputs.forEach(function(input) {  
  4.   if (input.files.length > 0) return  
  5.   input.setAttribute('disabled''')  
  6. })  
  7. var formData = new FormData(form)  
  8. inputs.forEach(function(input) {  
  9.   input.removeAttribute('disabled')  
  10. })  
 
为什么safari还不更新????
更详细 更多的回复,直接看原文吧
 
 

“恼羞成怒”与“老羞成怒”的辨析

小孩在背书的时候,突然读到了老羞成怒,原以为是小朋友L和N不分,结果一看确实是老羞成怒,google了一下,原来是有下列的解析,原文来自:http://blog.sina.com.cn/s/blog_513bad040100c950.html
 
 
钱钟书的《读〈伊索寓言〉》中有句这样的话:“这只乌鸦借来的羽毛全给人家拔个干净,现了原形,老羞成怒……”有学生向我提出,这个“老羞成怒”应写成“恼羞成怒”,是不是这样呢?
 
《现代汉语成语规范词典》将“恼羞成怒”注解为“由于气恼、羞愧而发怒”,并明示不要写成“老羞成怒”。但在《新编汉语词典》中将两个词语全部并入了语汇条款中,只是“恼羞成怒”一词有注解,而“老羞成怒”一词没有注解。较为详尽的当属《汉语大词典》,它将“恼羞成怒”一词注解为“因烦恼羞愧到了极点而发怒”,将“老羞成怒”一词注解为“因恼恨羞愧而发怒”。并各自有了例句。现各举两例:
 
恼羞成怒:1、冒得官见他如此说法,不禁恼羞成怒,喝令左右:“替我赶他出去!”(《官场现形记》第三十回)
 
2、那排长恼羞成怒,拿着枪头的刺刀,向哥哥的手臂上扎了一下。(冰心《去国·斯人独惟悴》)
 
老羞成怒:1、想因却蔹一事,太激烈了,故此老羞成怒耳。(清·孔尚任《桃花扇》)
 
2、张志让律师当日为沈老先生的辩护人,不知说了多少直率的话那检察官居然老羞成怒,大发雷霆。(邹韬奋《患难余生记》第一章)
 
由此可见,两个词语应该是可以通用的。从《现代汉语大词典》(规范用法)“恼羞成怒”注解后的说明:“‘恼羞成怒’也说‘老羞成怒’”中也可说明这一点。
 
那么这两个词语有没有区别呢?
 
据《辞海》的解释:“恼”有三个义项:①恨、怒 ②忧愁、苦闷 ③病痛。“恼羞成怒”这个词语很显然用的是第一个义项。据《现代汉语词典》的解释:“老”有十七个义项,其中的第十四个义项是“很、极”。因此,较为正确的解释应当是:
 
恼羞成怒:因恼恨羞愧而导致发怒。其中““恼”跟“羞”一样是形容词,属于并列结构。
 
老羞成怒:因羞愧到了极点而发怒。其中“老”属于副词,来修饰“羞”,意思是“极端羞愧”、“很羞愧”。

Yii2自定义组件在phpstorm中识别

 有时候你会在Yii2中自定义一些组件,比如:Yii::$app->sms / Yii::$app->chat / Yii::$app->queue(你看,这个虽然是系统自带的,但不代表就能被认得出)

那怎么办?IDE无法认出的时候,难道我们一个个的写:

PHP代码
  1. <?php  
  2. /** @var IM $im */  
  3. $im = Yii::$app->im;  

如果是这样,那也太累了。翻了一下google,找到这一篇教程:https://github.com/samdark/yii2-cookbook/blob/master/book/ide-autocompletion.md,意思就是说,你自己建一个Yii的文件,创建一些类,然后把刚才的Yii::$app->sms之类的,注释成类的property,然后IDE就能识别了。

最后找到一个项目:https://github.com/iiifx-production/yii2-autocomplete-helper,看样子好象一位俄罗斯大佬写的,嗯,它自动根据你的config来生成一个类似的_ide_components.php,并建议你在IDE里将Yii.php设置为:Mark As Text,这样IDE就不会主动去读Yii.php并识别了。

于是我composer引用了并执行了一下。然后在.gitignore里忽略了_ide_components.php,感觉世界一下子清静多了。

简单用法:

PHP代码
  1. 'bootstrap' => ['log''autocomplete'],  
  2. 'components' => [  
  3.     'autocomplete' => [  
  4.         'class' => 'iiifx\Yii2\Autocomplete\Component',  
  5.         'config' => [  
  6.             '@app/config/console.php', # <-- config list  
  7.             '@app/config/web.php',  
  8.         ],  
  9.     ],  
  10.     # ...  
  11. ]  

 

 

 

正式启用https

 其实早就该启用了,之前在折腾小菜谱的https的时候发现非常麻烦。现在acme.sh进化了,一步走就完成了

 
1、acme.sh --issue -d domain.com --nginx 他会自己找配置
2、将生成好的key,copy到指位位置,为了方便,一般都扔到/etc/nginx/ssl目录下
3、修改nginx配置,在指定的hosts下面添加下列内容:
XML/HTML代码
  1. listen 443 ssl;  
  2. ssl on;  
  3. ssl_certificate /etc/nginx/ssl/neatstudio.com.cer;  
  4. ssl_certificate_key /etc/nginx/ssl/neatstudio.com.key;  
  5.   
  6. ssl_session_cache shared:SSL:20m;  
  7. ssl_session_timeout 10m;  
  8.   
  9. ssl_prefer_server_ciphers       on;  
  10. ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;  
  11. ssl_ciphers                     ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;  
  12.   
  13. add_header Strict-Transport-Security "max-age=31536000";  
因为我是用neatstudio.com来创建的,所以生成的文件也就是neatstudio.com.cer和neatstudio.com.key了
 
如果你webserver上东西多,你干脆server nginx force-reload。官方说用reload可能不生效。如果你东西少,你就直接restart算了。
打开https://neatstudio.com ,就OK了。
然后再配置一条。如果是http,就跳到https,(当然 我还没有做这个,因为我还有不少资源用了http的)

Tags: acme.sh, https

mac 安装supervisor

 supervisor是一个python写的守护进程程序,如果你不想用xxx.sh & 或者用nohup xxx.sh > xxx & 这样的方式来运行程序,那么用supervisor是最简单的。

在macosx下,安装supervisor实在太简单了(网上的教程都是用pip来安装),对于mac来说,直接brew install supervisor就OK了。

然而装完后,你ps aux|grep supervisor,会发现其实进程不存在。而你用brew services start supervisor,却又提示你服务在运行。我靠这是多么大的一个坑?

其实还算比较简单,直接打开vim ~/Library/LaunchAgents/homebrew.mxcl.supervisor.plist,看看里面的执行文件路径,运行一下就知道了。

果然 就直接报错了!

XML/HTML代码
  1. /usr/local/opt/supervisor/bin/supervisord -n -c /usr/local/etc/supervisord.ini  
  2. Error: section [inet_http_server] has no port value  
  3. For help, use /usr/local/opt/supervisor/bin/supervisord -h  

咦。居然报[inet_http_server] has no port value?怪不得刚才用supervisorctl 的时候报:http://localhost:9001访问被拒绝。于是,修改/usr/local/etc/supervisord.ini,把那个注释掉的9001端口打开,再运行就OK了

cat一下supervisord.ini,会发现最后一行是include /usr/local/etc/supervisor.d/*.ini。这个时候就要注意了。

在其他平台都是加载的.conf,mac上是.ini,所以其他平台的不能直接复制过来就用!当然,这个目录本身也不存在:/usr/local/etc/supervisor.d/,要先mkdir一下。

好了,其他的就不说了。笔记一下,浪费我半小时时间