Catégorie : développement – divers

4 – Comment faire des macros

Ergodox : un seul problème

Beaucoup de personnes, moi y compris, ont acheté l’Ergodox pour pallier à deux choses gênantes des claviers actuels (je parle pour ceux qui tapent beaucoup, comme moi) :

  • Être beaucoup mieux positionné avec les mains pour pouvoir écrire ;
  • Pouvoir entièrement configurer son clavier afin de pouvoir accéder plus rapidement aux touches d’habitude difficiles d’accès.

Vous allez sûrement faire les étapes que j’ai fait à savoir :

  • Utiliser le configurateur sur le site Massdrop ici ;
  • Faire une vraie correspondance entre les touches américaines QWERTY et notre bon clavier français AZERTY et j’ai fait un article dessus il y a quelques jours ;
  • S’apercevoir que finalement il manque des choses, notamment la possibilité de faire un pipe (j’ai dit « un » pipe, pas une pipe !) ou d’autres choses, qui ne nécessitent pas l’appui avec la touche SHIFT mais l’appui avec la touche ALTGR (oui oui avec le GR c’est à dire uniquement la touche ALT de droite du clavier).

Donc vous allez sûrement essayer d’aller chercher les dernières sources concernant le programme qui génère le fameux fichier de configuration de l’ergodox, le fichier HEX.
Ici : https://github.com/benblazak/ergodox-firmware.

Eh bien la compilation ne fonctionne pas. Pour être plus précis elle fonctionne, mais le fichier généré ne fait rien du tout : mon Ergodox ne fonctionne pas du tout.

Alors je me suis pris en main et j’ai commencé à étudier le code qui a été fait.

Maintenant venons-en à…

Ergodox : la solution

  1. Utilisez le configurateur sur le site Massdrop ici ;
  2. Configurez votre clavier comme vous le voulez, en utilisant les bonnes « traductions » des touches dont je donne l’aide dans l’article précédent sur l’Ergodox ;
  3. Récupérez les sources, pas juste le fichier binaire, cochez juste comme ceci :
    Ergodox Configurator download with source checked
  4. Dans le fichier lib\key-functions\public\special.c, ajoutez aux directives « include » celle-ci :

    #include <util/delay.h>

  5. Dans même fichier lib\key-functions\public\special.c, ajoutez cette fonction :


    /*
     * [name]
     *   ALTGR + press|release
     *
     * [description]
     *   Generate a 'altgr' press or release before the
     *   normal keypress or keyrelease
     */
    void kbfun_altgr_press_release(void) {
        /* Remember old state before modifying it */
        bool backup_pressed = _kbfun_is_pressed(KEY_RightAlt);
        /* Force the state to "pressed" */
        _kbfun_press_release(true, KEY_RightAlt);
        kbfun_press_release();
        /* Send the key */
        usb_keyboard_send();
        _delay_ms(MAKEFILE_DEBOUNCE_TIME);
        /* Restore previous state */
        _kbfun_press_release(backup_pressed, KEY_RightAlt);
    }

  6. Maintenant, vous avez donc crée une fonction qui permet de « forcer » l’appui sur ALTGR et d’envoyer la touche concernée.
    Déclarez cette fonction dans lib/key-functions/public.h :

    Juste avant la déclaration de kbfun_shift_press_release, mettez-y la vôtre :

        // special
        void kbfun_altgr_press_release           (void);
        void kbfun_shift_press_release           (void);
        void kbfun_2_keys_capslock_press_release (void);

  7. Touche finale : le fichier dans lequel il y a la configuration de votre clavier :

    keyboard/ergodox/layout/default--layout.c

    A l’endroit des définitions, ajoutez-y la vôtre :

    // DEFINITIONS
    ...
    blabla
    ...
    #define  salprre  &kbfun_altgr_press_release
    #define  sshprre  &kbfun_shift_press_release
    ...
    blabla
    ...

  8. Ca y est, vous avez votre fonction prête à être appelée.
    Il vous suffira juste de chercher sur quelle touche l’appliquer.
    Je vais vous donner un exemple simple, et après à vous de l’adapter : l’exemple est avec le symbole € : nous allons remplacer, juste pour l’exemple, la touche « e » par simuler qu’on appuie sur la touche ALTGR et e (comme on le fait sur un clavier classique, pour avoir le symbole ).

    Ouvrez le fichier keyboard/ergodox/layout/default--layout.c dans lequel vous venez juste de déclarer (étape juste avant) votre fonction ALTGR sous la forme raccourcie salprre.

    Voici le principe qu’a fait le développeur : pour une couche, il crée deux tableaux : un tableau dans lequel il y a les « codes » clavier à envoyer, tableau qui a la taille du clavier, donc, et un autre tableau, qui a la taille du clavier, dans lequel il y a les fonctions à appeler pour chaque touche. Oui je sais c’est très laid, c’est discutable etc mais c’est fait ainsi. Comme il y a plusieurs couches, il y a donc, si vous avez suivi :

    • un tableau composé lui même des tableaux des touches pour chaque couche
    • un tableau composé lui même des tableaux des fonctions à appeler lorsqu’on presse la touche, et ces fonctions reçoivent en paramètre la touche qui a été cherchée dans le tableau précédent

    Dans ce fichier, allez chercher là où il y a la déclaration de la touche e. Pour moi c’est facile, c’est sur la couche 0 car j’ai configuré mon clavier presque comme un clavier « normal » AZERTY donc ici :

    Ergodox configurator source layer 0 key e

  9. A partir d’ici, mémorisez bien la ligne et la colonne. Ici c’est donc ligne 2, colonne 4. Ensuite descendez dans le code et cherchez la déclaration des fonctions. Placez vous à la même couche, même ligne et même colonne comme ceci :

    Ergodox configurator source layer 0 functions

    Et il vous suffit juste de remplacer le nom de l’appel de la fonction actuel (kprrel) par l’appel de votre fonction soit salprre

    Ergodox configurator source layer 0 function properly replaced by my own function

  10. Et voilà il ne vous reste plus qu’à compiler :

    Ergodox configurator compilation of the source

  11. Vous avez terminé ! Transférez le fichier HEX sur votre Ergodox, et voilà : avec mon exemple, vous ne pouvez plus qu’écrire des € à la place des « e » normaux. Elle est pas belle la vie ?
  12. Il vous faudra répéter les opérations à partir de l’étape 7 à chaque fois que vous récupérerez un nouveau layout via le configurator du site Ergodox.

unity master server

network view = instance et sur chaque objet

un personnage c’est un composant

Adobe Photoshop Scripting : astuces – hints

Après avoir lu la documentation et essayé toutes les choses de bases, voici ce qu’il me manquait pour faire les choses rapidement : notez bien que je ne programme Photoshop qu’en JavaScript.

Extension des fichiers Photoshop JavaScript

Tous vos fichiers doivent se terminer par « .jsx »

Charger les scripts uniquement via Photoshop

  • Si Photoshop est déjà ouvert, choisissez Fichier » Scripts » Parcourir. Allez dans le répertoire Presets » Scripts et sélectionnez votre script.
  • Si Photoshop n’est pas ouver : démarrez Photoshop et choisissez Fichier » Scripts, et sélectionnez votre script à partir du menu Scripts.

En scripting, impossible de sélectionner un cercle. La sélection ne fonctionne que sur des points : on peut préciser un ensemble de points, et ensuite demander à ce que la sélection « suive » cet ensemble de points. L’astuce que j’ai trouvé : faire un tracé qui soit un cercle, et demander au tracer de s’appliquer à la sélection.

Enfin, ce qu’il vous manquera le plus et qui est dur à trouver :

Le logger JavaScript

Ils ont fait un truc génial et super pratique : c’est un plugin JavaScript qui loggue toutes vos actions. Comme il loggue toutes vos actions il faut surtout ne pas oublier de le désactiver, mais en pratique, à la moindre de vos actions Photoshop, il remplit un fichier qu’il a crée sur le bureau : ScriptingListenerJS.log (mais aussi pour ceux que ça intéresseil crée le même fichier avec les actions en Visual Basic : ScriptingListenerVB.log).

Donc si vous avez du mal à trouver le code en JavaScript, hop le logger et là vous regardez ce qu’il écrit quand vous faites une action.

PacktLib jQuery for Designers Beginner’s Guide est sorti !

Le livre que j’ai revu – et critiqué est sorti :

PacktLib jQuery for designers

Avec mon petit CV de technical reviewer :

PacktLib jQuery for designers Olivier Pons

Olivier Pons is a developer who’s been building websites since 1997. He’s a teacher at IngeSup (École Supérieure d’Ingénierie Informatique; for more information visit https://www.ingesup.com/ and https://www.y-nov.com), at the University of Sciences (IUT) in Aix-en-Provence/France, and École d’Ingénieurs des Mines de Gardanne, where he teaches MVC fundamentals, Symfony, Php, HTML, CSS, jQuery/jQuery Mobile, Linux basics, and advanced VIM techniques. He has already done some technical reviews, including the books Ext JS 4 First Look, Packt Publishing and jQuery Mobile Web Delopment Essentials, Packt Publishing, among others. In 2013, he left a full-time job as a Delphi and PHP developer to concentrate on his own company, HQF Development (https://hqf.fr). He currently runs a number of websites, including https://www.livrepizzas.fr, https://www.papdevis.fr, and https://olivierpons.fr, his own web development blog. He works as a consultant, teacher, project manager, and sometimes a developer.

vim : configuration

Je partage mon fichier de configuration de vim, si vous avez des suggestions, n’hésitez pas :

set nocompatible
set nocompatible
filetype plugin on
syntax enable

set ignorecase
set paste
set ruler
set modeline

set showcmd

set nowrap
set textwidth=0
set wrapmargin=0
let g:leave_my_textwidth_alone=1

set expandtab
set autoindent
set smartindent
set softtabstop=4
set tabstop=4

" Dans un fichier php, lorsqu'on tape {<CR> alors
" il fait l'indentation automatique
set shiftwidth=4

set number
colorscheme desert
colorscheme torte
colorscheme zellner

set vb t_vb=

set backup
set backupdir=~/.vim/backup
set directory=~/.vim/tmp
set fileencodings=utf-8,ucs-bom,default,latin1
set scrolloff=5
set scrolloff=15
set undolevels=1000
nmap ;bw :. w! ~/.vimxfer<CR>
nmap ;br :r ~/.vimxfer<CR>
nmap ;ba :. w! >>~/.vimxfer<CR>

" Pour la macro gset, après j'utilise F3 :
" ça sert à transformer les trucs du genre :
" - @return string le nom ajouté ...
" par :
" - @return string Nom ajouté ...
map <F3> ^3w/ [a-zA-Z]<CR><RIGHT>v/\( \\|'\)<CR>xvU
" Macro qui réindente le bloc courant d'une seule tab à droite :
map <F4> Vi{9<lt>Vi{>

" Tell vim to remember certain things when we exit
"  '10 : marks will be remembered for up to 10 previously edited files
"  "100 : will save up to 100 lines for each register
"  :20 : up to 20 lines of command-line history will be remembered
"  % : saves and restores the buffer list
"  n... : where to save the viminfo files
set viminfo='10,\"100,:20,%,n~/.viminfo

" when we reload, tell vim to restore the cursor to the saved position
augroup JumpCursorOnEdit
 au!
 autocmd BufReadPost *
 \ if expand("<afile>:p:h") !=? $TEMP |
 \ if line("'\"") > 1 && line("'\"") <= line("$") |
 \ let JumpCursorOnEdit_foo = line("'\"") |
 \ let b:doopenfold = 1 |
 \ if (foldlevel(JumpCursorOnEdit_foo) > foldlevel(JumpCursorOnEdit_foo - 1)) |
 \ let JumpCursorOnEdit_foo = JumpCursorOnEdit_foo - 1 |
 \ let b:doopenfold = 2 |
 \ endif |
 \ exe JumpCursorOnEdit_foo |
 \ endif |
 \ endif
 " Need to postpone using "zv" until after reading the modelines.
 autocmd BufWinEnter *
 \ if exists("b:doopenfold") |
 \ exe "normal zv" |
 \ if(b:doopenfold > 1) |
 \ exe "+".1 |
 \ endif |
 \ unlet b:doopenfold |
 \ endif
augroup END

set backspace=2

inoremap <silent> <Bar>   <Bar><Esc>:call <SID>align()<CR>a

function! s:align()
  let p = '^\s*|\s.*\s|\s*$'
  if exists(':Tabularize') && getline('.') =~# '^\s*|' && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p)
    let column = strlen(substitute(getline('.')[0:col('.')],'[^|]','','g'))
    let position = strlen(matchstr(getline('.')[0:col('.')],'.*|\s*\zs.*'))
    Tabularize/|/l1
    normal! 0
    call search(repeat('[^|]*|',column).'\s\{-\}'.repeat('.',position),'ce',line('.'))
  endif
endfunction

autocmd BufNewFile  * silent! 0r ~/.vim/templates/%:e.tpl
autocmd BufNewFile  *.php call search('w', '', line("w$"))
autocmd BufNewFile,BufRead *.vhost.conf set filetype=apache
autocmd BufNewFile,BufRead *.json set filetype=yaml

let g:snips_author='Olivier Pons'
let g:snips_author_email='olivier.pons@gmail.com'

" ----------------------------------------
" Smarty syntax highlighter / Rappel il est dans ~/.vim/syntax
" Pris ici http://www.vim.org/scripts/script.php?script_id=1798 :
autocmd BufRead,BufNewFile *.tpl set filetype=smarty

" ----------------------------------------
" Truc de Stackoverflow : si ouverture d'un fichier htm(l) alors
" verifier s'il y a {* *} ou {(alphanum) $xx (alphanum)}
" et si c'est le cas appliquer la syntaxe Smarty (au dessus)
autocmd BufNewFile,BufRead *.htm call s:CheckForSmarty()
autocmd BufNewFile,BufRead *.html call s:CheckForSmarty()

function! s:CheckForSmarty()
  for n in range(1, line('$'))
    "if n > 100
    "  return
    "endif

    let line = getline(n)
    if line =~ '{.*$\k\+}' || line =~ '{\*.*\*}'
      set filetype=smarty
      return
    endif
  endfor
endfunction

" (!) Ultra important sinon *tous* les mappings sont désactivés :
set nopaste

" Code will highlight trailing whitespace in red:
highlight WhitespaceEOL ctermbg=red guibg=red
match WhitespaceEOL /\s\+$/

"highlight OverLength ctermbg=red ctermfg=white guibg=#592929
"match OverLength /\%>80v.\+/
set textwidth=80
set colorcolumn=+1
highlight ColorColumn ctermbg=8
highlight Folded term=standout ctermfg=216 guifg=1 guibg=2 ctermbg=8

" Raccourci : F7 = ouvrir le fichier sous le curseur, F8 = ouvrir en vsplit :
:nnoremap <F8> :vertical wincmd f<CR>
:nnoremap <F7> :wincmd f<CR>

Ubuntu 64 bits et Brother 5380DN installation howto

sudo apt-get install ia32-libs
sudo dpkg -i --force-all hl5380dnlpr-2.0.3-1.i386.deb
sudo dpkg -i --force-all cupswrapperHL5380DN-2.0.4-1.i386.deb

olivier@olivier-desktop ~/Bureau # dpkg  -l  |  grep  Brother
ii  cupswrapperhl5380dn  2.0.4-1    Brother HL5380DN CUPS wrapper driver
ii  hl5380dnlpr          2.0.3-1    Brother HL-5380DN LPR driver

Aller ici:

http://localhost:631/printers

Cliquer sur « Modify Printer » and set following parameters.

- "LPD/LPR Host or Printer" or "AppSocket/HP JetDirect" for Device
- lpd://(Your printer's IP address)/binary_p1 for Device URI
- Brother for Make/Manufacturer Selection
- Your printer's name for Model/Driver Selection

Dans mon cas :

Description : HL5380DN
Emplacement : 192.168.1.138
URI du périphérique : lpd://192.168.1.138/binary_p1

cygwin : problème des espaces avec updatedb : la solution via mount

J’ai eu l’information ici : http://cygwin.com/cygwin-ug-net/using-utils.html#mount

Faire un mount permanent :
Editer le fichier /etc/fstab

Y ajouter le lien vers le répertoire qui a des espaces :
"C:/mon projet/mon sous projet" /monprojetmonsousprojet ntfs binary,posix=0,user,noumount,auto

Lancer un nouveau shell pour que le "mount" soit fait automatiquement

RaspberryPi : comment changer la vitesse du clavier

Comment changer la vitesse du clavier, et cela pour toujours (c’est à dire même après un reboot, ça fonctionne toujours) :

Pour rendre la configuration clavier permanente sur le terminal, éditer /etc/kbd/config et y mettre cette vitesse (enfin, c’est ma vitesse de clavier) :

xset r rate 170 120

Pour que cela fonctionne aussi partout et pas que dans les terminaux, editez ce fichier /etc/xdg/lxsession/LXDE/autostart et ajoutez y le même code :

xset r rate 170 120

Merci pour le lien ici.

google code prettify – prettyprint : les codes possibles

Pour rappel rapide, l’utilisation est extrêmement simple : un simple include JavaScript de google code prettifier (je vous laisse le chercher et le faire), puis l’utilisation : au lieu d’écrire de simples balises <code></code> ou <pre></pre>, ajoutez-y la classe prettyprint comme ceci :
<code class="prettyprint">Mon code</code>

Et vous passerez d’un code tel que :
alert("Bonjour");
…à :
alert("Bonjour");

Mais le seul hic c’est que le JavaScript de google « essaie » de deviner ce qu’il y a entre dans le code pour le mettre en couleur. Parfois il ne trouve pas et donc ne colore pas la syntaxe, ou pire, il se trompe (sur de très courts morceaux de code c’est normal). Il vous suffit de préciser de quel type de code il s’agit.

  • Exemple avec du JavaScript :
    <pre class="prettyprint lang-js">var t=12;</pre>
    Ce qui donnne 

    var t=12;
  • Exemple avec du Shell :
    <pre class="prettyprint lang-sh">echo "$MAVAR ok"</pre>
    Ce qui donnne 

    echo "$MAVAR ok"

Voici tous les codes qu’il est possible d’utiliser si jamais vous utilisez le google code prettifier

  • lang-c
  • lang-cc
  • lang-coffee
  • lang-cs
  • lang-css
  • lang-el
  • lang-erlang
  • lang-go
  • lang-hs
  • lang-html
  • lang-java
  • lang-js
  • lang-lua
  • lang-ml
  • lang-proto
  • lang-py
  • lang-scala
  • lang-sh
  • lang-sql
  • lang-vb
  • lang-vhdl
  • lang-wiki
  • lang-yaml

Une bonne interface utilisateur

Voici un site qui donne plein de bonnes idées pour faire une bonne interface utilisateur :

Try a one column layout instead of multicolumns:

Try a one column layout instead of multicolumns.

Try giving a gift instead of closing a sale right away:

Try giving a gift instead of closing a sale right away.

Try merging similar functions instead of fragmenting the ui:

Try merging similar functions instead of fragmenting the ui.

Try social proof instead of talking about yourself:

Try social proof instead of talking about yourself.

Try repeating your primary action instead of showing it just once:

Try repeating your primary action instead of showing it just once.

Try distinct styles between clickable and selected items instead of blurring them:

Try distinct styles between clickable and selected items instead of blurring them.

Try recommending instead of showing equal choices:

Try recommending instead of showing equal choices.

Try undos instead of prompting for confirmation:

Try undos instead of prompting for confirmation.

Try Telling who it’s for instead of targeting everyone:

Try Telling who it's for instead of targeting everyone.

Try being direct instead of indecisive:

Try being direct instead of indecisive.

Try more contrast instead of similarity:

Try more contrast instead of similarity.

Try showing where it’s made instead of being generic:

Try showing where it's made instead of being generic.

Try fewer form fields instead of asking for too many:

Try fewer form fields instead of asking for too many.

Try exposing options instead of hiding them:

Try exposing options instead of hiding them.

Try suggesting continuity instead of false bottoms:

Try suggesting continuity instead of false bottoms.

Try keeping focus instead of drowning with links:

Try keeping focus instead of drowning with links.

Try showing state instead of being state agnostic:

Try showing state instead of being state agnostic.

Try benefit buttons instead of just task based ones:

Try benefit buttons instead of just task based ones.

Try direct manipulation instead of contextless menus:

Try direct manipulation instead of contextless menus.

Try exposing fields instead of creating extra pages:

Try exposing fields instead of creating extra pages.

Try transitions instead of showing changes instantly:

Try transitions instead of showing changes instantly.

Try gradual engagement instead of a hasty sign up:

Try gradual engagement instead of a hasty sign up.

Try fewer borders instead of wasting attention:

Try fewer borders instead of wasting attention.

Try selling benefits instead of features:

Try selling benefits instead of features.

Try designing for zero data instead of just data heavy cases:

Try designing for zero data instead of just data heavy cases.

Try opt-out instead of opt-in:

Try opt-out instead of opt-in.

Try consistency instead of making people relearn:

Try consistency instead of making people relearn.

Try smart defaults instead of asking to do extra work:

Try smart defaults instead of asking to do extra work.

Try conventions instead of reinventing the wheel:

Try conventions instead of reinventing the wheel.

Try loss aversion instead of emphasizing gains:

Try loss aversion instead of emphasizing gains.

Try visual hierarchy instead of dullness:

Try visual hierarchy instead of dullness.

Try grouping related items instead of disordering:

Try grouping related items instead of disordering.

Try inline validation instead of delaying errors:

Try inline validation instead of delaying errors.

Try forgiving inputs instead of being strict with data:

Try forgiving inputs instead of being strict with data.

Try urgency instead of timelessness:

Try urgency instead of timelessness.

Try scarcity instead of abundance:

Try scarcity instead of abundance.

Try recognition instead of recall:

Try recognition instead of recall.

Try bigger click areas instead of tiny ones:

Try bigger click areas instead of tiny ones.