Electron 在mac上无法复制粘贴的问题

如果您是Electron(以前称为Atom Shell)的新手,则会注意到在您的应用程序和DevTools中,复制和粘贴(Mac上的CMD + C / CMD + V)将不起作用。这是由于缺少键盘绑定到本机剪贴板的应用程序菜单。

要启用剪贴板功能并复制/粘贴快捷方式,您应该使用Menu.setApplicationMenu()Electron的菜单模块来配置应用程序的菜单。

var Menu = require("menu");

var template = [{
    label: "Application",
    submenu: [
        { label: "About Application", selector: "orderFrontStandardAboutPanel:" },
        { type: "separator" },
        { label: "Quit", accelerator: "Command+Q", click: function() { app.quit(); }}
    ]}, {
    label: "Edit",
    submenu: [
        { label: "Undo", accelerator: "CmdOrCtrl+Z", selector: "undo:" },
        { label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", selector: "redo:" },
        { type: "separator" },
        { label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:" },
        { label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" },
        { label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" },
        { label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:" }
    ]}
];

Menu.setApplicationMenu(Menu.buildFromTemplate(template));


跨平台支持

更新:由Raghu在下面的评论中正确建议,你可以使用特殊的加速器修改器CmdOrCtrl来获得跨平台的行为。CmdOrCtrl将Command在OSX和CtrlWindows和Linux上使用。

工作示例

请参阅以下完整的示例。

主electron.js

 

var app = require("app");
var BrowserWindow = require("browser-window");
var Menu = require("menu");
var mainWindow = null;

app.on("window-all-closed", function(){
    app.quit();
});

app.on("ready", function () {
    mainWindow = new BrowserWindow({
        width: 980,
        height: 650,
        "min-width": 980,
        "min-height": 650
    });
    mainWindow.openDevTools();
    mainWindow.loadUrl("file://" + __dirname + "/index.html");
    mainWindow.on("closed", function () {
        mainWindow =  null;
    });

    // Create the Application's main menu
    var template = [{
        label: "Application",
        submenu: [
            { label: "About Application", selector: "orderFrontStandardAboutPanel:" },
            { type: "separator" },
            { label: "Quit", accelerator: "Command+Q", click: function() { app.quit(); }}
        ]}, {
        label: "Edit",
        submenu: [
            { label: "Undo", accelerator: "CmdOrCtrl+Z", selector: "undo:" },
            { label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", selector: "redo:" },
            { type: "separator" },
            { label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:" },
            { label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" },
            { label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" },
            { label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:" }
        ]}
    ];

    Menu.setApplicationMenu(Menu.buildFromTemplate(template));
});


 

vim设置,.vimrc文件的配置

1.在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号、语法高亮度显示、智能缩进等功能的。为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc。

在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本,所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,即创建的命令为:
 

$vi ~/.vimrc  

2.然后粘贴下列选项设置:

 

syntax on "自动语法高亮
"winpos 5 5          " 设定窗口位置  
"set lines=40 columns=155    " 设定窗口大小  
set nu              " 显示行号  
set go=             " 不要图形按钮  
"color asmanian2     " 设置背景主题  
set guifont=Courier_New:h10:cANSI   " 设置字体  
"syntax on           " 语法高亮  
autocmd InsertLeave * se nocul  " 用浅色高亮当前行  
autocmd InsertEnter * se cul    " 用浅色高亮当前行  
set ruler           " 显示标尺  
set showcmd         " 输入的命令显示出来,看的清楚些  
"set cmdheight=1     " 命令行(在状态行下)的高度,设置为1  
"set whichwrap+=<,>,h,l   " 允许backspace和光标键跨越行边界(不建议)  
"set scrolloff=3     " 光标移动到buffer的顶部和底部时保持3行距离  
set novisualbell    " 不要闪烁(不明白)  
set statusline=%F%m%r%h%w [FORMAT=%{&ff}] [TYPE=%Y] [POS=%l,%v][%p%%] %{strftime("%d/%m/%y – %H:%M")}   "状态行显示的内容  
set laststatus=1    " 启动显示状态行(1),总是显示状态行(2)  
set foldenable      " 允许折叠  
set foldmethod=manual   " 手动折叠  
"set background=dark "背景使用黑色 
set nocompatible  "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限  
" 显示中文帮助
if version >= 603
    set helplang=cn
    set encoding=utf-8
endif
" 设置配色方案
"colorscheme murphy
"字体 
"if (has("gui_running")) 
"   set guifont=Bitstream Vera Sans Mono 10 
"endif 

 
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936
set fileencoding=utf-8"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""新文件标题""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java文件,自动插入文件头 
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()" 
""定义函数SetTitle,自动插入文件头 
func SetTitle() 
    "如果文件类型为.sh文件 
    if &filetype == 'sh' 
        call setline(1,"#########################################################################") 
        call append(line("."), "# File Name: ".expand("%")) 
        call append(line(".")+1, "# Author: zll") 
        call append(line(".")+2, "# mail: zhnlion@126.com") 
        call append(line(".")+3, "# Created Time: ".strftime("%c")) 
        call append(line(".")+4, "#########################################################################") 
        call append(line(".")+5, "#!/bin/bash") 
        call append(line(".")+6, "") 
    else 
        call setline(1, "/*************************************************************************") 
        call append(line("."), "    > File Name: ".expand("%")) 
        call append(line(".")+1, "    > Author: zll") 
        call append(line(".")+2, "    > Mail: zhnllion@126.com ") 
        call append(line(".")+3, "    > Created Time: ".strftime("%c")) 
        call append(line(".")+4, " ************************************************************************/") 
        call append(line(".")+5, "")
    endif
    if &filetype == 'cpp'
        call append(line(".")+6, "#include<iostream>")
        call append(line(".")+7, "using namespace std;")
        call append(line(".")+8, "")
    endif
    if &filetype == 'c'
        call append(line(".")+6, "#include<stdio.h>")
        call append(line(".")+7, "")
    endif
    "新建文件后,自动定位到文件末尾
    autocmd BufNewFile * normal G
endfunc 
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"键盘命令
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

nmap <leader>w :w!<cr>
nmap <leader>f :find<cr>

" 映射全选+复制 ctrl+a
map <C-A> ggVGY
map! <C-A> <Esc>ggVGY
map <F12> gg=G
" 选中状态下 Ctrl+c 复制
vmap <C-c> "+y
"去空行  
nnoremap <F2> :g/^s*$/d<CR> 
"比较文件  
nnoremap <C-F2> :vert diffsplit 
"新建标签  
map <M-F2> :tabnew<CR>  
"列出当前目录文件  
map <F3> :tabnew .<CR>  
"打开树状文件目录  
map <C-F3> be  
"C,C++ 按F5编译运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
    exec "w"
    if &filetype == 'c'
        exec "!g++ % -o %<"
        exec "! ./%<"
    elseif &filetype == 'cpp'
        exec "!g++ % -o %<"
        exec "! ./%<"
    elseif &filetype == 'java' 
        exec "!javac %" 
        exec "!java %<"
    elseif &filetype == 'sh'
        :!./%
    endif
endfunc
"C,C++的调试
map <F8> :call Rungdb()<CR>
func! Rungdb()
    exec "w"
    exec "!g++ % -g -o %<"
    exec "!gdb ./%<"
endfunc
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""实用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 设置当文件被改动时自动载入
set autoread
" quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
"代码补全 
set completeopt=preview,menu 
"允许插件  
filetype plugin on
"共享剪贴板  
set clipboard+=unnamed 
"从不备份  
set nobackup
"make 运行
:set makeprg=g++ -Wall %
"自动保存
set autowrite
set ruler                   " 打开状态栏标尺
set cursorline              " 突出显示当前行
set magic                   " 设置魔术
set guioptions-=T           " 隐藏工具栏
set guioptions-=m           " 隐藏菜单栏
"set statusline= %<%F[%1*%M%*%n%R%H]%= %y %0(%{&fileformat} %{&encoding} %c:%l/%L%)
" 设置在状态行显示的信息
set foldcolumn=0
set foldmethod=indent 
set foldlevel=3 
set foldenable              " 开始折叠
" 不要使用vi的键盘模式,而是vim自己的
set nocompatible
" 语法高亮
set syntax=on
" 去掉输入错误的提示声音
set noeb
" 在处理未保存或只读文件的时候,弹出确认
set confirm
" 自动缩进
set autoindent
set cindent
" Tab键的宽度
set tabstop=4
" 统一缩进为4
set softtabstop=4
set shiftwidth=4
" 不要用空格代替制表符
set noexpandtab
" 在行和段开始处使用制表符
set smarttab
" 显示行号
set number
" 历史记录数
set history=1000
"禁止生成临时文件
set nobackup
set noswapfile
"搜索忽略大小写
set ignorecase
"搜索逐字符高亮
set hlsearch
set incsearch
"行内替换
set gdefault
"编码设置
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"语言设置
set langmenu=zh_CN.UTF-8
set helplang=cn
" 我的状态行显示的内容(包括文件类型和解码)
"set statusline=%F%m%r%h%w [FORMAT=%{&ff}] [TYPE=%Y] [POS=%l,%v][%p%%] %{strftime("%d/%m/%y – %H:%M")}
"set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
" 总是显示状态行
set laststatus=2
" 命令行(在状态行下)的高度,默认为1,这里是2
set cmdheight=2
" 侦测文件类型
filetype on
" 载入文件类型插件
filetype plugin on
" 为特定文件类型载入相关缩进文件
filetype indent on
" 保存全局变量
set viminfo+=!
" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
" 字符间插入的像素行数目
set linespace=0
" 增强模式中的命令行自动完成操作
set wildmenu
" 使回格键(backspace)正常处理indent, eol, start等
set backspace=2
" 允许backspace和光标键跨越行边界
set whichwrap+=<,>,h,l
" 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
set mouse=a
set selection=exclusive
set selectmode=mouse,key
" 通过使用: commands命令,告诉我们文件的哪一行被改变过
set report=0
" 在被分割的窗口间显示空白,便于阅读
set fillchars=vert: ,stl: ,stlnc:
" 高亮显示匹配的括号
set showmatch
" 匹配括号高亮的时间(单位是十分之一秒)
set matchtime=1
" 光标移动到buffer的顶部和底部时保持3行距离
set scrolloff=3
" 为C程序提供自动缩进
set smartindent
" 高亮显示普通txt文件(需要txt.vim脚本)
au BufRead,BufNewFile *  setfiletype txt
"自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
    if getline('.')[col(‘.’) – 1] == a:char
        return "<Right>"
    else
        return a:char
    endif
endfunction
filetype plugin indent on 
"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" CTags的设定  
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let Tlist_Sort_Type = "name"    " 按照名称排序  
let Tlist_Use_Right_Window = 1  " 在右侧显示窗口  
let Tlist_Compart_Format = 1    " 压缩方式  
let Tlist_Exist_OnlyWindow = 1  " 如果只有一个buffer,kill窗口也kill掉buffer  
let Tlist_File_Fold_Auto_Close = 0  " 不要关闭其他文件的tags  
let Tlist_Enable_Fold_Column = 0    " 不要显示折叠树  
autocmd FileType java set tags+=D:toolsjavatags  
"autocmd FileType h,cpp,cc,c set tags+=D:toolscpptags  
"let Tlist_Show_One_File=1            "不同时显示多个文件的tag,只显示当前文件的
"设置tags  
set tags=tags  
"set autochdir 

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"其他东东
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"默认打开Taglist 
let Tlist_Auto_Open=1 
"""""""""""""""""""""""""""""" 
" Tag list (ctags) 
"""""""""""""""""""""""""""""""" 
let Tlist_Ctags_Cmd = '/usr/bin/ctags' 
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的 
let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim 
let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口
" minibufexpl插件的一般设置
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1 
let g:miniBufExplModSelTarget = 1

 

 

3.设置完后

$:x 或者 $:wq

进行保存退出即可。

Laravel 安装

服务器要求

Laravel框架有一些系统要求。当然,所有这些要求都是由Laravel Homestead虚拟机满足的,所以强烈建议您使用Homestead作为您本地的Laravel开发环境。

但是,如果您不使用Homestead,则需要确保您的服务器符合以下要求:

  • PHP> = 7.0.0
  • OpenSSL PHP扩展
  • PDO PHP扩展
  • Mbstring PHP扩展
  • Tokenizer PHP扩展
  • XML PHP扩展

安装Laravel

Laravel利用Composer来管理它的依赖关系。所以,在使用Laravel之前,请确保您的机器上安装了Composer。

通过Laravel安装程序

首先,使用Composer下载Laravel安装程序:

composer global require "laravel/installer"

确保$PATH将Composer 的系统范围的供应商bin目录放在你的系统中,这样laravel可执行文件就可以被你的系统找到。该目录根据您的操作系统存在于不同的位置; 但是,一些常见的地点包括:

  • MacOS的: $HOME/.composer/vendor/bin
  • GNU / Linux发行版: $HOME/.config/composer/vendor/bin

安装完成后,该命令将在您指定的目录中创建一个新的Laravel安装。例如,将创建一个名为包含新Laravel安装的目录,其中已经安装了所有Laravel的依赖关系:laravel newlaravel new blogblog

laravel new blog

通过作曲家创建项目

或者,您也可以通过在终端中发布Composer 命令来安装Laravel create-project

composer create-project --prefer-dist laravel/laravel blog

本地开发服务器

如果您在本地安装了PHP,并且想要使用PHP的内置开发服务器来为您的应用程序提供服务,则可以使用serveArtisan命令。这个命令将启动一个开发服务器http://localhost:8000

php artisan serve

当然,通过HomesteadValet可以获得更强大的当地发展选择

组态

公共目录

安装Laravel之后,您应该将您的Web服务器的文档/ Web根配置为public目录。此目录中充当进入你的应用所有的HTTP请求的前端控制器。index.php

配置文件

所有Laravel框架的配置文件都存储在config目录中。每个选项都有文档记录,所以随时查看文件并熟悉可用的选项。

目录权限

安装Laravel后,您可能需要配置一些权限。目录storage目录中的目录应该可以通过Web服务器写入,否则Laravel将不能运行。如果您正在使用Homestead虚拟机,则应该已经设置了这些权限。bootstrap/cache

应用程序键

安装Laravel之后应该做的下一件事情是将您的应用程序密钥设置为随机字符串。如果您通过Composer或Laravel安装程序安装了Laravel,则该命令已经为您设置了此项php artisan key:generate

通常,这个字符串应该是32个字符长。密钥可以在.env环境文件中设置如果你还没有重命名文件,你现在应该这样做。如果应用程序密钥未设置,您的用户会话和其他加密数据将不安全!.env.example.env

其他配置

Laravel几乎不需要其他配置。您可以自由开始开发!但是,您可能希望查看该文件及其文档。它包含几个选项,比如你不妨根据自己的应用程序来改变。config/app.phptimezonelocale

您可能还需要配置一些Laravel的其他组件,例如:

Web服务器配置

漂亮的网址

阿帕奇

Laravel包含一个文件,用于提供没有路径中前端控制器的URL 在向Apache提供Laravel之前,请确保启用该模块,以使服务器能够遵守文件。public/.htaccessindex.phpmod_rewrite.htaccess

如果.htaccessLaravel附带文件不能用于Apache安装,请尝试以下方法:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Nginx的

如果您使用的是Nginx,那么您的站点配置中的以下指令将把所有请求指向前端控制器:index.php

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

当然,使用Homestead代客时,漂亮的网址会自动配置。

LNMP安装了哪些软件?安装目录在哪?

LNMP一键安装包除去安装所必须的依赖包,还会默认安装以下软件: Nginx、MySQL/MariaDB、PHP、phpMyAdmin、Zend Optimizer/Zend GuardLoader。用户可以根据自己的需要安装其他组件,如FTP服务器、缓存组件,也可以使用升级脚本对Nginx、MySQL、PHP进行升级。
安装这些组件或升级都需要在lnmp下载解压缩后的目录,比如下载到/root目录,就进入/root/lnmp1.4-full目录,执行以下命令。

  • 虚拟主机管理:
    参见:http://lnmp.org/faq/lnmp-vhost-add-howto.html

     

    • FTP服务器:
    • 可选1,PureFTPd,执行:./pureftpd.sh 安装,1.2+版本使用 lnmp ftp {add|edit|del} 管理,1.1及老版本 http://yourIP/ftp/ 进行管理。
    • 可选2(LNMP1.2下已经移除该脚本),Proftpd,执行:./proftpd.sh 安装,执行命令:/root/proftpd_vhost.sh 添加FTP账号。
    • 缓存加速: LNMP1.2及更高版本统一使用./addons.sh 进行安装和卸载。 使用方法:./addons.sh {install|uninstall} {eaccelerator|xcache|memcached|opcache|redis|imagemagick|ioncube|apcu} 详细教程:http://lnmp.org/faq/addons.html
      LNMP1.1下:
    • 可选1,eAccelerator,执行:./eaccelerator.sh 安装。
    • 可选2,memcached,执行:./memcached.sh安装。
    • 可选3,xcache,安装时需选择版本和设置密码, http://yourIP/xcache/ 进行管理,用户名 admin,密码为安装xcache时设置的。执行:./xcache.sh安装。
    • 可选4,redis,执行:./redis.sh安装。
    • 可选5,opcache,执行:opcache.sh安装。http://yourIP/ocp.php 进行管理。Zend Opcache与eaccelerator相冲突,需卸载eaccelerator。
    • 升级脚本: LNMP1.2及更高版本: 统一使用./upgrade.sh 进行升级工作。 使用方法:./upgrade.sh {nginx|mysql|mariadb|m2m|php|phpa|phpmyadmin} 详细教程:http://lnmp.org/faq/lnmp1-2-upgrade.html
      LNMP1.1下:
    • Nginx升脚本可,升级至任意Nginx版本。执行:./upgrade_nginx.sh 按提示进行升级。
    • PHP升级脚本,可升级至大部分PHP版本。执行:./upgrade_php.sh 按提示进行升级。
    • MySQL升级脚本,可升级至任意MySQL版本,MySQL升级风险较大,虽然会自动备份数据,建议自行再备份一下。执行:./upgrade_mysql.sh 按提示进行升级。
    • MySQL升级至MariaDB,可从MySQL升级至Mariadb,虽然会自动备份数据,建议自行再备份一下。执行:./upgrade_mysql2mariadb.sh 按提示进行升级。
    • MariaDB升级脚本,可升级已安装的Mariadb,虽然会自动备份数据,依然建议自行再备份一下。执行:./upgrade_mariadb.sh 按提示进行升级。
    • LNMPA PHP升级脚本,可升级LNMPA的PHP至大部分版本。执行:./upgrade_lnmpa_php.sh 按提示进行升级。
    • 图像处理:
    • 可选1,imageMagick,执行:./imageMagick.sh 安装。
      执行:./imageMagick.sh 安装,imageMagick路径:/usr/local/imagemagick/bin/。
    • 解密:
    • 可选1,ionCube,执行:./ionCube.sh 安装。
    • 其他:
    • 可选1,(1.4版)执行:./install.sh mphp 在LNMP模式下可安装多PHP版本。
    • (1.2,1.3版)执行:./php5.2.17.sh 可安装一个不与LNMP冲突的PHP 5.2.17单独存在,使用时需要将nginx虚拟主机配置文件里的 php-cgi.sock 修改为 php-cgi52.sock。
    • 可选2,LNMP/LNMPA/LAMP卸载脚本,执行:./uninstall.sh 按提示输入当前模式序号,即可删除,1.4之前版本请自行备份好数据库,网站文件等不会删除。
    • 可选3,(以下几个脚本在安装包tools目录下)执行:./reset_mysql_root_password.sh 可重置MySQL/MariaDB的root密码。
    • 可选4,执行:./check502.sh 可检测php-fpm是否挂掉,502报错时重启,配合crontab使用。
    • 可选5,执行:./cut_nginx_logs.sh 日志切割脚本。
    • 可选6,执行:./remove_disable_function.sh 运行此脚本可删掉禁用函数。
    • 可选7,执行:./remove_disable_function.sh 防跨目录移除工具。

    LNMP相关软件安装目录
    Nginx 目录: /usr/local/nginx/
    MySQL 目录 : /usr/local/mysql/
    MySQL数据库所在目录:/usr/local/mysql/var/
    MariaDB 目录 : /usr/local/mariadb/
    MariaDB数据库所在目录:/usr/local/mariadb/var/
    PHP目录 : /usr/local/php/
    多PHP版本目录 : /usr/local/php5.5/ 其他版本前面5.5的版本号换成其他即可
    PHPMyAdmin目录 : 0.9版本为/home/wwwroot/phpmyadmin/ 1.0及以后版本为 /home/wwwroot/default/phpmyadmin/ 强烈建议将此目录重命名为其不容易猜到的名字。phpmyadmin可自己从官网下载新版替换。
    默认网站目录 : 0.9版本为 /home/wwwroot/ 1.0及以后版本为 /home/wwwroot/default/
    Nginx日志目录:/home/wwwlogs/
    /root/vhost.sh添加的虚拟主机配置文件所在目录:/usr/local/nginx/conf/vhost/
    PureFtpd 目录:/usr/local/pureftpd/
    PureFtpd web管理目录: 0.9版为/home/wwwroot/default/ftp/ 1.0版为 /home/wwwroot/default/ftp/
    Proftpd 目录:/usr/local/proftpd/
    Redis 目录:/usr/local/redis/

    LNMP相关配置文件位置
    Nginx主配置(默认虚拟主机)文件:/usr/local/nginx/conf/nginx.conf
    添加的虚拟主机配置文件:/usr/local/nginx/conf/vhost/域名.conf
    MySQL配置文件:/etc/my.cnf
    PHP配置文件:/usr/local/php/etc/php.ini
    php-fpm配置文件:/usr/local/php/etc/php-fpm.conf
    PureFtpd配置文件:/usr/local/pureftpd/pure-ftpd.conf 1.3及更高版本:/usr/local/pureftpd/etc/pure-ftpd.conf
    PureFtpd MySQL配置文件:/usr/local/pureftpd/pureftpd-mysql.conf
    Proftpd配置文件:/usr/local/proftpd/etc/proftpd.conf 1.2及之前版本为/usr/local/proftpd/proftpd.conf
    Proftpd 用户配置文件:/usr/local/proftpd/etc/vhost/用户名.conf
    Redis 配置文件:/usr/local/redis/etc/redis.conf

    LNMPA相关目录文件位置
    Apache目录:/usr/local/apache/
    Apache配置文件:/usr/local/apache/conf/httpd.conf
    Apache虚拟主机配置文件目录:/usr/local/apache/conf/vhost/
    Apache默认虚拟主机配置文件:/usr/local/apache/conf/extra/httpd-vhosts.conf
    虚拟主机配置文件名称:/usr/local/apache/conf/vhost/域名.conf

     

chrome 报document.write() 警告

您最近在Chrome的开发者控制台中看到过如下警告,并想知道是什么?


 

(index):34 A Parser-blocking, cross-origin script,
https://paul.kinlan.me/ad-inject.js, is invoked via document.write().
This may be blocked by the browser if the device has poor network connectivity.

可组合性是网络的强大之一,使我们能够轻松地与第三方构建的服务集成,构建出优质的新产品!可合并性的一个缺点是它意味着对用户体验的共同责任。如果整合次优,用户体验将受到不利影响。

一个已知的性能差的原因是使用document.write()内页,特别是那些注入脚本的用法。像下面这样无害的,可能会给用户带来真正的问题。


 

document.write('<script src="https://paul.kinlan.me/ad-inject.js"></script>');

在浏览器渲染页面之前,必须通过解析HTML标记来构建DOM树。每当解析器遇到脚本时,它必须停止并执行它,然后才能继续解析HTML。如果脚本动态地注入另一个脚本,解析器将被迫等待更长时间才能下载资源,这可能会导致一个或多个网络往返并延迟首次渲染页面的时间

对于缓慢连接(例如2G)的用户,通过动态注入的外部脚本 document.write()可能延迟主页内容的显示延迟数十秒,或者导致页面无法加载或花费太长时间才能使用户放弃。基于Chrome中的测试,我们了解到,通过第三方脚本插入的document.write()页面的速度通常比2G上的其他页面载入速度慢两倍。

我们从1天的Chrome稳定用户的28天现场试用中收集了数据,仅限于2G连接的用户。我们看到2G上的所有页面加载的7.6%都包含至少一个通过document.write()顶级文档插入的跨​​站点解析器阻止脚本由于阻止这些脚本的加载,我们在这些负载上看到了以下改进:

  • 10%以上的页面加载到达 第一contentful涂料 (对于该页面被有效地加载用户的视觉确认), 25%多页面加载到达完全解析状态,和10%的更少的重新加载提示用户受挫的降低。
  • 平均时间减少21%(超过一秒),直到第 一份有意义的油漆
  • 解析页面的平均时间减少了38%,代表了近六秒的改进,大大减少了显示对用户重要的时间。

考虑到这些数据,Chrome从55版开始, 代表所有用户进行干预,通过更改document.write()Chrome中处理的方式(请参阅Chrome状态检测此已知错误模式具体而言<script>document.write()满足以下所有条件Chrome将不会执行注入元素 

  1. 用户处于缓慢的连接状态,特别是用户在2G时。(将来,这种变化可能会延伸到慢速连接的其他用户,如慢速3G或慢速WiFi。)
  2. document.write()是一个顶级的文件。干预措施不适用于iframe中的document.written脚本,因为它们不会阻止主页面的呈现。
  3. 该脚本中的document.write()解析器阻塞。具有async“或defer”属性的脚本仍将执行。
  4. 该脚本不托管在同一个站点上。换句话说,Chrome不会干预具有匹配eTLD + 1的脚本(例如,在www.example.org上插入的js.example.org上托管的脚本)。
  5. 该脚本尚未在浏览器HTTP缓存中。缓存中的脚本不会导致网络延迟,并且仍然会执行。
  6. 页面的请求不是重新加载。如果用户触发重新加载并且正常执行该页面,Chrome将不会进行干预。

第三方片段有时用于document.write()加载脚本。幸运的是,大多数第三方提供 异步加载替代方案,允许第三方脚本加载,而不会阻止页面上其余内容的显示。

我该如何解决?

这个简单的答案是不要使用脚注document.write()我们正在 维护一组已知的服务,提供异步加载程序支持 ,我们鼓励您继续检查。

如果您的提供商不在列表中,并且支持异步脚本加载,请通知我们,我们可以更新该页面以帮助所有用户

如果您的提供商不支持将脚本异步加载到您的页面中,那么我们鼓励您与他们联系, 让我们 及他们知道他们将如何受到影响。

如果您的提供商给你的一个片段,其中包括document.write(),有可能为你的添加async属性脚本元素,或者为你增添与DOM API的脚本元素,如document.appendChild() 或parentNode.insertBefore()很像 谷歌分析呢

如何检测您的网站何时受到影响

有大量的标准来确定限制是否被执行,那么你如何知道你是否受到影响?

检测用户何时在2G

为了了解这一变化的潜在影响,您首先需要了解您的2G用户数量。您可以使用Chrome中提供网络信息API来检测用户当前的网络类型和速度,然后将头像发送到您的分析或实时用户度量(RUM)系统。


 

if(navigator.connection &&
   navigator.connection.type === 'cellular' &&
   navigator.connection.downlinkMax <= 0.115) {
  // Notify your service to indicate that you might be affected by this restriction.
}

在Chrome DevTools中捕获警告

由于Chrome 53,DevTools发出问题document.write() 语句的警告具体来说,如果document.write()请求符合条件2到5(Chrome在发送此警告时忽略连接条件),警告将如下所示:

在Chrome DevTools中看到警告是非常好的,但是如何大规模地发现?您可以检查发生干预时发送到服务器的HTTP头。

检查脚本资源上的HTTP标头

当插入的脚本document.write被阻止时,Chrome会将以下标头发送到请求的资源:


 

Intervention: <https://shorturl/relevant/spec>;

document.write发现插入的脚本时,可能会在不同情况下被阻止,Chrome可能会发送:


 

Intervention: <https://shorturl/relevant/spec>; level="warning"

干预头将作为脚本的GET请求的一部分发送(在实际干预的情况下异步)。

未来该何去何从?

最初的计划是在我们检测到符合标准的情况下执行此干预措施。我们开始在Chrome 53的开发者控制台中显示警告。(测试版于2016年7月)。我们预计2016年9月将为所有用户提供稳定。

我们将介入阻止2G用户注入脚本,暂时从Chrome 54开始,估计2016年10月中旬将为所有用户提供稳定的版本。查看Chrome状态条目 以获取更多更新。

随着时间的推移,当任何用户连接速度慢(即3G或WiFi速度较慢)时,我们都希望进行干预。按照此Chrome状态条目

想要了解更多?

要了解更多信息,请参阅以下附加资源:

linux下防止ssh暴力破解的方法

今天在盛大云看到一个不错的防止ssh暴力破解的帖子,转过来和大家分享下,主要是依靠denyhost软件。稳重所讲的是下载安装包安装,实际上可以从直接使用yum或者apt安装,找到相应的源就可以。下边是帖子原文: 
DenyHosts官方网站为:http://denyhosts.sourceforge.net 
1. 安装 
# tar -zxvf DenyHosts-2.6.tar.gz 
# cd DenyHosts-2.6 
# python setup.py install 
默认是安装到/usr/share/denyhosts目录的。 
2. 配置 
# cd /usr/share/denyhosts/ 
# cp denyhosts.cfg-dist denyhosts.cfg 
# vi denyhosts.cfg 
PURGE_DENY = 50m #过多久后清除已阻止IP 
  HOSTS_DENY = /etc/hosts.deny #将阻止IP写入到hosts.deny 
  BLOCK_SERVICE = sshd #阻止服务名 
  DENY_THRESHOLD_INVALID = 1 #允许无效用户登录失败的次数 
  DENY_THRESHOLD_VALID = 10 #允许普通用户登录失败的次数 
  DENY_THRESHOLD_ROOT = 5 #允许root登录失败的次数 
  WORK_DIR = /usr/local/share/denyhosts/data #将deny的host或ip纪录到Work_dir中 
  DENY_THRESHOLD_RESTRICTED = 1 #设定 deny host 写入到该资料夹 
  LOCK_FILE = /var/lock/subsys/denyhosts #将DenyHOts启动的pid纪录到LOCK_FILE中,已确保服务正确启动,防止同时启动多个服务。 
  HOSTNAME_LOOKUP=NO #是否做域名反解 
  ADMIN_EMAIL = #设置管理员邮件地址 
  DAEMON_LOG = /var/log/denyhosts #自己的日志文件 
  DAEMON_PURGE = 10m #该项与PURGE_DENY 设置成一样,也是清除hosts.deniedssh 用户的时间。 
3. 设置启动脚本 
# cp daemon-control-dist daemon-control 
# chown root daemon-control 
# chmod 700 daemon-control 
完了之后执行daemon-contron start就可以了。 
# ./daemon-control start 
如果要使DenyHosts每次重起后自动启动还需做如下设置: 
# ln -s /usr/share/denyhosts/daemon-control /etc/init.d/denyhosts 
# chkconfig –add denyhosts 
# chkconfig denyhosts on 
然后就可以启动了: 
# service denyhosts start 
可以看看/etc/hosts.deny内是否有禁止的IP,有的话说明已经成功了。