For git / iceberg first time users: Please read the tip and tricks booklet available on http://books.pharo.org
On Tue, Nov 14, 2017 at 5:45 PM, Aliaksei Syrel <alex.sy...@gmail.com> wrote: > Hi Offray, > > I understand your frustration, but with all respect, the fact that you have > problems with Iceberg does not mean that GT Documenter or any other GT tool > is responsible for described problems. > > Most complains about bloc, brick, whatever is because of unrelated stuff. It > is a little bit disappointing. Especially for me, as one of the maintainers. > But it is ok, I got used to it :) > > I don’t remember when last time I used stable Pharo (not because it does not > exist), simply live on the edge since Pharo4. If no one will use Git and > report problems Iceberg will never progress. If no one will use Bloc it will > never get “there”. Unfortunately, living on the edge is dangerous, requires > effort, motivation and time. > > The script that Doru provided works flawlessly on OSX, we load it almost > everyday. !! Bloc is tested on CI and builds are green on Windows, Linux and > OSX !!. If computer (CI) manages to install it, I am pretty sure human can > do it too. Looks like there is something missing in your configuration, > something tiny :) Error handling in Iceberg can be definitely improved, but > it is a different story. > > P.S. Documenter can be installed without enabled Iceberg integration. This > is how CI does it. You will just not be able to contribute. > > Cheers, > Alex > > On Tue, 14 Nov 2017 at 16:37, Offray Vladimir Luna Cárdenas > <offray.l...@mutabit.com> wrote: >> >> I have been just trying to install GT Documenter and is really frustrating >> (I have been unable to install it even for the first time!). >> >> This was the list of errors I got and steps I followed, in almost >> sequential order, just to get a (bittersweet!) taste of GT Documenter: >> >> 1st: LGit_GIT_ERROR: No ssh-agent suitable credentials found. So I go to >> GitHub, follow the five pages of documentation to get my SSH credentials >> that start at [1], then, because I still get the same error, go to the >> Iceberg FAQ [2], try to surpass the erro,r via command line and doesn't >> work, so I go to the Iceberg settings and try the manual configuration, >> going to the next item >> >> [1] >> https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#generating-a-new-ssh-key >> [2] https://github.com/pharo-vcs/iceberg/blob/master/README.md >> >> Now I get "Instance of LGitCredentialsSSH class did not understand >> #ifTrue:ifFalse:". I try to make sense of it in the debugger, but is >> something I cannot. Anyway, I rerun it and now I get: LGit_GIT_EEXISTS: >> '/home/offray/Programas/Pharo/6.1a/Dev24/pharo-local/iceberg/feenkcom/gtoolkit' >> exists and is not an empty directory. I delete that directory and try an >> installation... again >> Now I get: "Instance of FileReference did not understand #notEmpty". I try >> to make sense of it in the debugger. My user is git, my public and private >> ssh keys are not empty. Despite of not making sense of all I understand that >> is trying to clone something at g...@github.com:feenkcom/gtoolkit.git. I go >> to my image dir and then to `iceberg/feenkcom/gtoolkit/`. There is a git >> repository there, but is empty. >> Now I wonder, maybe if I can just clone the directory there, but how I say >> Iceberg to load it? So I run now only the Metacello part. Same error and >> solution that the last time but now for gtoolkit-visualizer, Brick, >> gtoolkit-examples, Bloc and Sparta. >> After getting my ssh keys, overcome config problems in shell and the Pharo >> settings, chasing these errors and solving them by cloning the repositories >> manually, I'm, a couple of hours later, ready to test GT Documenter, but >> with the last Iceberg's duplicated repository message about Sparta I give >> up. Is not nice to start your day accumulating frustration... that sets a >> bad mood for the rest of it, and you need to actively fight against. >> >> I have thought that Git is overcomplicated for most of the developers' >> tasks and communities. I don't know if the root of previous issues is in the >> "Iceberg enableMetacelloIntegration: true" line, but having to get your pair >> of keys working to just install software is overkill for the common user >> (and when LibGit errors are present, the documented solutions don't work >> seamlessly). Maybe a more sensitive solution would be just to use libgit, >> without any ssh auth to clone repositories and its prerequisites or even >> better, some download that goes to the files in the tip (or other) version >> without all this overhead. >> >> Anyway, as I said, I have been unable to test GT Documenter properly and >> getting feedback over GT Tools from the team usually requires a lot of >> effort in my case (insisting on getting answers or getting none). And that >> is just to test a promising tech that still doesn't offer saving features >> (just and awesome preview). I think that a more sensible approach for a good >> documentation toolkit for now is on Spec and creating custom syntax >> highlighters with SmaCC[3], that is well documented and works today. >> >> [3] >> https://medium.com/@juliendelplanque/hacking-a-simple-syntactic-highlighter-around-specs-textmodel-44ba2e2b1ab9 >> >> I understand that community is trying its best, but expressing how current >> offerings are not mature and constructive criticism can help on that. At the >> moment my feeling is that if you want to try the new shinny alpha stuff from >> GT Documenter, you will need to be prepared for a lot of frustration and >> silence. >> >> Cheers, >> >> Offray >> >> >> On 10/11/17 12:41, Tudor Girba wrote: >> >> Hi, >> >> As shown at ESUG, GT Documenter offers an advanced viewer (and editor) for >> Pillar working on top of Bloc. >> >> You can get it by loading: >> >> Iceberg enableMetacelloIntegration: true. >> Metacello new >> baseline: 'GToolkit'; >> repository: 'github://feenkcom/gtoolkit/src'; >> load. >> >> For example, you can then inspect: >> 'PATH_TO_ICEBERG/feenkcom/gtoolkit/doc/transcript/index.pillar’ >> asFileReference >> >> Cheers, >> Doru >> >> >> On Nov 10, 2017, at 12:58 PM, H. Hirzel <hannes.hir...@gmail.com> wrote: >> >> A note: >> >> Tudor Girba wrote: >> <tu...@tudorgirba.com> Fri, Aug 25, 2017 at 1:31 PM >> Reply-To: Any question about pharo is welcome >> <pharo-users@lists.pharo.org> >> To: Any question about pharo is welcome <pharo-users@lists.pharo.org> >> >> Hi, >> >> As mentioned in an announcement about 10 days ago, we are building a >> Pillar editor with inline viewing abilities in Bloc. Here is how it >> looked like. Please note the embedded picture. We continued working on >> it since then and we will probably announce the next version this >> weekend: >> >> >> Maybe there is now enough progress to do simple presentations in Bloc? >> >> >> On 11/10/17, H. Hirzel <hannes.hir...@gmail.com> wrote: >> >> Hello >> >> In the thread 'including Pillar in Pharo image by default' it was >> suggested by Stephane Ducasse to include a subset of Pillar in the >> Pharo image[1] . >> >> I'd like to extend that proposal a little bit it in order to do very >> simple presentations. This should allow to describe at least part of >> the slides used in the MOOC course [3]. >> >> This will be _a possible_ solution to the question brought up in the >> thread 'Writing "powerpoint" like presentations in Pharo?'. >> >> Another use is to write instructions with executable content within >> the image ("Assistants"). >> >> So below is the a proposal for a Pillar syntax _subset_ for class >> comments and _simple_ presentations. >> The numbering scheme follows the 'Pillar syntax cheat sheet' [2] >> >> >> >> >> MINI PILLAR SYNTAX (a subset of Pillar) >> >> 1. Headers >> >> !Header 1 >> !!Header 2 >> !!!Header 3 >> >> >> 2. Lists >> >> - Unordered List >> # Ordered list >> >> >> >> 5. Emphasis >> >> ""bold"" >> >> >> 6. Code blocks >> >> [[[ >> Transcript show: 'Hello World'. >> \]]] >> >> >> 9. Annotation >> >> ${slide:title=About Pharo}$ >> >> >> >> >> Next week I plan to implement the rendering of this 'Mini Pillar' in >> Morphic using the Morphic API subset that works in Pharo and Squeak. >> >> A renderer using Bloc would also be nice. [4] >> >> Comments, suggestions, code snippets and other help is welcome. >> >> Regards >> Hannes >> >> >> >> >> >> -------------------------------------------------------------------------------------------------- >> [1] Pillar subset for class comments >> >> Stephane Ducasse >> <stepharo.s...@gmail.com> Fri, Aug 11, 2017 at 7:09 PM >> To: Any question about pharo is welcome <pharo-users@lists.pharo.org> >> >> Tx cyril >> >> For class comment I image that we want >> >> ! >> >> - >> - >> *url* >> and bold >> [[[ >> >> ]]] >> >> Did I miss something. >> >> Stef >> >> >> >> >> >> >> -------------------------------------------------------------------------------------------------- >> [2] >> http://pillarhub.pharocloud.com/hub/pillarhub/pillarcheatsheet >> >> -------------------------------------------------------------------------------------------------- >> >> >> 1. Headers >> >> !Header 1 >> !!Header 2 >> !!!Header 3 >> !!!!Header 4 >> !!!!!Header 5 >> !!!!!!Header 6 >> >> 2. Lists >> >> - Unordered List >> # Ordered list >> >> 3. Table >> >> |! Left |! Right |! Centered >> |{Left |}Right| Centered >> >> >> 4. Description >> Note >> on a new line >> >> ;head >> :item >> >> >> 5. Emphasis >> >> ""bold"" >> ''italic'' >> --strikethrough-- >> __underscore__ >> ==inline code== >> @@subscript@@ >> ^^sub-script^^ >> >> 6. Code blocks >> >> [[[label=helloScript|caption=How to print Hello >> World|language=Smalltalk >> Transcript show: 'Hello World'. >> \]]] >> >> >> 7. Raw >> >> >> {{{latex: >> this is how you inject raw \LaTeX in your output file >> }}} >> >> {{{markdown: >> this is how you inject raw `markdown` in your output file >> }}} >> >> {{{html: >> this is how you inject raw <b>html</b> in your output file >> }}} >> >> >> 8. Links >> >> Anchor @anchor (new line) >> Internal link *anchor* >> External link *Google>http://google.com* >> Image +Caption>file://image.png|width=50|label=label+ >> >> >> 9. Annotation >> Note >> on a new line >> >> Annotation @@note this is a note >> Todo item @@todo this is to do >> >> >> 10. Comments >> >> % each line starting with % is commented >> >> >> 11. References >> >> This document is copied from >> http://www.cheatography.com/benjaminvanryseghem/cheat-sheets/pillar/ >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> ---------------------------------------------------------------------- >> [3] Example pillar code for slides >> ---------------------------------------------------------------------- >> >> >> https://github.com/SquareBracketAssociates/PharoMooc/blob/master/Slides/1-Templates/SlideExample.pillar >> >> { >> "title":"To the Roots of Objects", >> "subtitle":"Learning from beauty", >> "author":"Stephane Ducasse", >> "complement":"http://stephane.ducasse.free.fr/ \\\\ >> stephane.duca...@inria.fr" >> } >> >> >> ${toc:depthLevel=2|level=0|highlight=0}$ >> >> %Les sections ne sont pas des titres de slide mais définnissent la >> structure du doucment. Il est possible de rajouter >> "renderStructureAsSlide":false dans pillar.conf pour ne pas créer de >> slide à partir d'un titre. >> >> >> ${slide:title=License}$ >> >> +>file://figures/CreativeCommons.png|width=50|label=figCreativeCommons+ >> >> >> ! Introduction >> >> % >> ${toc:depthLevel=1|level=0|highlight=1}$ >> >> >> ${slide:title=Really?!|label=really}$ >> >> ${columns}$ >> >> ${column:width=50}$ >> >> %the width parameter take an Int between 1 and 100 >> %For now we have to pass a line before and after an annotation, I'll >> correct that soon in Pillar. >> - No primitive types >> - No hardcoded constructs for conditional >> - Only messages >> - Only objects >> >> ${column:width=50}$ >> >> - and this works? >> - I mean really? >> - Not even slow? >> - Can't be real! >> >> ${endColumns}$ >> >> ${slide:title=Motto}$ >> >> - Let's open our eyes, look, understand, and deeply understand the >> underlying design aspects of object-oriented programming. >> >> >> *@really* >> >> *TEST !>@really* >> >> ${slide:title=Booleans}$ >> >> [[[language=smalltalk >> 3 > 0 >> ifTrue: ['positive'] >> ifFalse: ['negative'] >> -> 'positive' >> ]]] >> >> ${slide:title=Yes ifTrue\:ifFalse\: is a message!}$ >> >> [[[language=smalltalk >> Weather isRaining >> ifTrue: [self takeMyUmbrella] >> ifFalse: [self takeMySunglasses] >> ]]] >> >> - Conceptually ==ifTrue:ifFalse:== is a message sent to an object: a >> boolean! >> - ==ifTrue:ifFalse:== is in fact radically optimized by the compiler >> but you can implement another one such ==siAlors:sinon:== and check. >> >> ${slide:title=Booleans}$ >> >> In Pharo booleans have nothing special >> - & | not >> - or: and: (lazy) >> - xor: >> - ifTrue:ifFalse: >> - ifFalse:ifTrue: >> - ... >> >> ${slide:title=Lazy Logical Operators}$ >> >> *LINK>@frm:really* >> >> [[[language=smalltalk >> false and: [1 error: 'crazy'] >> -> false and not an error >> ]]] >> >> ! Exercices >> ${toc:depthLevel=1|level=0|highlight=1}$ >> >> !! Exercise 1: Implement not >> >> ${slide:title=Exercise 1\: Implement not}$ >> >> - Propose an implementation of not in a world where you do not have >> Booleans. >> - You only have objects and messages. >> [[[language=smalltalk >> false not >> -> true >> >> true not >> -> false >> ]]] >> >> !!Exercise 2: Implement | (Or) ifTrue: ifFalse: >> >> ${toc:depthLevel=2|level=0|highlight=1}$ >> >> ${slide:title=Exercise 2\: Implement \| (Or)}$ >> >> - Propose an implementation of or in a world where you do not have >> Booleans. >> - You only have objects and messages. >> >> [[[language=smalltalk >> true | true -> true >> true | false -> true >> true | anything -> true >> >> false | true -> true >> false | false -> false >> false | anything -> anything >> ]]] >> >> ${slide:title=Exercise2\: Variation - Implement ifTrue\:ifFalse\:}$ >> >> - Propose an implementation of not in a world where you do not have >> Booleans. >> - You only have objects, messages and closures. >> >> [[[language=smalltalk >> false ifTrue: [ 3 ] ifFalse: [ 5 ] >> -> 5 >> true ifTrue: [ 3 ] ifFalse: [ 5 ] >> -> 3 >> ]]] >> >> ! Boolean Implementation >> >> ${toc:depthLevel=1|level=0|highlight=1}$ >> >> ${slide:title=Booleans Implementation Hint One}$ >> >> - The solution does not use conditionals >> - else we would obtain a recursive definition of ==ifTrue:ifFalse:== >> >> ${slide:title=Boolean Implementation Hint Two}$ >> >> - The solution uses three classes: ==Boolean==, ==True== and ==False== >> - ==false== and ==true== are unique instances described by their own >> classes >> - ==false== is an instance of the class ==False== >> - ==true== is an instance of the class ==True== >> >> +Boolean >> Hierarchy>file://figures/BooleanHiearchyAndInstances.png|width=50+ >> >> ${slide:title=How do we express choice in OOP?}$ >> >> - We send messages to objects >> >> [[[language=smalltalk >> aButton color >> -> Color red >> >> aPane color >> -> Color blue >> >> aWindow color >> -> Color grey >> ]]] >> >> - Let's the receiver decide >> >> - Do not ask, tell >> >> ${slide:title=Boolean not implementation}$ >> >> - Class ==Boolean== is an abstract class that implements behavior >> common to true and false. Its subclasses are ==True== and ==False==. >> Subclasses must implement methods for logical operations ==&==, >> ==not==, and controls ==and:==, ==or:==, ==ifTrue:==, ==ifFalse:==, >> ==ifTrue:ifFalse:==, ==ifFalse:ifTrue:== >> >> [[[language=smalltalk >> Boolean>>not >> "Negation. Answer true if the receiver is false, answer false if the >> receiver is true." >> self subclassResponsibility >> ]]] >> >> ${slide:title=Not implementation in two methods}$ >> >> [[[language=smalltalk >> False>>not >> "Negation -- answer true since the receiver is false." >> ^ true >> ]]] >> >> [[[language=smalltalk >> True>>not >> "Negation--answer false since the receiver is true." >> ^ false >> ]]] >> >> ${slide:title=Not implementation in two methods}$ >> >> +Not >> >> implementation.>file://figures/BooleanHiearchyAndInstancesWithNotMethods.png|width=80+ >> >> ${slide:title=\| (Or)}$ >> [[[language=smalltalk >> >> true | true -> true >> true | false -> true >> true | anything -> true >> >> false | true -> true >> false | false -> false >> false | anything -> anything >> >> ]]] >> >> ${slide:title=Boolean>> \| aBoolean}$ >> >> [[[language=smalltalk >> Boolean>> | aBoolean >> "Evaluating disjunction (OR). Evaluate the argument. Answer >> true if >> either the receiver or the argument is >> true." >> self subclassResponsibility >> ]]] >> >> ${slide:title=False>> \| aBoolean}$ >> >> [[[language=smalltalk >> false | true -> true >> false | false -> false >> false | anything -> anything >> ]]] >> >> [[[language=smalltalk >> False >> | aBoolean >> "Evaluating disjunction (OR) -- answer with the argument, aBoolean." >> ^ aBoolean >> ]]] >> >> ${slide:title=True>> \| aBoolean}$ >> >> [[[language=smalltalk >> true | true -> true >> true | false -> true >> true | anything -> true >> ]]] >> >> [[[language=smalltalk >> True>> | aBoolean >> "Evaluating disjunction (OR) -- answer true since the receiver is true." >> ^ self >> ]]] >> >> ${slide:title=Or implementation in two methods}$ >> >> +>file://figures/BooleanHiearchyAndInstancesWithOrMethods.png|width=80+ >> >> ${slide:title=Implementing ifTrue\:ifFalse\:}$ >> >> - Do you see the pattern? >> - Remember that a closure freezes execution and that value launches >> the execution of a frozen code. >> >> [[[language=smalltalk >> True>>ifTrue: aTrueBlock ifFalse: aFalseBlock >> ^ aTrueBlock value >> ]]] >> >> [[[language=smalltalk >> False>>ifTrue: aTrueBlock ifFalse: aFalseBlock >> ^ aFalseBlock value >> ]]] >> >> ${slide:title=Implementation Note}$ >> >> - Note that the Virtual Machine shortcuts calls to boolean such as >> condition for speed reason. >> - But you can implement your own conditional method and debug to see >> that sending a message is dispatching to the right object. >> >> ! So what ? >> >> ${toc:depthLevel=1|level=0|highlight=1}$ >> >> ${slide:title=Ok so what?}$ >> >> - You will probably not implement another Boolean classes >> - So is it really that totally useless? >> >> >> ${slide:title=Message sends act as case statements}$ >> >> - The execution engine will select the right method in the class of the >> receiver >> - The case statements is dynamic in the sense that it depends on the >> classes loaded and the objects to which the message is sent. >> - Each time you send a message, the system will select the method >> corresponding to the receiver. >> >> >> ${slide:title=A Class Hierarchy is a Skeleton for Dynamic Dispatch}$ >> >> - If we would have said that the ==Boolean== would be composed of only >> one class, we could not have use dynamic binding. >> - A class hierarchy is the exoskeleton for dynamic binding >> >> - Compare the solution with one class vs. a hierarchy. >> >> +One single class vs. a nice >> hierarchy.>file://figures/Design-FatVsDispatch.png|width=70+ >> >> - The hierarchy provides a way to specialize behavior. >> - It is also more declarative in the sense that you only focus on one >> class. >> - It is more modular in the sense that you can package different >> classes in different packages. >> >> ${slide:title=Avoid Conditionals}$ >> >> - Use objects and messages, when you can >> - The execution engine acts as a conditional switch: Use it! >> - Check the AntiIfCampaign. >> >> ${slide:title=Follow-up: Implement ternary logic}$ >> >> - Boolean: ==true==, ==false==, ==unknown== >> +Ternaru Logic decision table >> >> file://figures/ArrayBoolean.png|width=30|label=fig:ternLogic+ >> >> - Implementing in your own classes. >> >> ! Summary >> >> ${toc:depthLevel=1|level=0|highlight=1}$ >> >> ${slide:title=Summary}$ >> - Tell, do not ask >> - Let the receiver decide >> - Message sends as potential dynamic conditional >> - Class hiearchy builds a skeleton for dynamic dispatch >> - Avoid conditional >> >> >> >> >> ----------------------------------------- >> [4] Bloc >> Load Bloc with executing in a playground (Pharo 6.1) >> >> Metacello new >> baseline: 'Bloc'; >> repository: 'github://pharo-graphics/Bloc:pharo6.1/src'; >> load: #core >> >> >> A tutorial to use bloc is available on >> http://files.pharo.org/books/ >> Bloc Memory Game (alpha) is a first tutorial on Bloc the new graphics >> core for Pharo. Booklet written by A. Chis, S. Ducasse, A. Syrel. >> >> http://files.pharo.org/books-pdfs/booklet-Bloc/2017-11-09-memorygame.pdf >> >> To load the memory game >> >> Metacello new >> baseline: 'BlocTutorials'; >> repository: 'github://pharo-graphics/Tutorials/src'; >> load >> >> >> A similar booklet could be done for the title >> 'Doing a presentation / slide show / assitant with Bloc' (or similar, >> adapt .....) >> >> -- >> www.tudorgirba.com >> www.feenk.com >> >> "Obvious things are difficult to teach." >> >> >> >> >> >> >> > -- > Cheers, > Alex