sakuric 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (407) hide show
  1. data/CHANGELOG +13 -0
  2. data/Gemfile +22 -0
  3. data/Gemfile.lock +60 -0
  4. data/HISTORY.yml +13 -0
  5. data/INSTALL +5 -0
  6. data/LICENSE +1 -0
  7. data/Makefile +19 -0
  8. data/Manifest +405 -0
  9. data/README.md +72 -0
  10. data/Rakefile +4 -0
  11. data/TODO +3 -0
  12. data/VERSION +1 -0
  13. data/bashrc +30 -0
  14. data/bashrc.d/00-functions.include +7 -0
  15. data/bashrc.d/01-sakura_checks.include +15 -0
  16. data/bashrc.d/02-uname.include +11 -0
  17. data/bashrc.d/80-ruby.include +4 -0
  18. data/bashrc.d/99-dirs.include +11 -0
  19. data/bashrc.d/aliases.include +20 -0
  20. data/bashrc.d/common.include +7 -0
  21. data/bashrc.d/local.d/README +1 -0
  22. data/bashrc.d/local.d/nothing.include +0 -0
  23. data/bashrc.d/uname.d/Darwin +6 -0
  24. data/bashrc.d/uname.d/Linux +0 -0
  25. data/bashrc.local.sample +11 -0
  26. data/bin/10 +7 -0
  27. data/bin/10times +7 -0
  28. data/bin/1every +22 -0
  29. data/bin/1everyN +22 -0
  30. data/bin/1suN +22 -0
  31. data/bin/2 +5 -0
  32. data/bin/act +24 -0
  33. data/bin/amarelo +2 -0
  34. data/bin/arancio +4 -0
  35. data/bin/arcobaleno +10 -0
  36. data/bin/bianco +3 -0
  37. data/bin/black +2 -0
  38. data/bin/brew-install +3 -0
  39. data/bin/cache +50 -0
  40. data/bin/cache3 +50 -0
  41. data/bin/cheorae +4 -0
  42. data/bin/colorastdouterr +37 -0
  43. data/bin/cp2desktop +3 -0
  44. data/bin/create-git-repo.sh +24 -0
  45. data/bin/csoe +37 -0
  46. data/bin/data +3 -0
  47. data/bin/derive +90 -0
  48. data/bin/dimmi +31 -0
  49. data/bin/dimmiora +4 -0
  50. data/bin/doppioni +48 -0
  51. data/bin/du- +9 -0
  52. data/bin/duplicates +48 -0
  53. data/bin/echodo +7 -0
  54. data/bin/ensure_line_present +82 -0
  55. data/bin/epoch2date +5 -0
  56. data/bin/fanout +100 -0
  57. data/bin/find-broken-symlink +26 -0
  58. data/bin/find-duplicates +48 -0
  59. data/bin/find-special-chars-within-filenames +12 -0
  60. data/bin/fix-terminal +5 -0
  61. data/bin/gce-create-centos-instance +5 -0
  62. data/bin/gce-create-custom-image +8 -0
  63. data/bin/gce-curl-get-instances-for-project +7 -0
  64. data/bin/gce-get-token +3 -0
  65. data/bin/gce-getproject-metadata +35 -0
  66. data/bin/gce-public-ip +4 -0
  67. data/bin/gcutil-fetch +36 -0
  68. data/bin/giallo +2 -0
  69. data/bin/git-clone-in-non-empty-dir +21 -0
  70. data/bin/git-ignore +3 -0
  71. data/bin/git-repos +98 -0
  72. data/bin/git-repos.py +99 -0
  73. data/bin/gitinfo +2 -0
  74. data/bin/google-spreadsheet-cat +40 -0
  75. data/bin/google_ips +5 -0
  76. data/bin/gray +3 -0
  77. data/bin/green +2 -0
  78. data/bin/grigio +3 -0
  79. data/bin/gsutil-debug-bucket +12 -0
  80. data/bin/gsutil-get-oauth2-token +4 -0
  81. data/bin/gugol-image +74 -0
  82. data/bin/hamachi-ubuntu-install +17 -0
  83. data/bin/head-1^-1 +5 -0
  84. data/bin/ifdownup +13 -0
  85. data/bin/immature/ok2 +25 -0
  86. data/bin/immature/twice-still-broken +9 -0
  87. data/bin/install-gic-repo +13 -0
  88. data/bin/install-sakura-on-debian-latest +6 -0
  89. data/bin/iphoto_big_files.sh +37 -0
  90. data/bin/itunes +140 -0
  91. data/bin/jason-xpath.rb +54 -0
  92. data/bin/jsawk +1128 -0
  93. data/bin/json-xpath.rb +54 -0
  94. data/bin/keepup +13 -0
  95. data/bin/lsof-top10 +3 -0
  96. data/bin/minicook +218 -0
  97. data/bin/mv2. +2 -0
  98. data/bin/mv2desktop +2 -0
  99. data/bin/mv2dropbox +2 -0
  100. data/bin/mv2here +2 -0
  101. data/bin/mvto +39 -0
  102. data/bin/nero +2 -0
  103. data/bin/never_as_root +18 -0
  104. data/bin/not +16 -0
  105. data/bin/ok +42 -0
  106. data/bin/orange +4 -0
  107. data/bin/pink +2 -0
  108. data/bin/polygen-dell +7 -0
  109. data/bin/polygen-heanet +6 -0
  110. data/bin/polygen-labs +4 -0
  111. data/bin/print_key_val +4 -0
  112. data/bin/rainbow +10 -0
  113. data/bin/recipe +19 -0
  114. data/bin/red +2 -0
  115. data/bin/remember-command +140 -0
  116. data/bin/remember-command.rb +140 -0
  117. data/bin/richelp +99 -0
  118. data/bin/ricorda-comando +140 -0
  119. data/bin/rosa +2 -0
  120. data/bin/rosso +2 -0
  121. data/bin/run-parts.sh +50 -0
  122. data/bin/sakura-check-version +48 -0
  123. data/bin/sakura-init.DRAFT +5 -0
  124. data/bin/sakura-version +2 -0
  125. data/bin/sano +5 -0
  126. data/bin/sbianca +3 -0
  127. data/bin/sblua +2 -0
  128. data/bin/setterm-reset +5 -0
  129. data/bin/sgialla +2 -0
  130. data/bin/sgrigia +2 -0
  131. data/bin/split +37 -0
  132. data/bin/split.rb +37 -0
  133. data/bin/srosa +1 -0
  134. data/bin/srossa +2 -0
  135. data/bin/strip-white-spaces +2 -0
  136. data/bin/stty-sane +5 -0
  137. data/bin/sudo^-1 +18 -0
  138. data/bin/sverda +6 -0
  139. data/bin/swift-saio-install.sh +336 -0
  140. data/bin/synergyc +0 -0
  141. data/bin/synergys +0 -0
  142. data/bin/syracuse.pl +29 -0
  143. data/bin/tail-n+2 +5 -0
  144. data/bin/tellme +31 -0
  145. data/bin/tellme-time +4 -0
  146. data/bin/timeout3 +91 -0
  147. data/bin/top5 +4 -0
  148. data/bin/trim +4 -0
  149. data/bin/trova-broken-symlink +26 -0
  150. data/bin/twice +5 -0
  151. data/bin/twice.rb +5 -0
  152. data/bin/ubuntu-install-hamachi64 +17 -0
  153. data/bin/ultimo +5 -0
  154. data/bin/upload.py +2380 -0
  155. data/bin/usleep +0 -0
  156. data/bin/varia +90 -0
  157. data/bin/verde +2 -0
  158. data/bin/vermelho +2 -0
  159. data/bin/vim-whereveritis +5 -0
  160. data/bin/viola +1 -0
  161. data/bin/virsh-list-all-vms.py +21 -0
  162. data/bin/virtualbox-manage +41 -0
  163. data/bin/weekend +12 -0
  164. data/bin/whattimeisit +4 -0
  165. data/bin/whereis-ip +5 -0
  166. data/bin/white +3 -0
  167. data/bin/whitefy +3 -0
  168. data/bin/yellow +2 -0
  169. data/bin/yellowfy +2 -0
  170. data/bin/zombies +25 -0
  171. data/docz/polygen/dell.grm +100 -0
  172. data/docz/polygen/frati.grm +85 -0
  173. data/docz/polygen/heanet.grm +54 -0
  174. data/docz/richelp/gcompute.yml +52 -0
  175. data/docz/richelp/gcutil.yml +52 -0
  176. data/docz/richelp/gmail.yml +2 -0
  177. data/docz/richelp/ruby.yml +81 -0
  178. data/docz/richelp/sakura.yml +20 -0
  179. data/docz/richelp/sql.yml +12 -0
  180. data/docz/richelp/ubuntu.yml +22 -0
  181. data/docz/richelp/yaml.yml +39 -0
  182. data/docz/richelp/yml.yml +39 -0
  183. data/etc/sakura/devel.yml +36 -0
  184. data/etc/synergy.conf.example +37 -0
  185. data/images/color-sample.png +0 -0
  186. data/images/google.jpg +0 -0
  187. data/images/icons/toilet.png +0 -0
  188. data/images/sakura.jpg +0 -0
  189. data/images/sakura2.jpg +0 -0
  190. data/init.rb +5 -0
  191. data/lib/classes/arrays.rb +246 -0
  192. data/lib/classes/debug_ric.rb +196 -0
  193. data/lib/classes/fake_data.rb +8 -0
  194. data/lib/classes/ric_debug.rb +0 -0
  195. data/lib/classes/ricconf.rb +110 -0
  196. data/lib/classes/richelp.rb +70 -0
  197. data/lib/classes/strings.rb +284 -0
  198. data/lib/facter/google_compute_engine.rb +10 -0
  199. data/lib/recipes/20120411-puppet-rump-palladius.recipe +2 -0
  200. data/lib/recipes/20120726-skype.ubuntu.recipe +16 -0
  201. data/lib/recipes/20130206-puppet3.ubuntu.recipe +32 -0
  202. data/lib/recipes/20130206-redis.linux.recipe +17 -0
  203. data/lib/recipes/20130208-vanilla.linux.recipe +37 -0
  204. data/lib/recipes/Makefile +4 -0
  205. data/lib/recipes/README.md +29 -0
  206. data/lib/recipes/scripts/redis.sh +14 -0
  207. data/lib/ric.rb +156 -0
  208. data/lib/ric_colors.rb +313 -0
  209. data/lib/ric_strings.rb +285 -0
  210. data/lib/sonice-players/itunes_mac.rb +43 -0
  211. data/lib/sonice-players/itunes_win.rb +47 -0
  212. data/lib/sonice-players/mpd.rb +45 -0
  213. data/lib/sonice-players/rhythmbox.rb +38 -0
  214. data/profile +1 -0
  215. data/sakuric.gemspec +40 -0
  216. data/sbin/install-sakura-on-debian +25 -0
  217. data/sbin/make-install.sh +10 -0
  218. data/sbin/mate-createsymlink +4 -0
  219. data/sounds/0.ogg +0 -0
  220. data/sounds/0.wav +0 -0
  221. data/sounds/01.ogg +0 -0
  222. data/sounds/02.ogg +0 -0
  223. data/sounds/03.ogg +0 -0
  224. data/sounds/08.ogg +0 -0
  225. data/sounds/09.ogg +0 -0
  226. data/sounds/1.ogg +0 -0
  227. data/sounds/1.wav +0 -0
  228. data/sounds/10.ogg +0 -0
  229. data/sounds/100.ogg +0 -0
  230. data/sounds/11.ogg +0 -0
  231. data/sounds/12.ogg +0 -0
  232. data/sounds/13.ogg +0 -0
  233. data/sounds/14.ogg +0 -0
  234. data/sounds/15.ogg +0 -0
  235. data/sounds/16.ogg +0 -0
  236. data/sounds/17.ogg +0 -0
  237. data/sounds/18.ogg +0 -0
  238. data/sounds/19.ogg +0 -0
  239. data/sounds/2.ogg +0 -0
  240. data/sounds/2.wav +0 -0
  241. data/sounds/20.ogg +0 -0
  242. data/sounds/21.ogg +0 -0
  243. data/sounds/22.ogg +0 -0
  244. data/sounds/23.ogg +0 -0
  245. data/sounds/24.ogg +0 -0
  246. data/sounds/26.ogg +0 -0
  247. data/sounds/3.ogg +0 -0
  248. data/sounds/3.wav +0 -0
  249. data/sounds/30.ogg +0 -0
  250. data/sounds/34.ogg +0 -0
  251. data/sounds/4.ogg +0 -0
  252. data/sounds/4.wav +0 -0
  253. data/sounds/40.ogg +0 -0
  254. data/sounds/42.ogg +0 -0
  255. data/sounds/45.ogg +0 -0
  256. data/sounds/47.ogg +0 -0
  257. data/sounds/5.ogg +0 -0
  258. data/sounds/5.wav +0 -0
  259. data/sounds/50.ogg +0 -0
  260. data/sounds/6.ogg +0 -0
  261. data/sounds/6.wav +0 -0
  262. data/sounds/60.ogg +0 -0
  263. data/sounds/7.ogg +0 -0
  264. data/sounds/7.wav +0 -0
  265. data/sounds/70.ogg +0 -0
  266. data/sounds/8.ogg +0 -0
  267. data/sounds/8.wav +0 -0
  268. data/sounds/80.ogg +0 -0
  269. data/sounds/9.ogg +0 -0
  270. data/sounds/9.wav +0 -0
  271. data/sounds/90.ogg +0 -0
  272. data/sounds/a.ogg +0 -0
  273. data/sounds/aaahhh.ogg +0 -0
  274. data/sounds/abologna.ogg +0 -0
  275. data/sounds/adargenta.ogg +0 -0
  276. data/sounds/alzatiecammina.ogg +0 -0
  277. data/sounds/apache.ogg +0 -0
  278. data/sounds/attenzione.ogg +0 -0
  279. data/sounds/awesome.m4a +0 -0
  280. data/sounds/bazinga.mp3 +0 -0
  281. data/sounds/bazinga.ogg +0 -0
  282. data/sounds/bela regaz.wav +0 -0
  283. data/sounds/benvenuti.wav +0 -0
  284. data/sounds/benvenuti2.wav +0 -0
  285. data/sounds/bergonz.ogg +0 -0
  286. data/sounds/boh.ogg +0 -0
  287. data/sounds/buahah.ogg +0 -0
  288. data/sounds/buonasera.ogg +0 -0
  289. data/sounds/buongiorno.ogg +0 -0
  290. data/sounds/burp.ogg +0 -0
  291. data/sounds/carlo.ogg +0 -0
  292. data/sounds/cena.ogg +0 -0
  293. data/sounds/che figata.m4a +0 -0
  294. data/sounds/che figlio di puttana.m4a +0 -0
  295. data/sounds/che.ogg +0 -0
  296. data/sounds/ciao.ogg +0 -0
  297. data/sounds/ciao.wav +0 -0
  298. data/sounds/da.ogg +0 -0
  299. data/sounds/davide.ogg +0 -0
  300. data/sounds/demone.ogg +0 -0
  301. data/sounds/dhcp.ogg +0 -0
  302. data/sounds/dinuovo.ogg +0 -0
  303. data/sounds/dns.ogg +0 -0
  304. data/sounds/dopo.ogg +0 -0
  305. data/sounds/e'.ogg +0 -0
  306. data/sounds/eattivo.ogg +0 -0
  307. data/sounds/ee.ogg +0 -0
  308. data/sounds/ehi.ogg +0 -0
  309. data/sounds/eoragiu.ogg +0 -0
  310. data/sounds/eorasu.ogg +0 -0
  311. data/sounds/eripartita.ogg +0 -0
  312. data/sounds/estato.ogg +0 -0
  313. data/sounds/estatoriavviato.ogg +0 -0
  314. data/sounds/fratro.ogg +0 -0
  315. data/sounds/frozenbubble.ogg +0 -0
  316. data/sounds/funziona.ogg +0 -0
  317. data/sounds/go raibh mile maith agaibh.m4a +0 -0
  318. data/sounds/grazie.ogg +0 -0
  319. data/sounds/h1.ogg +0 -0
  320. data/sounds/hainuovaposta.ogg +0 -0
  321. data/sounds/hogiamangiato.ogg +0 -0
  322. data/sounds/host.ogg +0 -0
  323. data/sounds/il.ogg +0 -0
  324. data/sounds/ilcomputer.ogg +0 -0
  325. data/sounds/ilnumerodaleiselezionatoe.ogg +0 -0
  326. data/sounds/ilprocesso.ogg +0 -0
  327. data/sounds/ilprogramma.ogg +0 -0
  328. data/sounds/ilservizio.ogg +0 -0
  329. data/sounds/imap.ogg +0 -0
  330. data/sounds/imieisuperpoterimidiconoche.ogg +0 -0
  331. data/sounds/infunzione.ogg +0 -0
  332. data/sounds/inpunto.ogg +0 -0
  333. data/sounds/ipmon.ogg +0 -0
  334. data/sounds/laconnessioneadinternet.ogg +0 -0
  335. data/sounds/lastampante.ogg +0 -0
  336. data/sounds/lazzaron.ogg +0 -0
  337. data/sounds/ldap.ogg +0 -0
  338. data/sounds/linterfaccia.ogg +0 -0
  339. data/sounds/lucilla.ogg +0 -0
  340. data/sounds/ma vaffanculo.m4a +0 -0
  341. data/sounds/majjal.wav +0 -0
  342. data/sounds/mamma.ogg +0 -0
  343. data/sounds/mauro.ogg +0 -0
  344. data/sounds/max.ogg +0 -0
  345. data/sounds/meerda.wav +0 -0
  346. data/sounds/meno.ogg +0 -0
  347. data/sounds/merda clo.wav +0 -0
  348. data/sounds/mezza.ogg +0 -0
  349. data/sounds/mila.ogg +0 -0
  350. data/sounds/mille.ogg +0 -0
  351. data/sounds/minuti.ogg +0 -0
  352. data/sounds/named.ogg +0 -0
  353. data/sounds/no.ogg +0 -0
  354. data/sounds/nohofame.ogg +0 -0
  355. data/sounds/nonfunziona.ogg +0 -0
  356. data/sounds/nonriescoatrovare.ogg +0 -0
  357. data/sounds/nonsarebbeoradilavorare.ogg +0 -0
  358. data/sounds/nonstalavorando.ogg +0 -0
  359. data/sounds/numero.wav +0 -0
  360. data/sounds/ooohhh.ogg +0 -0
  361. data/sounds/pinger.ogg +0 -0
  362. data/sounds/pocofa.ogg +0 -0
  363. data/sounds/pop3.ogg +0 -0
  364. data/sounds/porca puttana.m4a +0 -0
  365. data/sounds/porcapupazza.ogg +0 -0
  366. data/sounds/ppp.ogg +0 -0
  367. data/sounds/pranzo.ogg +0 -0
  368. data/sounds/prego.ogg +0 -0
  369. data/sounds/prima.ogg +0 -0
  370. data/sounds/qualcosamidice.ogg +0 -0
  371. data/sounds/raggiungibile.ogg +0 -0
  372. data/sounds/riccardo.ogg +0 -0
  373. data/sounds/salsa ridge.wav +0 -0
  374. data/sounds/scusa.ogg +0 -0
  375. data/sounds/seriously man.m4a +0 -0
  376. data/sounds/si.ogg +0 -0
  377. data/sounds/sito porno con sonoro.wav +0 -0
  378. data/sounds/socmel.wav +0 -0
  379. data/sounds/sono.ogg +0 -0
  380. data/sounds/sonoacasa.ogg +0 -0
  381. data/sounds/sonole.ogg +0 -0
  382. data/sounds/sputo.ogg +0 -0
  383. data/sounds/ssh.ogg +0 -0
  384. data/sounds/stagiocando.ogg +0 -0
  385. data/sounds/statospento.ogg +0 -0
  386. data/sounds/stopaiodipalle.ogg +0 -0
  387. data/sounds/thesedicks.wav +0 -0
  388. data/sounds/tornatosu.ogg +0 -0
  389. data/sounds/trapoco.ogg +0 -0
  390. data/sounds/trequarti.ogg +0 -0
  391. data/sounds/tutti.ogg +0 -0
  392. data/sounds/una.ogg +0 -0
  393. data/sounds/unquarto.ogg +0 -0
  394. data/sounds/virgola.ogg +0 -0
  395. data/sources/c/usleep.c +50 -0
  396. data/spec/my_first_spec.rb +6 -0
  397. data/tasks/sakuric-gem.rake +21 -0
  398. data/tasks/testing.rake +15 -0
  399. data/templates/bashrc.inject +10 -0
  400. data/templates/happy_christmas.ascii_art +5 -0
  401. data/test/roodi.sh +10 -0
  402. data/test/test_mini_failing.rb +3 -0
  403. data/test/test_mini_ok.rb +3 -0
  404. data/test/test_ruby_syntax.sh +12 -0
  405. data/third-party/jsawk/README.markdown +437 -0
  406. data/third-party/jsawk/jsawk +1128 -0
  407. metadata +835 -0
Binary file
@@ -0,0 +1,50 @@
1
+ #include<stdio.h>
2
+ #include<time.h>
3
+ #include<signal.h>
4
+
5
+ // found it here: http://cc.byexamples.com/2007/05/25/nanosleep-is-better-than-sleep-and-usleep/
6
+
7
+ void sigfunc(int sig_no)
8
+ {
9
+
10
+ }
11
+
12
+ int __nsleep(const struct timespec *req, struct timespec *rem)
13
+ {
14
+ struct timespec temp_rem;
15
+ if(nanosleep(req,rem)==-1)
16
+ __nsleep(rem,&temp_rem);
17
+ else
18
+ return 1;
19
+ }
20
+
21
+ int msleep(unsigned long milisec)
22
+ {
23
+ struct timespec req={0},rem={0};
24
+ time_t sec=(int)(milisec/1000);
25
+ milisec=milisec-(sec*1000);
26
+ req.tv_sec=sec;
27
+ req.tv_nsec=milisec*1000000L;
28
+ __nsleep(&req,&rem);
29
+ return 1;
30
+ }
31
+
32
+ int main()
33
+ {
34
+ struct sigaction sa={0};
35
+ sa.sa_handler=&sigfunc;
36
+ sigaction(SIGINT, &sa,NULL);
37
+
38
+ int a=0;
39
+ scanf("%d",&a);
40
+
41
+ for (;;)
42
+ {
43
+ printf("testing...\n");
44
+ if (a==1)
45
+ msleep(1000);
46
+ else
47
+ usleep(1000000);
48
+ }
49
+ return 1;
50
+ }
@@ -0,0 +1,6 @@
1
+
2
+ #require 'spec_helper'
3
+
4
+ #describe Book do
5
+
6
+ #end
@@ -0,0 +1,21 @@
1
+
2
+ #################
3
+ # Deploy the gem 'sakuric'
4
+
5
+ version = File.read( 'VERSION' ) rescue "0.0.42_sakbug"
6
+
7
+ Echoe.new('sakuric', version ) do |p|
8
+ p.description = "My SAKURA gem with various utilities. This is my swiss-army knife for Linux and Mac. See README.md for amazing examples"
9
+ p.url = "http://github.com/palladius/sakura"
10
+ p.author = "Riccardo Carlesso"
11
+ p.email = "['p','ll','diusbonton].join('a') @ gmail.com"
12
+ p.ignore_pattern = [
13
+ "tmp/*",
14
+ "tmp/*", #"tmp/*/*", "tmp/*/*/*",
15
+ "private/*",
16
+ ".noheroku",
17
+ '.travis.yml',
18
+ ]
19
+ p.development_dependencies = [ 'ric','echoe' ]
20
+ p.runtime_dependencies = [ 'ric' ]
21
+ end
@@ -0,0 +1,15 @@
1
+
2
+ desc "Run tests hypothetically"
3
+ task :default => :rictest
4
+
5
+ namespace :rictest do
6
+ desc "Run mini tests"
7
+ puts 'Rake test being executed...'
8
+ Dir['test/*.rb'].each do |file|
9
+ system "ruby #{file}"
10
+ end
11
+ Dir['test/*.sh'].each do |file|
12
+ system "#{file}"
13
+ end
14
+ end
15
+
@@ -0,0 +1,10 @@
1
+
2
+ #######################################################################
3
+ #palladius/sakura BEGIN
4
+ # Add me to ~/.bashrc, this is inside the `bashrc.inject`
5
+ export SAKURADIR=~/git/sakura/ # or whatever
6
+ if [ -f "$SAKURADIR/bashrc" ]; then
7
+ . "$SAKURADIR/bashrc"
8
+ fi
9
+ #/palladius/sakura END
10
+ #######################################################################
@@ -0,0 +1,5 @@
1
+ ‎* _██_*。*.*./ \ .˛* .˛.*.★* *★ 。*
2
+ ˛. (´• ̮•)*˛°*/.♫.♫\*˛.* ˛_Π_____. * ˛*
3
+ .°( . • . ) ˛°./• '♫ ' •\.˛*./______/~\*. ˛*.。˛* ˛. *。
4
+ *(...'•'.. ) *˛╬╬╬╬╬˛°.|田田 |門|╬╬╬╬ .
5
+ ¯˜"*°••°*"˜¯`´¯˜"*°••°*"˜¯` ´¯˜"*°´¯˜"*°••°*"˜¯`´¯˜"*°-
@@ -0,0 +1,10 @@
1
+ #!/bin/bash
2
+
3
+ # Requires:
4
+ # sudo gem install roodi
5
+ # PS. Dependency is in Gemfile
6
+
7
+ echo pwd: $(pwd)
8
+
9
+ roodi "./bin/*.rb"
10
+ roodi "./sbin/*.rb"
@@ -0,0 +1,3 @@
1
+
2
+ puts 'Test that shnould FAIL.. (exit 1)'
3
+ exit 1
@@ -0,0 +1,3 @@
1
+
2
+ puts 'testing a test, so maybe its a meta test. Should be: OK'
3
+ exit 0
@@ -0,0 +1,12 @@
1
+ #!/bin/bash
2
+
3
+ set -x
4
+
5
+ # TODO ruby-lint:
6
+
7
+
8
+ for RUBY_SCRIPT in $SAKURADIR/*bin/*.rb ; do
9
+ ruby -c $RUBY_SCRIPT || exit 1
10
+ done
11
+
12
+ exit 0
@@ -0,0 +1,437 @@
1
+ Quick Start
2
+ ===========
3
+
4
+ [Updated underscore.js to v1.3.1.](http://documentcloud.github.com/underscore/)
5
+
6
+ Jsawk is like awk, but for JSON. You work with an array of JSON objects
7
+ read from stdin, filter them using JavaScript to produce a results array
8
+ that is printed to stdout. You can use this as a filter to manipulate data
9
+ from a REST JSON web service, for example, in a shell script. Also, you can
10
+ suppress JSON output and use the built-in printing functions to translate
11
+ your JSON input to other formats and send that to stdout, to be piped to
12
+ other processes. You can load JavaScript libraries on the command line to
13
+ increase your processing power, and other things.
14
+
15
+ Setup
16
+ -----
17
+
18
+ [This is a great blog post on setup and basic use of jsawk and resty, thanks
19
+ to @johnattebury.](http://johnattebury.com/blog/2011/06/spidermonkey-jsawk-resty-on-snow-leopard/)
20
+
21
+ You need to have the `js` interpreter installed. On a Debian system you can
22
+ install it with the following command:
23
+
24
+ apt-get install spidermonkey-bin
25
+
26
+ Or you can [build it from source](http://www.mozilla.org/js/spidermonkey/).
27
+ Ready? Go.
28
+
29
+ Install
30
+ -------
31
+
32
+ First, get the jsawk script:
33
+
34
+ curl -L http://github.com/micha/jsawk/raw/master/jsawk > jsawk
35
+
36
+ Then make it executable and put it somewhere in your path:
37
+
38
+ chmod 755 jsawk && mv jsawk ~/bin/
39
+
40
+ Use
41
+ ---
42
+
43
+ Now you can do some stuff with JSON data. Here's an example using data from
44
+ a REST service that serves JSON (we use [resty](http://github.com/micha/resty)
45
+ to do the HTTP requests):
46
+
47
+ resty http://example.com:8080/data*.json
48
+ GET /people/47 | jsawk 'this.favoriteColor = "blue"' | PUT /people/47
49
+
50
+ This would do a `GET` request on the resource `/data/people/47.json`, which
51
+ would result in a JSON object. Then jsawk takes the JSON via stdin and for
52
+ each JSON object it runs the little snippet of JavaScript, setting the
53
+ `favoriteColor` property to `"blue"`, in this case. The modified JSON is then
54
+ output via stdout to `resty` again, which does the `PUT` request to update
55
+ the resource.
56
+
57
+ Usage
58
+ =====
59
+
60
+ jsawk [OPTIONS] [SCRIPT]
61
+
62
+ OPTIONS
63
+ -------
64
+
65
+ -h
66
+ Print short help page and exit.
67
+
68
+ -n
69
+ Suppress printing of JSON result set.
70
+
71
+ -q <query>
72
+ Filter JSON through the specified JSONQuery query. If multiple
73
+ '-q' options are specified then each query will be performed in
74
+ turn, in the order in which they appeared on the command line.
75
+
76
+ -v <name=value>
77
+ Set global variable `name` to `value` in the script environment.
78
+
79
+ -f <file>
80
+ Load and run the specified JavaScript file prior to processing
81
+ JSON. This option can be specified multiple times to load multiple
82
+ JavaScript libraries.
83
+
84
+ -b <script> | -a <script>
85
+ Run the specified snippet of JavaScript before (-b) or after (-a)
86
+ processing JSON input. The `this` object is set to the whole JSON
87
+ array or object. This is used to preprocess (-b) or postprocess
88
+ (-a) the JSON array before or after the main script is applied.
89
+ This option can be specified multiple times to define multiple
90
+ before/after scripts, which will be applied in the order they
91
+ appeared on the command line.
92
+
93
+ SCRIPT
94
+ ------
95
+
96
+ This is a snippet of JavaScript that will be run on each element
97
+ of the input array, if input is a JSON array, or on the object if
98
+ it's an object. For each iteration, the `this` object is set to the
99
+ current element.
100
+
101
+ Jsawk Scripting
102
+ ===============
103
+
104
+ Jsawk is intended to serve the purpose that is served by `awk` in the shell
105
+ environment, but instead of working with words and lines of text, it works
106
+ with JavaScript objects and arrays of objects.
107
+
108
+ In awk, a text file is split into an array of "records", each of which being
109
+ an array of "fields". The awk script that is specified on the command line is
110
+ run once for each record in the array, with the `$1`, `$2`, etc. variables
111
+ set to the various fields in the record. The awk script can set variables,
112
+ perform calculations, do various text-munging things, and print output. This
113
+ printing capablity makes awk into a filter, taking text input, transforming
114
+ it record by record, printing out the resulting modified records at the end.
115
+
116
+ Jsawk is similar, but in jsawk records are elements of the JSON input array
117
+ (if the input was a single object then there is a single record consisting
118
+ of that object). The jsawk script is run once for each record object, with
119
+ the `this` object set to the current record. So here the properties of the
120
+ record object are equivalent to the `$1`, `$2`, etc. in awk. The jsawk
121
+ script can then modify the record, perform calculations, do things. However,
122
+ instead of printing the modified record, the modified record is `return`ed.
123
+ At then end, if the `-n` option was not specified, the resulting array is
124
+ printed as JSON to stdout.
125
+
126
+ Jsawk JavaScript Environment
127
+ ----------------------------
128
+
129
+ Jsawk uses the Spidermonkey JavaScript interpreter, so you have access to all
130
+ of the Spidermonkey functions and whatnot. Additionally, the following
131
+ functions and properties are available from within a jsawk script:
132
+
133
+ PROPERTIES
134
+ ----------
135
+
136
+ window
137
+ The global object.
138
+
139
+ IS
140
+ The input set.
141
+
142
+ RS
143
+ The result set.
144
+
145
+ _ The underscore.js object.
146
+
147
+ $_
148
+ The current record index (corresponding to the index of the
149
+ element in the IS array).
150
+
151
+ $$
152
+ The current record object (global variable corresponding to the
153
+ `this` object in the script scope).
154
+
155
+ METHODS
156
+ -------
157
+
158
+ forEach(array, string)
159
+ Compiles 'string' into a function and iterates over the 'array',
160
+ running the function once for each element. The function has
161
+ access to the special variables 'index' and 'item' which are,
162
+ respectively, the array index and the array element. The 'this'
163
+ object is set to the array element each time the function runs.
164
+
165
+ params: Array array (array to iterate over)
166
+ String string (the function source)
167
+ return: void
168
+
169
+ get()
170
+ Get the next record from the input set. This will prevent jsawk
171
+ from iterating over that record.
172
+
173
+ params: void
174
+ return: Object|Array|Number|String (the next input record)
175
+
176
+ put(record)
177
+ Push 'record' onto the input set so that jsawk will iterate over
178
+ it next.
179
+
180
+ params: Object|Array|Number|String record (the record to push)
181
+ return: void
182
+
183
+ json(thing)
184
+ Serialize 'thing' to JSON string.
185
+
186
+ params: Object|Array|Number|String thing (what to serialize)
187
+ return: String (the resulting JSON string)
188
+
189
+ uniq(array)
190
+ Return array of distinct elements.
191
+
192
+ params: Array array (the input array)
193
+ return: Array (the resulting array of distinct elements)
194
+
195
+ Q(query, thing)
196
+ Runs the JSONQuery 'query' on the JSON input 'thing'.
197
+
198
+ params: String query (the JSONQuery)
199
+ Array|Object thing (the JSON input)
200
+ return: Array|Object (result of running the query)
201
+
202
+ err(thing)
203
+ Print arguments (JSON encoded, if necessary) to stderr.
204
+
205
+ params: Object|Array|Number|String thing (what to encode)
206
+ return: void
207
+
208
+ out(thing)
209
+ Print arguments (JSON encoded, if necessary) to stdout.
210
+
211
+ params: Object|Array|Number|String thing (what to encode)
212
+ return: void
213
+
214
+ Errors and Output
215
+ -----------------
216
+
217
+ Errors in parsing scripts, JSON queries, or JSON input, and errors executing
218
+ scripts will all result in the appropriate error message on stderr, and
219
+ immediate exit with a non-zero exit status. Normal output is written to
220
+ stdout, unless the `-n` option is specified. In that case only output from
221
+ the `out()` or `err()` functions and error messages will appear.
222
+
223
+ Exit Status
224
+ -----------
225
+
226
+ On successful completion jsawk returns an exit status of `0`. If an error
227
+ ocurred and execution was aborted, a non-zero exit status will be returned.
228
+
229
+ ### Exit Status
230
+
231
+ * **0** Successful completion.
232
+ * **1** Command line parsing error.
233
+ * **2** JSON parsing error.
234
+ * **3** Script error.
235
+ * **4** JSONQuery parsing error.
236
+ * **5** JSON stringify error.
237
+
238
+ JSONQuery
239
+ =========
240
+
241
+ Jsawk supports JSONQuery with the `-q` option. You can do almost anything
242
+ with JSONQuery that you can do with jsawk scripts, to include selecting
243
+ records, drilling down into records, mapping input sets to output sets as
244
+ a sort of filter, modifying the JSON, sorting, whathaveyou. JSONQuery is
245
+ to JSONPath is to JSON, as XQuery is to XPath is to XML. Here are some
246
+ JSONQuery resources to get started with this powerful tool:
247
+
248
+ * [The persevere JSONQuery documentation](http://docs.persvr.org/documentation/jsonquery)
249
+ * [Kris Zyp's intro to JSONQuery in dojo](http://www.sitepen.com/blog/2008/07/16/jsonquery-data-querying-beyond-jsonpath/)
250
+
251
+ Examples
252
+ ========
253
+
254
+ For the following examples, suppose there is a file `/tmp/t`, with the
255
+ following contents:
256
+
257
+ [
258
+ {
259
+ "first" : "trevor",
260
+ "last" : "wellington",
261
+ "from" : "england",
262
+ "age" : 52,
263
+ "sports" : [ "rugby", "badmitton", "snooker" ]
264
+ },
265
+ {
266
+ "first" : "yoni",
267
+ "last" : "halevi",
268
+ "from" : "israel",
269
+ "age" : 26,
270
+ "sports" : [ "soccer", "windsurfing" ]
271
+ },
272
+ {
273
+ "first" : "cory",
274
+ "last" : "parker",
275
+ "from" : "united states",
276
+ "age" : 31,
277
+ "sports" : [ "windsurfing", "baseball", "extreeeeme kayaking" ]
278
+ }
279
+ ]
280
+
281
+ This is going to be the input JSON text we will use in the examples.
282
+
283
+ JSON-to-JSON Transformations
284
+ ----------------------------
285
+
286
+ These examples transform the input JSON, modifying it and returning the
287
+ modified JSON as output on stdout to be piped elsewhere. Transformations of
288
+ this type are generally done with a script that follows one of these simple
289
+ patterns:
290
+
291
+ 1. Modify the `this` object in place (no `return` statement necessary).
292
+ 1. Create a replacement object for each record, and `return` it at the end
293
+ of each iteration.
294
+
295
+ These patterns leave the records in JSON format, and they are automatically
296
+ printed to stdout without the use of the `out()` function.
297
+
298
+ ### The Identity Mapping
299
+
300
+ This is the identity transformation: it doesn't really do anything other
301
+ than pass the input straight through.
302
+
303
+ cat /tmp/t | jsawk
304
+
305
+ You should get the input back out, unmolested.
306
+
307
+ ### Increment Everyone's Age
308
+
309
+ Looks like it's everyone's birthday today. We'll take the JSON input and
310
+ increment each object's `age` property, sending the resulting JSON output to
311
+ stdout.
312
+
313
+ cat /tmp/t | jsawk 'this.age++'
314
+
315
+ Notice that there is no need to write `return this` in the script. That is
316
+ assumed---the runtime does it for you automatically if you don't explicitly
317
+ call `return` yourself.
318
+
319
+ ### Flatten The "Sports" Array Of Each Element
320
+
321
+ Here we modify the input by replacing the `sports` property of each object
322
+ in the input array (the `sports` property is itself an array of strings) with
323
+ a single string containing all of the person's sports, separated by commas.
324
+
325
+ cat /tmp/t | jsawk 'this.sports = this.sports.join(",")'
326
+
327
+ Notice how altering the `this` object in place alters the result array
328
+ accordingly.
329
+
330
+ ### Extract Only The "Age" Property Of Each Element ###
331
+
332
+ Normally we would modify the input set in place, by manipulating the `this`
333
+ object, which would be returned by default after each iteration. However,
334
+ sometimes we want only a single field from the input set.
335
+
336
+ cat /tmp/t | jsawk 'return this.age'
337
+
338
+ Putting a return statement in the script expression causes the default
339
+ return of `this` to be short-circuited, replacing this element with the
340
+ return value in the output set.
341
+
342
+ ### JSON Grep: Select Certain Elements From Input ###
343
+
344
+ Sometimes you want to use awk to select certain records from the input set,
345
+ leaving the rest unchanged. This is like the `grep` pattern of operation. In
346
+ this example we will extract all the records corresponding to people who are
347
+ over 30 years old.
348
+
349
+ cat /tmp/t | jsawk 'if (this.age <= 30) return null'
350
+
351
+ This demonstrates how you can remove records from the results array by
352
+ returning a null value from your script.
353
+
354
+ Aggregate Functions
355
+ -------------------
356
+
357
+ Before and after scripts can be used to manipulate the JSON working set as
358
+ a whole, somewhat similar to the way aggregate functions like `SUM()` or
359
+ `COUNT()` work in SQL. These types of operations fall under a few basic
360
+ patterns.
361
+
362
+ 1. Use a before script (`-b` option) to do things to the JSON input before
363
+ transformations are done by the main script.
364
+ 2. Use an after script (`-a` option) to do things to the JSON result set
365
+ after all transformations are completed by the main script.
366
+
367
+ ### Count How Many Elements Are In The Input Array
368
+
369
+ Here we use an after script to modify the result set, like this:
370
+
371
+ cat /tmp/t | jsawk -a 'return this.length'
372
+
373
+ Notice how the entire results array is replaced by the single number and
374
+ printed to stdout.
375
+
376
+ ### Get a Sorted, Unique List of All Sports
377
+
378
+ This is an example of a JSON-to-JSON transformation that uses an after
379
+ script to manipulate the result set. It should produce an array of all
380
+ sports played by the people in the input set, sorted lexically, and with
381
+ all duplicate elements removed.
382
+
383
+ cat /tmp/t \
384
+ | jsawk 'RS=RS.concat(this.sports); return null' -a 'return uniq(RS).sort()'
385
+
386
+ Note the use of `return null` to prevent jsawk from adding the `this`
387
+ object to the result set automatically. Instead we manipulated the result
388
+ set explicitly, enabling each iteration to add more that one element to
389
+ it---the entire `sports` array. Also, notice the use of an after script
390
+ to sort the result set and remove duplicates.
391
+
392
+ JSON-to-Text Transformations
393
+ ----------------------------
394
+
395
+ In the following examples we will be manipulating the JSON input to
396
+ produce text output instead of JSON, for cases where you will be extracting
397
+ information from a JSON data source and piping it to non JSON-accepting
398
+ processes elsewhere.
399
+
400
+ It is frequently useful to supress the regular JSON output when doing
401
+ JSON-to-Text transformations like these, with the `-n` option.
402
+
403
+ ### Get A List Of All Sports
404
+
405
+ This one generates a list of all the sports that are played by the people
406
+ in our little JSON list, one per line, without duplicate entries, sorted
407
+ alphabetically.
408
+
409
+ cat /tmp/t \
410
+ | jsawk -a 'return this.join("\n")' 'return this.sports.join("\n")' \
411
+ | sort -u
412
+
413
+ Notice the use of JSONQuery to drill down into the JSON objects, an "after"
414
+ script to collate the results, and everything piped to the Unix `sort`
415
+ tool to remove duplicate entries and do the lexical ordering. This is
416
+ starting to show the power of the awk-like behavior now.
417
+
418
+ ### Return a Boolean Value
419
+
420
+ Sometimes you want to just check for a certain condition in a shell script.
421
+ Suppose you want to know if there are any people over the age of 50 in the
422
+ JSON input array, like this:
423
+
424
+ jsawk -n 'if (this.age > 50) quit(1)' < /tmp/t || echo "We have people over 50 here---naptime in effect."
425
+
426
+ We suppress normal result set output with `-n` and use the `quit()` function
427
+ to return a value in the exit status. The default exit status is, of course,
428
+ zero for success.
429
+
430
+ JSON Pretty-Printing
431
+ ====================
432
+
433
+ [Resty](http://github.com/micha/resty) includes the `pp` script that will
434
+ pretty-print JSON for you. You just need to install the JSON perl module
435
+ from CPAN. Use it like this:
436
+
437
+ GET /blogs.json | jsawk -q '..author' | pp