一人我编程累

一人 我编程累
累得只想把觉睡
两眼 是辛酸泪
代码咋写都不对

重启是也不行
关机它也不灵
我狂敲键盘怒砸鼠标
异常也不停

这循环它有点绕
注释也很微妙
我看了半天稀里糊涂马隔壁我草

加断点 再抵坝
堆栈瞬间就爆炸
日志输出如雨下
看到异常就害怕

调试一夜没人陪
心想这锅该归谁
回想当初心后悔
不该重构这地雷

翻日志 看半天
博客看了几百篇
闪退还是没复现
低头又点一根烟

加着班我心烦乱
烂摊子我不想干
离职损失就几万
一拍桌子把工作换

离职 我不再忙
在家 我守空房
我闲得无聊掏出电脑
代码又写几行

ios9.3.5屏蔽升级提示描述文件

此描述文件用于屏蔽ios10升级提示,用safari打开地址,然后安装描述文件,然后重启即可,我在别的网站找到的,自己下载了一份,在自己的iphone5上试用有效,据说有效期可以到2019年,安装重启完最好到设置-通用-储存空间和icloud-管理存储空间里找到本地已经下载好的更新包并删除,然后不会再提示ios10的提示,检查更新也提示你的9.3.5是最新版,如果想升级10 就把那个描述文件删除【据说是这样,没验证】即可。

地址1:
http://www.litecoder.xyz/stf/ios9noOTA.mobileconfig
地址2:
https://oldcat.me/web/NOOTA9.mobileconfig

关于webview上传图片的坑

项目中遇到了需要在webview上传图片的需求,搜索了一把,找到几个可行的方法,同时也踩了个webview的坑,总结一下

我找到的是这样的方法

***首先 重写WebChromeClient 添加openFileChooser 方法

   // For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {//最终调用的都是这个
if (mUploadMessage != null) return;//坑就在这里 看后边注释
mUploadMessage = uploadMsg;
selectImage();
}

// For Android < 3.0
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooser(uploadMsg, "");
}

// For Android > 4.1.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooser(uploadMsg, acceptType);
}



*** 然后自己实现selectImage()方法

```
private void selectImage() {//模仿IOS的弹出框
List<map <String, String>> list = new ArrayList<>();
HashMap<string , String> ch1 = new HashMap<>();
HashMap</string><string , String> ch2 = new HashMap<>();
HashMap</string><string , String> ch3 = new HashMap<>();
ch1.put("key", "从相册选择");
ch2.put("key", "拍照上传");
ch3.put("key", "取消");

<pre><code> list.add(ch1);
list.add(ch2);
list.add(ch3);
ListAdapter ad = new SimpleAdapter(this, list, R.layout.my_simple_list_item_1, new String[]{"key"}, new int[]{android.R.id.text1});
chosePicDialog = new AlertDialog.Builder(this).setAdapter(ad, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
switch (i) {
case 0:
getImageFromAlbum();

break;
case 1:
getImageFromCamera();

break;
case 2:
mUploadMessage.onReceiveValue(null);//这里是坑,如果取消了 不调用这句mUploadMessage.onReceiveValue()的话 整个webview就都没有响应了
mUploadMessage = null;//还有这里 上边已标出
break;
}

}
}).setCancelable(false).create();
chosePicDialog.getWindow().setGravity(Gravity.BOTTOM);
chosePicDialog.show();
}
</code></pre>

```

然后分别实现 从图库选择和拍照上传的方法

```
/**
* 调用相册
<em>/
protected void getImageFromAlbum() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/</em>");//相片类型
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
}

<pre><code>/**
* 调用相机
*/
protected void getImageFromCamera() {//这里采用的是获取拍照原图的方法
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
File f = FileUtil.getNewPicFilePath();
Uri u = Uri.fromFile(f);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, u);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(intent,REQUEST_CODE_CAPTURE_CAMEIA);
} else {
Toast.makeText(getApplicationContext(), "请确认已经插入SD卡", Toast.LENGTH_LONG).show();
}
}
</code></pre>

```
***FileUtil.class内容

```
public class FileUtil {
private static String LastPicFilePath = null;

<pre><code>public static File getNewPicFilePath() {
String dirStr = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/";

File dir = new File(dirStr);
if (!dir.exists()) {
dir.mkdirs();
}
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
String nowTime = format.format(new Date());
String localTempFileName = nowTime + ".jpg";
File f = new File(dir, localTempFileName);
setLastPicFilePath(f.getPath());
Log.e("getLastPicFilePath",getLastPicFilePath());
return f;
}

public static String getLastPicFilePath() {
return LastPicFilePath;
}

public static void setLastPicFilePath(String lastPicFilePath) {
LastPicFilePath = lastPicFilePath;
}
</code></pre>

}
```
***再重写onActivityResult

@Override<br />protected void onActivityResult(int requestCode, int resultCode, Intent data) {<br />if (resultCode != RESULT_OK) {<br />mUploadMessage.onReceiveValue(null);//这里防止拍照的时候取消了回来webview无响应的问题,这里是大坑<br />mUploadMessage = null;//上边注释说了,这里是坑<br />mWebView.requestFocus();<br />return;<br />}<br />if (requestCode == REQUEST_CODE_PICK_IMAGE) {<br />Uri uri = data.getData();<br />//to do find the path of pic by uri<br />mUploadMessage.onReceiveValue(uri);<br />} else if (requestCode == REQUEST_CODE_CAPTURE_CAMEIA) {<br />Uri uri = Uri.parse(FileUtil.getLastPicFilePath());//从上边指定的地址生成uri<br />mUploadMessage.onReceiveValue(uri);<br />}<br />super.onActivityResult(requestCode, resultCode, data);<br />}


总结



总体来说最坑的就是这个 mUploadMessage.onReceiveValue( );方法
没看WebChromeClient源码 猜想是如果不回调这句的话webview会一直等着你操作,造成整个webview界面没有响应,这个问题让我纠结了一下午时间,总结出来,希望对其他人有帮助。

解决 WordPress“正在执行例行维护,请一分钟后回来”

ps:今天看到wordpress有更新了,果断更新,但是不知道怎么回事,结果一直停留在“正在执行例行维护,请一分钟后回来”的状态了,这个问题一定有解决方法,所以搜索到了这篇文章,已测,可行。感谢原作者



WordPress在升级程序、主题、插件时,都会先切换到维护模式,也就是显示 “正在执行例行维护,请一分钟后回来(Briefly unavailable for scheduled maintenance. Check back in a minute)”,如果升级顺利,也就几秒左右就恢复正常;但是如果由于网速不佳等原因导致升级中断,WordPress就会一直停留在维护模式,不论前台还是后台,都一直显示“正在执行例行维护,请一分钟后回来“。

如何解决这个问题呢?

1.马上通过FTP登录你的网站,删除WordPress根目录下的 .maintenance ,刷新网页即可。

2.但是有时候你会发现,根目录根本就没有 .maintenance!倡萌最近就遇到这个问题,最初以为是隐藏了,所以使用SSH登录服务器,但是依旧没有看到,怎么办?其实有一个比较简单的办法,直接新建一个空的txt文本,上传到主机空间中,然后重命名为 .maintenance,然后你会发现 .maintenance 居然不见了!不用担心,重新刷新你的网站,是不是正常了?!

3.如果还是不行,或者你想让它以后可以显示 .maintenance ,那就打开 /wp-admin/includes/class-wp-filesystem-direct.php

找到下面的代码:


function mkdir($path, $chmod = false, $chown = false, $chgrp = false) {
// safe mode fails with a trailing slash under certain PHP versions.
$path = untrailingslashit($path);
if ( empty($path) )
return false;

if ( ! $chmod )
$chmod = FS_CHMOD_DIR;

if ( ! @mkdir($path) )
return false;
$this->chmod($path, $chmod);
if ( $chown )
$this->chown($path, $chown);
if ( $chgrp )
$this->chgrp($path, $chgrp);
return true;
}



将其改为:


function mkdir($path, $chmod = false, $chown = false, $chgrp = false) {
// safe mode fails with a trailing slash under certain PHP versions.
if ( ! $chmod )
$chmod = $this->permission;

if(ini_get('safe_mode') && substr($path, -1) == '/')
{
$path = substr($path, 0, -1);
}

if ( ! @mkdir($path) )
return false;
$this->chmod($path, $chmod);
if ( $chown )
$this->chown($path, $chown);
if ( $chgrp )
$this->chgrp($path, $chgrp);
return true;
}



然后刷新FTP目录,是不是看到.maintenance了,删除它吧!

原文链接:http://www.wpdaxue.com/briefly-unavailable-for-scheduled-maintenance.html

Centos下安装Postfix,替换sendmail发送邮件 实践应用于本站并记录备查

转载的,主要是以前看到过,但是一直没实行,今天按照文中做了一遍,第一次失败,又改了下参数,启动成功
原文地址:http://www.68idc.cn/help/opersys/ubuntu/20141111128088.html
‘’‘
1,如果装了sendmail的话,先卸载了。

yum remove sendmail
2,安装 Postfix

yum install postfix
3,更改默认MTA为Postfix:

/usr/sbin/alternatives --set mta /usr/sbin/sendmail.postfix
4,完事儿,再次检查下是否将MTA改为Postfix了:

alternatives --display mta
5,配置Postfix,vi编辑main.cf

vi /etc/postfix/main.cf
打开后分别找到以下几项,,将其前面的#去掉,并做配置:

myhostname = mail.imcn.me
mydomain = imcn.me
myorigin = $mydomain
inet_interfaces = all mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 168.100.189.0/28, 127.0.0.0/8
relay_domains = (这里我留空启动不了,所以就使用了默认的 relay_domains = $mydestination)
home_mailbox = Maildir/
以上几个设置项不在同一个位置,需要分别寻找,并进行更改,其中相应的域名请改为自己的地址,mynetworks我是没有做改变,自动就有的。

配置文件解释:

mydomain:

mydomain参数是指email服务器的域名,请确保为正式域名(如centos.bz)

myhostname:

myhostname参数是指系统的主机名称(如我的服务器主机名称是mail.centos.bz)

myorigin:

myorigin参数指定本地发送邮件中来源和传递显示的域名。在我们的例子中,mydomain是centos.bz,也是我的域名。

对于下面的一行,我们的邮件地址是user@centos.bz而不是user@mail.centos.bz。

myorigin = $mydomain

mynetworks:

mynetworks参数指定受信任SMTP的列表,具体的说,受信任的SMTP客户端允许通过Postfix传递邮件。

mydestination:

mydestination参数指定哪些邮件地址允许在本地发送邮件。这是一组被信任的允许通过服务器发送或传递邮件的IP地址。用户试图通过发送从此处未列出的IP地址的原始服务器的邮件将被拒绝。

inet_interfaces:

inet_interfaces参数设置网络接口以便Postfix能接收到邮件。

relay_domains:

该参数是系统传递邮件的目的域名列表。如果留空,我们保证了我们的邮件服务器不对不信任的网络开放。

home_mailbox:

该参数设置邮箱路径与用户目录有关,也可以指定要使用的邮箱风格。

6,检测并启动Postfix

service postfix status //检测,若已启动会列出其PID,如下: master (pid 25579) is running... //若未启动,执行以下命令: service postfix start
7,设置开机启动

chkconfig postfix on
我自己的安装到此为止就结束了,因为我只需要的是mail功能,并非搭建邮件服务器。此时测试邮件发送,OK。

参考资料:

补充:如果你之前没有配置过 sendmail 组件,那你很可能没有修改 php.ini 的邮件发送路径,那样可能无法发送邮件。

所以你需要配置php.ini,填写sendmail的绝对路径:

使用命令打开编辑php.ini

vi /usr/local/php/etc/php.ini
输入?sendmail_path 查找定位(或者手动跳转找到sendmail_path),你会发现默认是下面的代码

;sendmail_path =
按 i 进入编辑,将这行修改为

sendmail_path = /usr/sbin/sendmail -t -i
按 Esc 键退出编辑,输入 :wq 保存退出

5.重启php-fpm进程

/etc/init.d/php-fpm restart
’‘’