39 Replies Latest reply: Nov 17, 2009 9:21 AM by jrutski RSS

Solarwinds NPM custom website--ideas

Hi everyone,

I was wondering if someone can provide any suggestions and ideas.  I am trying to make the NPM website a portal for all our IT related stuff (ie. NPM, url links, documents, etc).  So far i have the basics (maps and default views). 

how customizable is the website
Ideas on how to leverage the website to make it an "it web portal"
custom maps, diagrams, etc
any ideas/creativity in general would be great.
integration/scripting with other programs.

I think it would be a great idea if we could create a subform to share our creativity, ideas and how we leveraged solarwinds NPM in general. 

Thanks.
 
  • Re: Solarwinds NPM custom website--ideas
    I second that idea!

    I would love a "tweak and customization" subforum

    Lars Grabowski
    Global Infrastructure
    Chr. Hansen A/S

    Currently using:
    Cirrus Version 2.1 DL-500 Feb. 2006 (8.1.42)
    Orion Application Monitor 7.8.94
    Orion Web Engine Version 7.8.133
    Orion NPM SLX 7.8.5 March 2006
    Alert Manager 8.1.15
  • Re: Solarwinds NPM custom website--ideas
    Eric E
    I couldn't agree more.

    I've made some custom changes and wouldn't mind sharing them at all.
  • Re: Solarwinds NPM custom website--ideas
    jtimes
    Very easy:  as Admin go to Costumize Views, select Create.  Click the + sign to add.  Under Miscellaneous check User Defined Links for web links or Custom HTML or Text for Text.  Just don't get all the way done without 1. Previewing it 2. saving it as a new name...  Then you will have to add your new veiw to the menu bar.


    John J. Times
  • Re: Solarwinds NPM custom website--ideas
    Absolutely a great idea! Hopefully they will take this request into consideration and setup a place to exchange ideas.
  • Re: Solarwinds NPM custom website--ideas
    Hi all,

    I agree wholeheartedly.  Since we first purchased Orion, back in the days of version 6, we have been making little tweaks to the software.  Right we have the following:

    Custom HTML code on the overview page to display several key items from our corporate portal in addition to links to other IT resources.

    Custom properties with various macro entries (NodeName, IPAddress, etc..).  These allow us to link to configurations grabbed with Kiwi Cat Tools, HTML port maps from SolarWinds toolset, and netflow information from Netflow Analyzer.

    We have also built a list of custom resources to provide system uptime information (current) and to deal with some of the limitations in previous versions of Orion (previous to 7.2 - links to RDP, telnet, web, along with nested tree views of devices).

    This is a great idea.
  • Re: Solarwinds NPM custom website--ideas
    Isaac,

    I'd love to hear how you integrated Netflow, HTML port maps from the toolset and so on.

    Is it possible for you to share the code and the elements you are using?

    Lars Grabowski
    Global Infrastructure
    Chr. Hansen A/S

    Currently using:
    Cirrus Version 2.1 DL-500 Feb. 2006 (8.1.42)
    Orion Application Monitor 7.8.94
    Orion Web Engine Version 7.8.133
    Orion NPM SLX 7.8.5 March 2006
    Alert Manager 8.1.15
  • Re: Solarwinds NPM custom website--ideas
    Eric E
    Here is a custom page I wrote not to long ago. I'm going to be re-coding it soon though.

    This is a Dell PowerConnect switch but I'm sure with a little modifications it will work with other vendor's.

    Basically this page allows our support staff to turn ports on/off and save the running config to the startup config.

  • Re: Solarwinds NPM custom website--ideas
    Mithrilhall, Im curious to know how you created that page. Im interested in doing something very familiar. Let me know, bripage19@yahoo.com.

    Thanks!
  • Re: Solarwinds NPM custom website--ideas
    Eric E
    I'll send you an email soon with the code.
  • Re: Solarwinds NPM custom website--ideas
    Mithrilhall,

    We too would be interested in the Code behind this feature.  We have several needs for this which would help our Support Personnel with serving the customer vice Escalating and keeping the customer on Hold.

    In advance, we appreciate your assistance.

    Thanks,

    R. Troy Klein
  • Re: Solarwinds NPM custom website--ideas
    Eric E

    Code Removed

  • Re: Solarwinds NPM custom website--ideas
    Eric E
    Here is the 'db_connection2.php' page:

    
    <?php
    
         $myServer = "127.0.0.1";
    
         $myUser   = "xxxxx";
    
         $myPass   = "xxxxx";
    
         $myDB     = "NetPerfMon";
    
         $myTable  = "Interfaces";
    
         if (isset($_GET['NID']))
    
         {
    
              $NID = $_GET['NID'];
    
         }
    
         else
    
         {
    
              $NID = 0;
    
         }
    
         
    
         $s = @mssql_connect($myServer, $myUser, $myPass)
    
         or die("Couldn't connect to SQL Server on $myServer ");
    
         
    
         $msdb=mssql_select_db($myDB,$s);
    
         $msquery = "select Nodes.NodeID, Nodes.IP_Address, Nodes.Community, Nodes.Caption, Nodes.SysObjectID, Nodes.PWord, Interfaces.InterfaceAlias, Interfaces.InterfaceIndex FROM Nodes INNER JOIN Interfaces ON Nodes.NodeID = Interfaces.NodeID WHERE Nodes.NodeID = " . $NID;
    
         $msresults = mssql_query($msquery);
    
         
    
         /* while ($row = mssql_fetch_array($msresults))
    
         {
    
              echo($row[5] . "\n");
    
         } */
    
    ?>
    
    


    You can ignore the 'PWord'. It's a custom field I added to the database.
  • Re: Solarwinds NPM custom website--ideas
    jonchill
    Mithrilhall

    I would also be interested in seeing your code for this custom page, as it would give me a strting point on further customisation?

    E-mail me @ jonathanchill@tiscali.co.uk

    Thanks in advance

    Jon

    IT Infrastructure Manager
    Pilgrim Hospital
    UK
  • Re: Solarwinds NPM custom website--ideas
    quote:Originally posted by Mithrilhall

    I'll send you an email soon with the code.


    I would be interested also.

    thnx in advance
    dana.turnerATubtDOTcom
  • Re: Solarwinds NPM custom website--ideas
    Eric E
    The code was posted a few threads up.

    If you still want the code via email just let me know.
  • Re: Solarwinds NPM custom website--ideas
    Mithrilhall,

    Thanks a lot for the code! But, what is it that save.php does?
  • Re: Solarwinds NPM custom website--ideas
    Eric E
    save.php is just a page that opens a telnet connection to the device and issues a copy run start command to save the configuration.

    I'm going to rewrite save.php to use snmp rather than a telnet connection, which should speed things up.
  • Re: Solarwinds NPM custom website--ideas
    Eric E
    This is what I'm currently working on.

    I don't think I'll be able to do the actual mouseover on the hyperlink shown. I think I'll have to create a custom link and do the mouseover on that instead.


  • Re: Solarwinds NPM custom website--ideas
    Mithrilhall,

    You can just copy the resource file for Current Percent Util [32-InterfaceUtilization.Resource] to a new file and tweak the code.  That way you can get the mouseover to be whatever you want.  You could theoretically point the mouseover to the daily graph of the interface.  A code sample is below:

    <script language="javascript"><!--
    
    
    
         var sTitle = "1. Click to Select \r2. Click - Direction | Documentation | Drawings | Tools";
    
         
    
         function showTitle(eSrc) {
    
             eSrc.title=sTitle;
    
             return;
    
        }
    
         
    
    -->
    
    </script> 
    
     
    
         <table ID="topic1" class="flyoutMenu" border="0" width="144" cellspacing="0" cellpadding="2" bordercolor="#C0C0C0">
    
    
    
            <tr>
    
              <td width="100%"> <a onClick="javascript:menuSet('lanwan','topic1');" onMouseOver="javascript:showTitle(this);" class="topicLink">LAN & WAN</a></td>


    The javascript showTitle, with a bit of modification, should allow the display of a jpg which would allow the chart to be displayed.

    I am going to spend a little time working on this and will let you know how it turns out.
  • Re: Solarwinds NPM custom website--ideas
    Grabowski,

    We used a combination of the resource for displaying custom properties and crafty text inside custom property fields in the database to integrate many of our outside products:

    Custom Property field data (each entry has its own custom property)
    HTML Port Map from switch port mapper [HTTP_portmap]:
    <a target=_blank href=/toolset/portmap/${IP_Address}.htm>Switch Port Map</a>


    Cisco Configurations (Generated with Kiwi CatTools - text files) [Cisco_Config]:
    <a target=_blank href=/Configs/${Location_Code}/Config.Current.Running.${Caption}.txt>Running Config</a>
    - NOTE: Location_Code is another of our custom properties.

    Network Appliance and several other one off Device Monitor Page [HTTP_Monitor]:
    <a target=_blank href=http://${IP_Address}/na_admin/ataglance.html>Filer At-A-Glance</a>
    - NOTE: We change this depending on the device's individual link info.

    This process has several benefits:
    1. It requires almost no coding know how.
    2. The links only show up on the Orion web site if a value has been entered in the custom property field for the device.
    3. You have a nearly infinite number of devices and URL paths that you can support all with the built in macro expander for field names in the database.

    As an added bonus, here is the code for the system uptime resource:
    (I don't remember if I built this or took it from another forum entry so I am taking credit for now.)
    
    <!-- Title=Up Time-->
    
    <!--#include Virtual=/NetPerfMon/scripts/Resource.asp -->
    
    
    
    <table width="100%" border="0" cellpadding="8" cellspacing="0">
    
    <tr class="ViewHeader">
    
    <td align="left" nowrap ><B>Up Time</b><td>
    
    <% If Node Is Nothing Then %>
    
    <td><font color="red" sizez="2"><b>A Network Node was not Selected</b></font></td>
    
    <% Else 
    
         
    
         Set SQLResource = NetPerfMon.NewSQLResource
    
         SQLResource.SQL="SELECT DateDiff(Second,Nodes.LastBoot,GetDate()) AS SecondsUptime FROM Nodes WHERE NodeID=" & Node.NodeID
    
         SQLResource.Execute
    
         Seconds = SQLResource.GetProperty("SecondsUptime")
    
         Days = Seconds/86400
    
         Hours = (Days - Int(Days)) * 24
    
         Minutes = (Hours - Int(Hours)) * 60
    
         Seconds = (Minutes - Int(Minutes)) * 60 
    
    
    
         Days = Int(Days)
    
         Hours = Int(Hours)
    
         Minutes = Int(Minutes)
    
         Seconds = Int(Seconds)
    
         
    
    %>
    
    <td><%=Days%> Days, <%=Hours%> Hours, <%=Minutes%> Minutes, <%=Seconds%> Seconds</td>
    
    <% End If %>
    
    </tr>
    
    </table>
    
    <br>
    
    


    Save the text above in a file called 00-NodeUpTime.Resource and place it in this directory:
    X:\inetpub\SolarWinds\NetPerfMon\Resources\2-1-NodeDetails
    Be fantastic
  • Re: Solarwinds NPM custom website--ideas
    Eric E
    Isaac...nice UpTime addition and it works great.
  • Re: Solarwinds NPM custom website--ideas
    gbrance
    Very cool uptime edition also.  It works great. Thanks-GB
  • Re: Solarwinds NPM custom website--ideas
    This ones for Mithrilhall,

    We use this resource for interface data in our default node view 33-InterfaceTraffic.Resource (I think this is the default.

    If one were to edit the file by adding the following after the last
    </tr>
    one could have any of the charts display below the interface line:

    <tr>
    
         <td colspan="7"><img src="/NetPerfMon/Chart.asp?Chart=TotalBytes&NetObject=I:<%=SQLResource.GetProperty("InterfaceID")%>&Period=Today&SampleSize=30M&FontSize=&Width=500&Height=0" border="0">
    
            </td>
    
    </tr>


    In the case above I display the TotalBytes chart (Total xmit and receive bytes) for each interface.

    If you edit this further by making the default display for the image or the entire table cell
    <td>
    hidden within the style sheet you would be in business.  All you would have to do is write a snippet of code to change the display to show when you mouse over the interface description.

    If you don't follow let me know.

    Be fantastic.
  • Re: Solarwinds NPM custom website--ideas
    Eric E
    Thanks Isaac...I'll give it a shot and post back the code.
  • Re: Solarwinds NPM custom website--ideas
    I have used the overlib script (http://www.bosrup.com/web/overlib/) to add mouse over pop-ups.
    Using this code
    onmouseover="overlib('<img src=/NetPerfMon/Chart.asp?Chart=MMAVGBPS&NetObject=I:<%=SQLResource.GetProperty("InterfaceID")%>&Period=Today&SampleSize=30M&FontSize=&Width=500&Height=0
    
     border=0>', CAPTION, 'Chart', FGCOLOR, '#999999', BGCOLOR, '#333333', BORDER, 4, CAPTIONFONT, 'Garamond', TEXTFONT, 'Courier', TEXTSIZE, 3, ABOVE, LEFT, STICKY)" 
    I get a pop-up simalar to this one
  • Re: Solarwinds NPM custom website--ideas
    This looks very interesting tome, where did you add this script to make this work.  I am very new to orion.
  • Re: Solarwinds NPM custom website--ideas
    Just unzip the overlib scripts to the /netperfmon/scripts folder.
    Under /netperfmon/resources/ you can pick the file you want to modify.
    Here is the 33-Top10Traffic.Resource file. I have highlighed the code I added in red.
    <!-- Title=Top 10 Interfaces by Traffic -->
    <!-- Level=6 -->
    <!--#include Virtual=/NetPerfMon/scripts/Resource.asp -->
    <script language="javascript" src="/netperfmon/scripts/overlib.js">
     <div id="overDiv" style="position:absolute; visibility:hidden; z-index:1000;"></div>
    <%
     Title="Top 10 Interfaces by Traffic"
     HelpPage="TopXInterfaceTraffic"
     SQL="SELECT Top 10 Nodes.NodeID, Nodes.VendorIcon, Nodes.Caption as NodeName, Nodes.GroupStatus, Interfaces.InterfaceID, Interfaces.InterfaceIcon, Interfaces.Caption, Interfaces.StatusLED, Interfaces.InBps, Interfaces.OutBps, Interfaces.InPercentUtil, Interfaces.OutPercentUtil FROM Interfaces INNER JOIN Nodes ON Interfaces.NodeID = Nodes.NodeID ORDER BY (Interfaces.InBps+Interfaces.OutBps) Desc, Nodes.Caption, Interfaces.Caption "
    
     DoResourceHeader
     Set SQLResource = NetPerfMon.NewSQLResource
     SQLResource.SQL=SQL
     SQLResource.Execute
    
     Response.Write SQLResource.LastError
     If Not SQLResource.EOF Then DoReport
    %>
    <br>
    
    <% Sub DoReport %>
    
     <table border="0" cellPadding="2" cellSpacing="0" width="100%">
     <tr>
     <td class="ReportHeader" colspan=2>NODE</td>
     <td class="ReportHeader" colspan=2>INTERFACE</td>
     <td class="ReportHeader">RECEIVE</td>
     <td class="ReportHeader">TRANSMIT</td>
     </tr>
     <% Do While Not SQLResource.EOF %>
     <tr>
     <td class="Property" vAlign="center" width="20"><%=SQLResource.GetProperty("GroupStatus;SmallIcon")%> </td>
     <td class="Property"><a <%=SQLResource.GetProperty("NodeParamString")%> href="/NetPerfMon/View.asp?View=NodeDetails&NetObject=N:<%=SQLResource.GetProperty("NodeID")%>" ><%=SQLResource.GetProperty("NodeName")%></a> </td>
     <td class="Property" vAlign="center" width="20"><%=SQLResource.GetProperty("StatusLED;SmallIcon")%> </td>
     <td class="Property"><a <%=SQLResource.GetProperty("InterfaceParamString")%> href="/NetPerfMon/View.asp?View=InterfaceDetails&NetObject=I:<%=SQLResource.GetProperty("InterfaceID")%>" onmouseover="overlib('<img src=/NetPerfMon/Chart.asp?Chart=MMAVGBPS&NetObject=I:<%=SQLResource.GetProperty("InterfaceID")%>&Period=Today&SampleSize=30M&FontSize=&Width=500&Height=0 border=0>', CAPTION, '<%=SQLResource.GetProperty("Caption")%>', FGCOLOR, '#999999', BGCOLOR, '#333333', BORDER, 4, CAPTIONFONT, 'Garamond', TEXTFONT, 'Courier', TEXTSIZE, 3, ABOVE, LEFT, STICKY)"><%=SQLResource.GetProperty("Caption")%></a> </td>
     <td class="Property"><a href="/NetPerfMon/CustomChart.asp?Chart=MMAvgBps&Period=Today&NetObject=I:<%=SQLResource.GetProperty("InterfaceID") %>" target="_blank"><%=SQLResource.GetProperty("InBps")%></a> </td>
     <td class="Property"><a href="/NetPerfMon/CustomChart.asp?Chart=MMAvgBps&Period=Today&NetObject=I:<%=SQLResource.GetProperty("InterfaceID") %>" target="_blank"><%=SQLResource.GetProperty("OutBps")%></a> </td>
     </tr>
    
     <% SQLResource.MoveNext
     Loop
     %>
     </table>
    <% End Sub %>


    As you can see it takes minimal code to add the popup.
    Here is a screen shot of what the page looks like with the popup
  • Re: Solarwinds NPM custom website--ideas
    I did it a slightly different way.

    I only unzipped the overlib.js file to x:\inetpub\solarwinds\netperfmon

    and then modified View.asp by putting the following under just above the </head> tag

    <script type="text/javascript" src="overlib.js">


    Then I modified 33-InterfaceTraffic.Resource with the following giving it a slightly smaller appearance and self closing:

    <td class="Property">
    <a <%=SQLResource.GetProperty("InterfaceParamString")%> href="/NetPerfMon/View.asp?View=InterfaceDetails&NetObject=I:<%=SQLResource.GetProperty("InterfaceID")%>"
    onmouseover="return overlib('<img src=/NetPerfMon/Chart.asp?Chart=MMAvgUtil&NetObject=I:<%=SQLResource.GetProperty("InterfaceID")%>&Title=+&SubTitle=+&SubTitle2=+&Period=Today&SampleSize=30M&FontSize=&Width=400&Height=0&border=0>', FGCOLOR, '#999999', BGCOLOR, '#333333', BORDER, 4, CAPTIONFONT, 'Garamond', TEXTFONT, 'Courier', TEXTSIZE, 3, RIGHT);" onmouseout="nd();">
    <%=SQLResource.GetProperty("Caption")%></a>
     </td>
    
  • Re: Solarwinds NPM custom website--ideas
    Perhaps I'm being terribly ignorant about this.  I tried copying the lines exactly as listed...

    <script language="javascript" src="/netperfmon/scripts/overlib.js">
    <div id="overDiv" style="position:absolute; visibility:hidden; z-index:1000;"></div>

    However, when I do this, the page goes blank.  I've tried this for both the Top 10 and Top XX to no avail.

    I am running IIS6 and wondering if there is something else that I need to do to make this work.

    Thanks
  • Re: Solarwinds NPM custom website--ideas
    Hey Stephen98b  I used your method and I get no popups...  no errors either..  its like it ignores it or something.  Any thoughts?
  • Re: Solarwinds NPM custom website--ideas
    charles & mpearson,

    just copying those two lines won't do it, you need to have the onmouseover event also. You need to scroll to the right to see it in Stephens's post.
  • Re: Solarwinds NPM custom website--ideas
    vhcato
    quote:Originally posted by snowjay

    charles & mpearson,

    just copying those two lines won't do it, you need to have the onmouseover event also. You need to scroll to the right to see it in Stephens's post.


    Snowjay,

    I was also unable to get Stephen's mods to work. I was able to get yours to work, but it seems to break the toolset integration popups. Any thoughts?

    Thanks,
    Vic
  • Re: Solarwinds NPM custom website--ideas
    I tried to enter what was there to no avail.

    Here is what I have:

    <!-- Title=Top 10 Interfaces by Traffic -->
    
    <!-- Level=6 -->
    
    <!--#include Virtual=/NetPerfMon/scripts/Resource.asp -->
    
    <script language="javascript" src="/netperfmon/scripts/overlib.js">
    
    <div id="overDiv" style="position:absolute; visibility:hidden; z-index:1000;"></div>
    
    <%
    
         Title="Top 10 Interfaces by Traffic"
    
         HelpPage="TopXInterfaceTraffic"
    
         SQL="SELECT Top 10 Nodes.NodeID, Nodes.VendorIcon, Nodes.Caption as NodeName, Nodes.GroupStatus, Interfaces.InterfaceID, Interfaces.InterfaceIcon, Interfaces.Caption, Interfaces.StatusLED, Interfaces.InBps, Interfaces.OutBps, Interfaces.InPercentUtil, Interfaces.OutPercentUtil FROM Interfaces INNER JOIN Nodes ON Interfaces.NodeID = Nodes.NodeID ORDER BY (Interfaces.InBps+Interfaces.OutBps) Desc, Nodes.Caption, Interfaces.Caption "
    
         
    
         DoResourceHeader
    
         Set SQLResource = NetPerfMon.NewSQLResource
    
         SQLResource.SQL=SQL
    
         SQLResource.Execute
    
    
    
         Response.Write SQLResource.LastError
    
         If Not SQLResource.EOF Then DoReport
    
    %>
    
    <br>
    
    
    
    <%     Sub DoReport     %>
    
    
    
         <table border="0" cellPadding="2" cellSpacing="0" width="100%">
    
         <tr>
    
              <td class="ReportHeader" colspan=2>NODE</td>
    
              <td class="ReportHeader" colspan=2>INTERFACE</td>
    
              <td class="ReportHeader">RECEIVE</td>
    
              <td class="ReportHeader">TRANSMIT</td>
    
         </tr>
    
         <%     Do While Not SQLResource.EOF     %>
    
                   <tr>
    
                   <td class="Property" vAlign="center" width="20"><%=SQLResource.GetProperty("GroupStatus;SmallIcon")%> </td>
    
                   <td class="Property"><a <%=SQLResource.GetProperty("NodeParamString")%>   href="/NetPerfMon/View.asp?View=NodeDetails&NetObject=N:<%=SQLResource.GetProperty("NodeID")%>"                ><%=SQLResource.GetProperty("NodeName")%></a> </td>     
    
                   <td class="Property" vAlign="center" width="20"><%=SQLResource.GetProperty("StatusLED;SmallIcon")%> </td>
    
                   <td class="Property"><a <%=SQLResource.GetProperty("InterfaceParamString")%>  href="/NetPerfMon/View.asp?View=InterfaceDetails&NetObject=I:<%=SQLResource.GetProperty("InterfaceID")%>" onmouseover="overlib('<img src=/NetPerfMon/Chart.asp?Chart=MMAVGBPS&NetObject=I:<%=SQLResource.GetProperty("InterfaceID")%>&Period=Today&SampleSize=30M&FontSize=&Width=500&Height=0 border=0>', CAPTION, '<%=SQLResource.GetProperty("Caption")%>', FGCOLOR, '#999999', BGCOLOR, '#333333', BORDER, 4, CAPTIONFONT, 'Garamond', TEXTFONT, 'Courier', TEXTSIZE, 3, ABOVE, LEFT, STICKY)"><%=SQLResource.GetProperty("Caption")%></a> </td>
    
                   <td class="Property"><a href="/NetPerfMon/CustomChart.asp?Chart=MMAvgBps&Period=Today&NetObject=I:<%=SQLResource.GetProperty("InterfaceID") %>" target="_blank"><%=SQLResource.GetProperty("InBps")%></a> </td>
    
                   <td class="Property"><a href="/NetPerfMon/CustomChart.asp?Chart=MMAvgBps&Period=Today&NetObject=I:<%=SQLResource.GetProperty("InterfaceID") %>" target="_blank"><%=SQLResource.GetProperty("OutBps")%></a> </td>
    
                   </tr>
    
                   
    
         <%          SQLResource.MoveNext
    
              Loop
    
         %>
    
         </table>
    
    <%     End Sub     %>


    I see nothing on the page.
  • Re: Solarwinds NPM custom website--ideas
    Notes on the code above.....
    It does not work well with IE. Try it in FireFox and it should work fine.
    To get it to work in IE you have to modify the DIV tag and a few things
    in the js code its self. I belive that there are more details about this
    on the OverLib website. http://www.bosrup.com/web/overlib/.
  • Re: Solarwinds NPM custom website--ideas
    vhcato
    I wasn't able to find anything that seemed to pertain to issues with IE on the Overlib site.

    Does anyone have toolset integration and the Overlib mouseover working? Maybe I'm just missing something here (which wouldn't be out of the norm for me since...Duhhh... I don't know nuth'n bout no cod'n stuff).
  • Re: Solarwinds NPM custom website--ideas
    Eric E
    This might come in handy for those making cutomizations to Orion.

    http://www.maani.us/charts/index.php

    I really like the look of these graphs.