HOWTO Category Archives

охват

27 July 2015 | HOWTO, Software | No Comments

кстати, небольшое пошаговое руководство, как публиковать HTML с помощью GitHub[1]:

  1. запретите Jekyll и создайте в репозитории пустой файл .nojekyll — например, так:
    touch .nojekyll
  2. добавьте его в ветвь master:
    git add .nojekyll
    git commit -m ".nojekyll file added"
    git push -u origin master
  3. создайте новую ветвь исключительно для web:
    git branch gh-pages
  4. скопируйте туда содержание основной ветви:
    git push origin gh-pages

теперь ваши HTML файлы из вашего репозитория доступны по следующей схеме: http://ВАШ_ЛОГИН.github.io/ВАШ_РЕПОЗИТОРИЙ/ВАШ_HTML_ФАЙЛ. однако, если затем вы обновите основную ветвь master, важно так не забыть обновить и ветвь gh-pages — вот так:

git push . master:gh-pages

 


  1. например, для Rотчетов, когда промежуточный (keep_md: true) Markdown-файл достаточно сложен, чтобы GitHub смог отобразить его корректно.  ↩

  

optimise only up to the goal

9 March 2015 | HOWTO, Software | No Comments

хорошая статья про оптимизацию кода для R. надо, постояно надо повторять общеизвестное:

Remember: R works better with vectors, matrices and tables. Loops are, in general, more expensive, as well as dataframes and lists.

loops are just boring, too.

  

let me see you stripped

24 January 2014 | HOWTO, Software | No Comments

или вот Newspaper, другая python-библиотека, что находит и обрабатывает заголовки и статьи в интернете, с легкостью превращая новостные сайты в забытые газеты.

  

хвостиком махнула

21 January 2014 | HOWTO, Software | No Comments

кстати, если вашей web-страничке надо добавить поддержку горячих клавиш, то проще всего это сделать с помощью библиотеки Mousetrap.

  

на поводке

12 January 2014 | HOWTO, Software | No Comments

для того, чтобы в OS X добавить в контекстное меню любой программы возможность искать помеченный текст с помощью Google Chrome, надо создать новый сервис: открыть Automator, в разделе Actions выбрать действие Run AppleScript и отредактировать его следующим образом:

on run {input, parameters}
	tell application "Chromium"
		open location "https://encrypted.google.com/search?pws=0&q=" & input
		activate
	end tell
end run

аналогично, кстати, можно добавить и какой-нибудь сервис для работы с Markdown — хотя их, разных, и так навалом.

  

банки с вареньем

28 December 2013 | HOWTO, Software | No Comments

если активно изпользовать PopClip, то в одним момент с удивлением обнаруживаешь, что различных плагинов у тебя слишком много, они не помещаются рядом, стесняются друг друга и прячутся в закутках.

поэтому некоторые из них так и хочется соеднить в одно целое, связав разные действия с дополнительно зажатыми клавишами-модификаторами. что ж, реализовать подобное несложно, благо у PopClip есть специальная переменная POPCLIP_MODIFIER_FLAGS, которая, натурально, принимает разные значения в зависимости от используемой клавиши.

выглядит это так:

#!/usr/bin/env python

# Markdown tags for PopClip
# By dsjkvf (2013) dsjkvf@gmail.com

import sys
import os

def em():
	sys.stdout.write ("*" + selected_text + "*")

def strong():
	sys.stdout.write ("**" + selected_text + "**")

def quote():
	sys.stdout.write ("> " + selected_text)

def code():
	sys.stdout.write ("`" + selected_text + "`")

def tab():
	sys.stdout.write ("    " + selected_text)
	
def comment():
	sys.stdout.write ("<!-- " + selected_text + " -->")

# get the text selected by PopClip
selected_text = os.environ['POPCLIP_TEXT']
# get the tags set for the corresponding keys (from the extension's settings)
cmd = os.environ['POPCLIP_OPTION_CMD']
opt = os.environ['POPCLIP_OPTION_OPT']
ctr = os.environ['POPCLIP_OPTION_CTR']
non = os.environ['POPCLIP_OPTION_NON']
# special keys: Command + Option, Command + Control
cmo = os.environ['POPCLIP_OPTION_CMO']
cmr = os.environ['POPCLIP_OPTION_CMR']
# transform the settings into the functions name
func_cmd = globals()[cmd]
func_opt = globals()[opt]
func_ctr = globals()[ctr]
func_non = globals()[non]
# special keys: Command + Option, Command + Control
func_cmo = globals()[cmo]
func_cmr = globals()[cmr]
# get the key pressed
key = os.environ['POPCLIP_MODIFIER_FLAGS']
if key == '1572864':
	func_cmo()
elif key == '1310720':
	func_cmr()
elif key == '1048576':
	func_cmd()
elif key == '524288':
	func_opt()
elif key == '262144':
	func_ctr()
else:
	func_non()

и не забудем про свойства:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Actions</key>
	<array>
		<dict>
			<key>Image File</key>
			<string>t.png</string>
			<key>Script Interpreter</key>
			<string>/usr/bin/python</string>
			<key>Shell Script File</key>
			<string>t.py</string>
			<key>Title</key>
			<string>Tagify</string>
			<key>After</key>
			<string>paste-result</string>
			<key>Requirements</key>
			<array>
				<string>paste</string>
			</array>
		</dict>
	</array>
	<key>Options</key>
	<array>
		<dict>
			<key>Option Identifier</key>
			<string>non</string>
			<key>Option Type</key>
			<string>string</string>
			<key>Option Default Value</key>
			<string>em</string>
			<key>Option Label</key>
			<string>No additional key</string>
		</dict>
		<dict>
			<key>Option Identifier</key>
			<string>ctr</string>
			<key>Option Type</key>
			<string>string</string>
			<key>Option Default Value</key>
			<string>code</string>
			<key>Option Label</key>
			<string>Control (^)</string>
		</dict>
		<dict>
			<key>Option Identifier</key>
			<string>opt</string>
			<key>Option Type</key>
			<string>string</string>
			<key>Option Default Value</key>
			<string>tab</string>
			<key>Option Label</key>
			<string>Option (⌥)</string>
		</dict>
		<dict>
			<key>Option Identifier</key>
			<string>cmd</string>
			<key>Option Type</key>
			<string>string</string>
			<key>Option Default Value</key>
			<string>strong</string>
			<key>Option Label</key>
			<string>Command (⌘)</string>
		</dict>
		<dict>
			<key>Option Identifier</key>
			<string>cmo</string>
			<key>Option Type</key>
			<string>string</string>
			<key>Option Default Value</key>
			<string>quote</string>
			<key>Option Label</key>
			<string>Command + Option (⌘⌥)</string>
		</dict>
		<dict>
			<key>Option Identifier</key>
			<string>cmr</string>
			<key>Option Type</key>
			<string>string</string>
			<key>Option Default Value</key>
			<string>comment</string>
			<key>Option Label</key>
			<string>Command + Control (⌘^)</string>
		</dict>
	</array>
	<key>Options Title</key>
	<string>Select tags for key modifiers:</string>	
	<key>Credits</key>
	<array>
		<key>Name</key>
		<string>dsjkvf</string>
	</array>
	<key>Extension Description</key>
	<string>Tags for Markdown</string>
	<key>Extension Identifier</key>
	<string>com.dsjkvf.popclip.extension.tagify</string>
	<key>Extension Name</key>
	<string>tagify</string>
	<key>Version</key>
	<integer>2</integer>
</dict>
</plist>

готовое расширение для опытов можно взять здесь.

  

на диете

20 December 2013 | HOWTO, Software | 3 Comments

у каждого из нас, полагаю, есть такой новостной сайт (рассадник каких-нибудь деревенских акуталий), что совсем уж невозможно просматривать из-за окончательного засилия рекламы, аляповатого дизайна и прочих разных глупостей. что ж, дабы не рыться среди чужой безвкусицы, можно просто взять с главной страницы заголовки — и в python это легко сделать с помощью библиотеки BeautifulSoup:

#!/usr/bin/env python

import sys
import urllib2
from BeautifulSoup import BeautifulSoup
# in order to use Beautiful Soup library version 4 
# comment the above line and uncomment the one below
# from bz4 import BeautifulSoup

# get data from your beloved ugly website
data = urllib2.urlopen('http://your.ugly.website')
# parse that data
soup = BeautifulSoup(data.read())
# describe the type of the output
print 'Content-type: text/html\n\n'
# extract headers of interest
for header in soup.html.body.findAll('tags and styles go here'):
# detect if the links in question are relative or absolute
        if '"/' in str(header):
# correct relative ones
                print(re.sub('"/','"http://your.ugly.website',str(header)))
        else:
                print(str(header))

а для того, чтобы запустить этот скрипт на сервере, сохраните отредатированный код в файл с расширением .cgi и добавьте в файл .htaccess данного каталога следующие директивы:

Options +ExecCGI
AddHandler cgi-script .cgi

ниже, в комментариях, так же есть и законченный пример.

  

на скорую руку

11 December 2013 | HOWTO, Software | No Comments

кстати, если у вас есть документ в формате Markdown, и его надо опубликовать в сети, то вместо иных конверсий и прочих адаптаций, можно воспользоваться библиотекой Strapdown.js и прилагающимися темами.

  

о трансплантациях

4 December 2013 | HOWTO, Software | No Comments

в силу разных привычек (безопастность, эффективность, надежность, итд) я достаточно часто использую в повседневной жизни RAM drive — скажем, чтобы держать там кэш активных программ. и вот, например, как в Mac OS X это можно применить к Chromium[1]:

#!/usr/bin/env python[2]

# Create RAMDisk for Chromium's cache and extensions' temporary files
# By dsjkvf (2013) dsjkvf@gmail.com

import sys
import os
import shutil

def create():
  # Set the size of the RAMDisk in megabytes
  sizeMBytes = 500
  sizeBytes = str(int(sizeMBytes) * 1953)
  # Create RAMDisk
  os.system(
  'diskutil erasevolume HFS+ \"RAMDisk\" `hdiutil attach -nomount ram://'+sizeBytes+'`')

def initialize():
  # Enlist the directories in question
  dirHDDSSD = ['~/Library/Caches/Chromium/Default/Cache', 
  '~/Library/Caches/Chromium/Default/Media Cache', ...[3]]
  dirRAM = ['/Volumes/RAMDisk/Chromium/Cache','/Volumes/RAMDisk/Chromium/Media Cache', ...]
  #Create RAMDisk directories
  for i in dirRAM:
    try:
      os.makedirs(os.path.expanduser(i))
    except OSError, e:
      pass
  # Symlink RAMDisk directories to corresponding mountpoints on the HDD/SSD
  for (i,j) in zip(dirHDDSSD,dirRAM):
    if os.path.exists(os.path.expanduser(i)):
      if not os.path.islink(os.path.expanduser(i)):
        shutil.rmtree(os.path.expanduser(i))
        os.symlink(os.path.expanduser(j), os.path.expanduser(i))
    else:
      try:
        os.symlink(os.path.expanduser(j), os.path.expanduser(i))
      except OSError, e:
          os.unlink(os.path.expanduser(i))
          os.symlink(os.path.expanduser(j), os.path.expanduser(i))
  # Hide the RAMDisk
  os.system('chflags hidden /Volumes/RAMDisk')

def main():
  if not len(sys.argv) > 1:
    create()
    initialize()
    sys.exit()
  else:
    print 'ATTENTION: No command line parameters are supposed to be used with this script.' 
    print 'ATTENTION: Please, make sure to edit the script first.'
    sys.exit()

main()

а для того, чтобы диск не исчезал бесследно после ухода в standby-режим можно использовать программу SleepWatcher, написав для нее элементарное правило:

#!/bin/sh
if [ ! -d "/Volumes/RAMDisk" ]; then
  /Path/to/the/aforementioned/script
fi

  1. предпочитаю Chromium в силу того, что он не соджержит закрытого кода Google. можно так же посмотреть в сторону SRWare Iron, хоть там все и не так однозначно.  ↩

  2. да, python совершенно бесповоротно очаровал меня исключительнейшей простой и логичностью.  ↩

  3. например, это может быть PNaClTranslationCache, или расположенные в ~/Library/Application Support/Chromium/Default/ каталоги Extension State и Extension Rules. или что-то еще.  ↩

  

копипаста

10 November 2013 | HOWTO, Software | 1 Comment

интересная утилита PopClip кроме всего прочего[1] умеет так же использовать всевозможные сторонние расширения — а это и трансформации выделенного текста, и его поиск, и обмен другими приложениями. кроме того, доступна исчерпывающая документация для разработчиков.

вот только из представленных на сайте примеров некоторые все же до конца не отлажены. так, например, расширения для смены регистра (написанные на PHP, sic!) не работают с Юникодом — для того, чтобы это исправить, надо сменить используемые функции на их аналоги для работы с многобайтными строками, mb_strtolower и mb_strtoupper, а так же написать коротенькую mb_ucwords:

function mb_ucwords($str) {
    return mb_convert_case($str, MB_CASE_TITLE, 'UTF-8');
}

ну, и раз уж речь о PHP, то вот, скажем, каркас для восстановления (punto-style) текста, набранного в перепутанной раскладке[2]

// Transliteration service
// By dsjkvf (2013) dsjkvf@gmail.com

function transliterate_en_ru( $str ) {
    $unwanted_array = array('Q'=>'Я', 'q'=>'я', 'W'=>'Ж', 'w'=>'ж' <...>
    // Put your ENG-RUS transliteration array here
    );
    $str = strtr( $str, $unwanted_array );
        return $str;
}
function transliterate_ru_en( $str ) {
    $unwanted_array = array('Я'=>'Q', 'я'=>'q', 'Ж'=>'W', 'ж'=>'w' <...>
    // Put your RUS-ENG transliteration array here
    );
    $str = strtr( $str, $unwanted_array );
    $str = ereg_replace( 'Ĭ', 'J', $str ); // mysterious bug converting Й -> J and
    $str = ereg_replace( 'ĭ', 'j', $str ); // й -> j
    return $str;
}
$input = getenv('POPCLIP_TEXT');
// In order to use that snippet as an OS X service, comment the above line
// and uncomment the ones below
// for  ($i = 1; $i <= $argc; $i++) {
// 	$input = $input . $argv[$i] . " ";
// }
// $input = rtrim($input," ");
$lang  = preg_match('/^[\w\d\s.,-]*$/',$input);
switch ($lang) {
       case 0:
          echo transliterate_ru_en($input);;
          break;
       case 1:
          echo transliterate_en_ru($input);;
          break;
}

ну, или если PopClip все же не мил, то из означенного можно сделать и обычный сервис, используя библиотеку Run AppleScript с включенной опцией Output replaces selected text:

on run {input, parameters}
	do shell script "php -q " & "/POSIX/path/to/your/PHP/script" & " " & input
end run

исправленные расширения можно взять здесь. плюс, надеюсь, в будущем появятся и другие — а пока добавил еще несколько для работы с Markdown[3].

 


  1. там же написано, как использовать PopClip с помощью клавиатуры.  ↩

  2. BOR, милый BOR, знает обо мне все.  ↩

  3. лучше, впрочем, посмотреть сюда.  ↩