diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..d3bc52f --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,34 @@ +name: Build and Deploy +on: + push: + branches: + - main + workflow_dispatch: +permissions: + contents: write +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Configure Git Credentials + run: | + git config user.name github-actions[bot] + git config user.email 41898282+github-actions[bot]@users.noreply.github.com + - uses: actions/setup-python@v5 + with: + python-version: 3.x + - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV + - uses: actions/cache@v4 + with: + key: mkdocs-material-${{ env.cache_id }} + path: .cache + restore-keys: | + mkdocs-material- + - run: pip install -r requirements.txt + - run: mkdocs gh-deploy --force + env: + REPO_URL: ${{ vars.REPO_URL }} + EDIT_URL: ${{ vars.EDIT_URL }} + SITE_URL: ${{ vars.SITE_URL }} + DISQUS_CODE: ${{ vars.DISQUS_CODE }} \ No newline at end of file diff --git a/docs/.authors.yml b/docs/.authors.yml new file mode 100644 index 0000000..a0e26bb --- /dev/null +++ b/docs/.authors.yml @@ -0,0 +1,13 @@ +authors: + techb0lt: + name: The Diabetic + description: Creator + avatar: https://avatars.githubusercontent.com/u/102534612 + url: https://github.com/techb0lt + + ankit: + name: Ankit + description: Creator + country: UK + avatar: ./assets/images/profile_pix/profile_1.jpg + url: https://github.com/pubmania \ No newline at end of file diff --git a/docs/about/index.md b/docs/about/index.md new file mode 100644 index 0000000..b375095 --- /dev/null +++ b/docs/about/index.md @@ -0,0 +1,288 @@ +--- +title: "Ankit Mittal" +date: + created: 2008-07-01 08:41:00 + updated: 2024-08-14 08:40:00 +draft: false +authors: [ankit] +description: About the author +permalink: /about/ +toc: true +hide: navigation +--- + +------------------------------------------------------------------------ +
+ + Ankit + +
+ +------------------------------------------------------------------------ + +## EXECUTIVE SUMMARY + +------------------------------------------------------------------------ + +Results-oriented Programme Manager, with over 21 years of experience in +implementation and management of complex IT and Business Transformation +initiatives. Passionate in the delivery of quality services and +demonstrated ability to influence senior management decisions. History +of results and progressive career growth through hands-on leadership, +elimination of barriers and teamwork skills. + + +------------------------------------------------------------------------ + +## KEY COMPETENCIES + +------------------------------------------------------------------------ + +- MSP registered practitioner. (Registration Number: MSPR/052974) +- PRINCE 2 practitioner. (Registration Number: P2R/220948) +- Lean and DFSS (Design for Six Sigma) certified. +- Strong Stakeholder Management with ability to provide consultancy to + Senior Management +- Commercially aware with an ability to translate technical jargon + from engineering teams into plain English for the benefit of + non-technical stakeholders and decision makers to ensure constant + and timely flow of relevant information across the project. +- Experience of working and managing projects in both accelerated + (Agile) as well as controlled (waterfall) development models + and delivering in traditional on-prem as well as DevOps driven + cloud deployments +- Managing multiple projects and programmes with large remote + team size (80+)and budgets of up to 12M GBP. +- Over 15 years of Business Transformation Programme and Project + Management experience spanning across Financial Services + (Insurance and Banking), Aero-space, Manufacturing, Printing and + FMCG sectors. +- Proven technical expertise in database technologies (MSSQL, MySQL + and various BI Suites), web technologies and using Python + for data analysis +- Thorough knowledge of DevOps methodology and associated technologies + (Git, Github, GitLab, Ansible, Puppet, Jenkins, Selenium, Kubernetes) + and platforms (Azure, AWS). + +------------------------------------------------------------------------ + +## PROFESSIONAL EXPERIENCE + +------------------------------------------------------------------------ + +### Client: HP, various Govt. and Financial institutes across UK and Europe through IT Alliance. +***Role: Senior Project Manager/Programme Manager/Management Consultant, 11/2014 - Till Date*** + +- Responsible for Print Modernisation and Transformation + programme for two well known high street banks. +- Delivered MPCS (Managed Print Cloud Service) for several + organisations including two international logistics provider, + a UK govt. organisation and Nordics postal service provider. +- Delivered MPS (Managed Print Service) for two of the + well known Financial Institute in the UK with a global + presence across all continents with key focus on + EMEA, APAC and United States. +- Driven the creation and maintenance of Knowledge Base + for North West Europe Market for print business operations + while capturing, creating and implementing business processes + delivering better customer experience and improved team + satisfaction. +- Outlined and delivered the complete PMO governance process in line + with programme management best practices. +- Matrix managed large teams - typically including a team of + upto 2 - 10 country project managers, 3 technical + consultants, 2 - 20 technicians, 2 PMO support staff, 2 - 4 Helpdesk + Operations Managers, 3 - 6 developers and 2 - 4 project support officers. +- Engaged with operational and technical stakeholders from + multiple organisations to deploy Print Modernisation and + Transformation programmes as well as associated process changes, + embedding the helpdesk and implementing changes with benefit tracking. +- Delivered new processes within HP to benefit tracking at 84% saving + with an overall reduction in effort of nearly 25 man-days each + month. + +------------------------------------------------------------------------ + +### Client: Unilever, UK through CloudTalent. +***Role: Senior Project Manager, 05/2014 = 10/2014*** + +- Engaged to manage a vendor selection and procurement project aimed + at delivering a new infrastructure, PaaS and SaaS contract for its + Enterprise Compute Service current mode of operation with a view to + be prepared for future mode of operation and associated + transformation. +- Responsible for planning, monitoring and reporting progress of the + project, stakeholder communication and engagement, weekly reports to + senior stakeholders at Unilever and CloudTalent, maintaining RAID + log, resourcing and managing project costs for CloudTalent. +- Managed the delivery of RFP to strict deadlines under high pressure + environment (5 months project). +- Engaged stakeholders based in different geographies and managing + their expectations. +- Prepared detailed weekly report slide decks and used them to drive + structured weekly client and internal delivery review. +- Organised confidential RFP related activities and communication with + various internal and external stakeholders. +- Managed and reported on costs and resource forecasts. +- Facilitated communication between CloudTalent and Unilever Subject + Matter Experts to expedite decisions. + +------------------------------------------------------------------------ + +### Client: Brammer PLC, Knutsford, UK +***Role: Programme Manager, 04/2013 - 04/2014*** + +- Engaged to set-up and manage the Trading Platform Programme aimed to + unify the IT infrastructure and a Target Operating Model in line + with both financial and technical strategic business goals. +- Responsible for planning and monitoring the time, cost and quality + for the programme, stakeholder communication, identifying and + embedding change within the organisation with minimal operational + disruption, provide structured governance for organisation wide + projects that impacted the programme vision, reporting programme + progress to Senior Management Team and Board of Directors. +- Rolled out the new service management framework that involved + migration of secondary and tertiary IT support from Manchester to + the IT co-sourcing partner based in Poland while keeping the primary + support in Manchester. +- Rollout of iPAD across UK, Germany and Europe as a Sales Support + Tool integrated with the Microsoft Dynamics (CRM). +- Implemented Enterprise Service Bus, Master Data Management database, + Transactions Database, Stock Database, abstracted layer for + localised ERP systems in different countries, Brammer e-shop for + European subsidiaries (Spain, Germany, Italy, Belgium, Poland and + Czech) +- Initiated business transformation programme for pan-European Key + Accounts operations of Brammer aiming to deliver a target operating + model that supports collaborative cross border order management + while maximising savings for customer as well as Brammer. +- Set-up project management internally within Brammer PLC and resource + management practices with IT co-sourcing partners, mentored Junior + Project Managers and PMO Manager to establish regular reporting, + developed and introduced dashboard templates and Graduate Trainee on + techniques involved in Business Analysis such as six sigma + workshops, process mapping. + +------------------------------------------------------------------------ + +### Employer: Amor Transportation Sector, Daresbury, UK +***Role: Programme Manager and Senior Project Manager, 11/2011 - 04/2013*** + +- Engaged to deliver the programme aimed to development of a new + product called Chroma Human Resource Management System (CHRMS) as an + addition to the existing offering of Chroma Software Suite in + partnership with Manchester Airport while delivering implementation + of Chroma suite at several other airports in the UK and Europe. +- Responsible for planning, monitoring and reporting the progress of + programme and other implementation projects to external and internal + stakeholders, optimising resource usage between programme and other + projects, negotiating costs for change requests, agreeing delivery + time-frame and roadmap for enhancement requests, pre-sales support. +- Managed the complete development and delivery of new modular product + called Chroma Human Resource Management System (CHRMS). +- Managed business change within Transport Sector to deliver new + governance and streamline culture between FS Walker-Hughes and Amor + Group post the merger of two companies. +- Managed Infrastructure and Interface development projects part of + the EAL Separation programme. +- Delivered AMOR\'s Chroma Airport Suite software across national and + international airports. +- Provided responses to RFP's for Australian, Norwegian, Dubai and + American airports with two successes while others were yet to + decide. + +------------------------------------------------------------------------ + +### Employer: Barclays Corporate, Northwich, UK. +***Role: Project Manager (Business Transformation and IT), 05/2008 - 09/2011*** + +- Engaged to deliver business transformation and change initiatives + undertaken by the Operational Excellence Team of Barclays Corporate. +- Responsible for planning, monitoring and reporting of projects, + adhering to project management practice guidelines, ensure + commercially realisable benefits. +- Delivered a servicing activities hand-off model that created + capacity within sales realising a benefit of £350,000 in 3 months. +- Managed end to end rollout of Siebel and TotalView Workforce + Management system. +- Managed the move of IT support services, phased migration from + legacy to strategic VOIP solutions +- Delivered the secure email solution for communication between + BARCORP and its business partners. +- Delivered business transformation project aimed at segmentation of + client base following the organisation restructure +- Delivered an enhanced complaints management process framework within + 6 months making the Barclays Corporate compliant to Regulatory + requirements and closing over 70 audit observations. +- Conducted feasibility study with an aim to recommend product that + will enable Automated KYC (Know Your Customer) and provided complete + recommendation. + +------------------------------------------------------------------------ + +### Client: Aviva (then Norwich Union), York and Norwich, UK through Tata Consultancy Services. +***Role: IT Project Manager, 07/2005 - 12/2007*** + +- Engaged to deliver development project, enhancement and support + services to agreed cost, schedule and quality for Financial Services + Applications Group within NUIT. +- Responsible for planning and governance of assigned projects, + managing staff and third party service providers and vendors, + identify resource requirements to feed into the business planning + process and interface between Business and IT community. +- Managed an electronic funds transfer systems migration project aimed + at replacing the 9 stand-alone systems through an enhanced Payment + Preparation System to cater for Chaps, Inter account Transfers, + International Payments and Foreign drafts. +- Managed policies migration with process to ensure phasing out of + retained policies. +- Enhancements to the Payment Preparation System to transmit payments + via Hexagon ABC and ensure conformance to European Payments Council + Resolution of 2005 in respect of Euro cross-border payment standard + (BIC & IBAN). +- Migration of old accounts from NU Cash-book to Heritage Cash-book + under Swiss-Re arrangement. +- Delivered the system upgrade of finance application suite. + +### Client: GE Healthcare and Amersham Biosciences, Sweden through Tata Consultancy Services. +***Role: IT Projects and Engagement Manager, 07/2004 - 07/2005*** + +- Engaged to deliver the knowledge acquisition from Amersham + Biosciences IT Team based in Sweden and facilitate move of IT + Support Services to offshore. +- Responsible for working with client services and business partners + to ensure a seamless transition, stakeholder management, resource on + boarding, progress reporting, to be the escalation point, managing + enhancement projects. +- Built and delivered a successful outsourcing model aimed at reducing + the IT department's 2004 operating costs by 30%. +- Created a new work-flow for production implementation teams to + prioritize requests. Integrally involved with core team that + improved the process to separate support from development requests +- Reduced the support team's work-load by over 70% in two-months from + the original 300+ weekly requests by introducing new workflow and + collecting appropriate management information. As a result, team was + able to focus more on value-added enhancements and less on recurring + issues. +- Managed complex enhancement projects involving multiple technologies + (JAVA, JDE, Websphere, Apache) with teams based at Sweden, UK, India + and US. + +------------------------------------------------------------------------ + +### Client: Tata Consultancy Services. Support Groups, Mumbai, India +***Role: Project Leader, ESS-Ultimatix, 09/2003 - 07/2004*** + +- Project documentation, quality assurance, impact analysis, resource + planning related to Change Request and enhancements. +- Server Administration, Database design and maintenance. + +------------------------------------------------------------------------ + +### Client: Government of Andhra Pradesh, Hyderabad, India through Tata Consultancy Services. +***Role: Developer/Module Leader, SmartGov, 04/2001 - 09/2003*** + +- Designed, Developed and Tested Applications using PL/SQL stored + procedures, Lotus Script, JAVA, Javascript + +------------------------------------------------------------------------ \ No newline at end of file diff --git a/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-1.png b/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-1.png new file mode 100644 index 0000000..3574591 Binary files /dev/null and b/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-1.png differ diff --git a/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-2.png b/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-2.png new file mode 100644 index 0000000..d74b1ef Binary files /dev/null and b/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-2.png differ diff --git a/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-3.png b/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-3.png new file mode 100644 index 0000000..d5ec387 Binary files /dev/null and b/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-3.png differ diff --git a/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-4.png b/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-4.png new file mode 100644 index 0000000..a708e4c Binary files /dev/null and b/docs/assets/images/2009/09/16/Screenshot-NVIDIA X Server Settings-4.png differ diff --git a/assets/images/2016/07/201011_Fig_1.png b/docs/assets/images/2016/07/201011_Fig_1.png similarity index 100% rename from assets/images/2016/07/201011_Fig_1.png rename to docs/assets/images/2016/07/201011_Fig_1.png diff --git a/assets/images/2016/07/201011_Fig_10.png b/docs/assets/images/2016/07/201011_Fig_10.png similarity index 100% rename from assets/images/2016/07/201011_Fig_10.png rename to docs/assets/images/2016/07/201011_Fig_10.png diff --git a/assets/images/2016/07/201011_Fig_2.png b/docs/assets/images/2016/07/201011_Fig_2.png similarity index 100% rename from assets/images/2016/07/201011_Fig_2.png rename to docs/assets/images/2016/07/201011_Fig_2.png diff --git a/assets/images/2016/07/201011_Fig_3.png b/docs/assets/images/2016/07/201011_Fig_3.png similarity index 100% rename from assets/images/2016/07/201011_Fig_3.png rename to docs/assets/images/2016/07/201011_Fig_3.png diff --git a/assets/images/2016/07/201011_Fig_4.png b/docs/assets/images/2016/07/201011_Fig_4.png similarity index 100% rename from assets/images/2016/07/201011_Fig_4.png rename to docs/assets/images/2016/07/201011_Fig_4.png diff --git a/assets/images/2016/07/201011_Fig_5.png b/docs/assets/images/2016/07/201011_Fig_5.png similarity index 100% rename from assets/images/2016/07/201011_Fig_5.png rename to docs/assets/images/2016/07/201011_Fig_5.png diff --git a/assets/images/2016/07/201011_Fig_6.png b/docs/assets/images/2016/07/201011_Fig_6.png similarity index 100% rename from assets/images/2016/07/201011_Fig_6.png rename to docs/assets/images/2016/07/201011_Fig_6.png diff --git a/assets/images/2016/07/201011_Fig_7.png b/docs/assets/images/2016/07/201011_Fig_7.png similarity index 100% rename from assets/images/2016/07/201011_Fig_7.png rename to docs/assets/images/2016/07/201011_Fig_7.png diff --git a/assets/images/2016/07/201011_Fig_8.png b/docs/assets/images/2016/07/201011_Fig_8.png similarity index 100% rename from assets/images/2016/07/201011_Fig_8.png rename to docs/assets/images/2016/07/201011_Fig_8.png diff --git a/assets/images/2016/07/201011_Fig_9.png b/docs/assets/images/2016/07/201011_Fig_9.png similarity index 100% rename from assets/images/2016/07/201011_Fig_9.png rename to docs/assets/images/2016/07/201011_Fig_9.png diff --git a/assets/images/2016/07/20110417_Fig_1.jpg b/docs/assets/images/2016/07/20110417_Fig_1.jpg similarity index 100% rename from assets/images/2016/07/20110417_Fig_1.jpg rename to docs/assets/images/2016/07/20110417_Fig_1.jpg diff --git a/assets/images/2016/07/20110417_Fig_2.jpg b/docs/assets/images/2016/07/20110417_Fig_2.jpg similarity index 100% rename from assets/images/2016/07/20110417_Fig_2.jpg rename to docs/assets/images/2016/07/20110417_Fig_2.jpg diff --git a/assets/images/2016/07/20110417_Fig_3.jpg b/docs/assets/images/2016/07/20110417_Fig_3.jpg similarity index 100% rename from assets/images/2016/07/20110417_Fig_3.jpg rename to docs/assets/images/2016/07/20110417_Fig_3.jpg diff --git a/assets/images/2016/07/20110429_Fig_1.png b/docs/assets/images/2016/07/20110429_Fig_1.png similarity index 100% rename from assets/images/2016/07/20110429_Fig_1.png rename to docs/assets/images/2016/07/20110429_Fig_1.png diff --git a/assets/images/2016/07/20110429_Fig_2.png b/docs/assets/images/2016/07/20110429_Fig_2.png similarity index 100% rename from assets/images/2016/07/20110429_Fig_2.png rename to docs/assets/images/2016/07/20110429_Fig_2.png diff --git a/assets/images/2016/07/20110429_Fig_3.png b/docs/assets/images/2016/07/20110429_Fig_3.png similarity index 100% rename from assets/images/2016/07/20110429_Fig_3.png rename to docs/assets/images/2016/07/20110429_Fig_3.png diff --git a/assets/images/2016/07/20110429_Fig_4.png b/docs/assets/images/2016/07/20110429_Fig_4.png similarity index 100% rename from assets/images/2016/07/20110429_Fig_4.png rename to docs/assets/images/2016/07/20110429_Fig_4.png diff --git a/assets/images/2016/07/20110429_Fig_5.png b/docs/assets/images/2016/07/20110429_Fig_5.png similarity index 100% rename from assets/images/2016/07/20110429_Fig_5.png rename to docs/assets/images/2016/07/20110429_Fig_5.png diff --git a/assets/images/2016/07/20110507_Fig_1.png b/docs/assets/images/2016/07/20110507_Fig_1.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_1.png rename to docs/assets/images/2016/07/20110507_Fig_1.png diff --git a/assets/images/2016/07/20110507_Fig_10.png b/docs/assets/images/2016/07/20110507_Fig_10.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_10.png rename to docs/assets/images/2016/07/20110507_Fig_10.png diff --git a/assets/images/2016/07/20110507_Fig_11.png b/docs/assets/images/2016/07/20110507_Fig_11.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_11.png rename to docs/assets/images/2016/07/20110507_Fig_11.png diff --git a/assets/images/2016/07/20110507_Fig_12.png b/docs/assets/images/2016/07/20110507_Fig_12.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_12.png rename to docs/assets/images/2016/07/20110507_Fig_12.png diff --git a/assets/images/2016/07/20110507_Fig_13.png b/docs/assets/images/2016/07/20110507_Fig_13.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_13.png rename to docs/assets/images/2016/07/20110507_Fig_13.png diff --git a/assets/images/2016/07/20110507_Fig_2.png b/docs/assets/images/2016/07/20110507_Fig_2.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_2.png rename to docs/assets/images/2016/07/20110507_Fig_2.png diff --git a/assets/images/2016/07/20110507_Fig_3.png b/docs/assets/images/2016/07/20110507_Fig_3.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_3.png rename to docs/assets/images/2016/07/20110507_Fig_3.png diff --git a/assets/images/2016/07/20110507_Fig_4.png b/docs/assets/images/2016/07/20110507_Fig_4.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_4.png rename to docs/assets/images/2016/07/20110507_Fig_4.png diff --git a/assets/images/2016/07/20110507_Fig_5.png b/docs/assets/images/2016/07/20110507_Fig_5.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_5.png rename to docs/assets/images/2016/07/20110507_Fig_5.png diff --git a/assets/images/2016/07/20110507_Fig_6.png b/docs/assets/images/2016/07/20110507_Fig_6.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_6.png rename to docs/assets/images/2016/07/20110507_Fig_6.png diff --git a/assets/images/2016/07/20110507_Fig_7.png b/docs/assets/images/2016/07/20110507_Fig_7.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_7.png rename to docs/assets/images/2016/07/20110507_Fig_7.png diff --git a/assets/images/2016/07/20110507_Fig_8.png b/docs/assets/images/2016/07/20110507_Fig_8.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_8.png rename to docs/assets/images/2016/07/20110507_Fig_8.png diff --git a/assets/images/2016/07/20110507_Fig_9.png b/docs/assets/images/2016/07/20110507_Fig_9.png similarity index 100% rename from assets/images/2016/07/20110507_Fig_9.png rename to docs/assets/images/2016/07/20110507_Fig_9.png diff --git a/assets/images/2016/07/20110604_Fig_1.png b/docs/assets/images/2016/07/20110604_Fig_1.png similarity index 100% rename from assets/images/2016/07/20110604_Fig_1.png rename to docs/assets/images/2016/07/20110604_Fig_1.png diff --git a/assets/images/2016/07/20110604_Fig_2.png b/docs/assets/images/2016/07/20110604_Fig_2.png similarity index 100% rename from assets/images/2016/07/20110604_Fig_2.png rename to docs/assets/images/2016/07/20110604_Fig_2.png diff --git a/assets/images/2016/07/20110604_Fig_3.png b/docs/assets/images/2016/07/20110604_Fig_3.png similarity index 100% rename from assets/images/2016/07/20110604_Fig_3.png rename to docs/assets/images/2016/07/20110604_Fig_3.png diff --git a/assets/images/2016/07/20110604_Fig_4.png b/docs/assets/images/2016/07/20110604_Fig_4.png similarity index 100% rename from assets/images/2016/07/20110604_Fig_4.png rename to docs/assets/images/2016/07/20110604_Fig_4.png diff --git a/assets/images/2016/07/20110604_Fig_5.png b/docs/assets/images/2016/07/20110604_Fig_5.png similarity index 100% rename from assets/images/2016/07/20110604_Fig_5.png rename to docs/assets/images/2016/07/20110604_Fig_5.png diff --git a/assets/images/2016/07/20110604_Fig_6.png b/docs/assets/images/2016/07/20110604_Fig_6.png similarity index 100% rename from assets/images/2016/07/20110604_Fig_6.png rename to docs/assets/images/2016/07/20110604_Fig_6.png diff --git a/assets/images/2016/07/20110604_Fig_7.png b/docs/assets/images/2016/07/20110604_Fig_7.png similarity index 100% rename from assets/images/2016/07/20110604_Fig_7.png rename to docs/assets/images/2016/07/20110604_Fig_7.png diff --git a/assets/images/2016/07/20110620_Fig_1.png b/docs/assets/images/2016/07/20110620_Fig_1.png similarity index 100% rename from assets/images/2016/07/20110620_Fig_1.png rename to docs/assets/images/2016/07/20110620_Fig_1.png diff --git a/assets/images/2016/07/20110620_Fig_2.png b/docs/assets/images/2016/07/20110620_Fig_2.png similarity index 100% rename from assets/images/2016/07/20110620_Fig_2.png rename to docs/assets/images/2016/07/20110620_Fig_2.png diff --git a/assets/images/2016/07/20111104_Fig_1.png b/docs/assets/images/2016/07/20111104_Fig_1.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_1.png rename to docs/assets/images/2016/07/20111104_Fig_1.png diff --git a/assets/images/2016/07/20111104_Fig_10.png b/docs/assets/images/2016/07/20111104_Fig_10.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_10.png rename to docs/assets/images/2016/07/20111104_Fig_10.png diff --git a/assets/images/2016/07/20111104_Fig_11.png b/docs/assets/images/2016/07/20111104_Fig_11.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_11.png rename to docs/assets/images/2016/07/20111104_Fig_11.png diff --git a/assets/images/2016/07/20111104_Fig_12.png b/docs/assets/images/2016/07/20111104_Fig_12.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_12.png rename to docs/assets/images/2016/07/20111104_Fig_12.png diff --git a/assets/images/2016/07/20111104_Fig_13.png b/docs/assets/images/2016/07/20111104_Fig_13.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_13.png rename to docs/assets/images/2016/07/20111104_Fig_13.png diff --git a/assets/images/2016/07/20111104_Fig_14.png b/docs/assets/images/2016/07/20111104_Fig_14.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_14.png rename to docs/assets/images/2016/07/20111104_Fig_14.png diff --git a/assets/images/2016/07/20111104_Fig_15.png b/docs/assets/images/2016/07/20111104_Fig_15.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_15.png rename to docs/assets/images/2016/07/20111104_Fig_15.png diff --git a/assets/images/2016/07/20111104_Fig_16.png b/docs/assets/images/2016/07/20111104_Fig_16.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_16.png rename to docs/assets/images/2016/07/20111104_Fig_16.png diff --git a/assets/images/2016/07/20111104_Fig_17.png b/docs/assets/images/2016/07/20111104_Fig_17.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_17.png rename to docs/assets/images/2016/07/20111104_Fig_17.png diff --git a/assets/images/2016/07/20111104_Fig_2.png b/docs/assets/images/2016/07/20111104_Fig_2.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_2.png rename to docs/assets/images/2016/07/20111104_Fig_2.png diff --git a/assets/images/2016/07/20111104_Fig_3.png b/docs/assets/images/2016/07/20111104_Fig_3.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_3.png rename to docs/assets/images/2016/07/20111104_Fig_3.png diff --git a/assets/images/2016/07/20111104_Fig_4.png b/docs/assets/images/2016/07/20111104_Fig_4.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_4.png rename to docs/assets/images/2016/07/20111104_Fig_4.png diff --git a/assets/images/2016/07/20111104_Fig_5.png b/docs/assets/images/2016/07/20111104_Fig_5.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_5.png rename to docs/assets/images/2016/07/20111104_Fig_5.png diff --git a/assets/images/2016/07/20111104_Fig_6.png b/docs/assets/images/2016/07/20111104_Fig_6.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_6.png rename to docs/assets/images/2016/07/20111104_Fig_6.png diff --git a/assets/images/2016/07/20111104_Fig_7.png b/docs/assets/images/2016/07/20111104_Fig_7.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_7.png rename to docs/assets/images/2016/07/20111104_Fig_7.png diff --git a/assets/images/2016/07/20111104_Fig_8.png b/docs/assets/images/2016/07/20111104_Fig_8.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_8.png rename to docs/assets/images/2016/07/20111104_Fig_8.png diff --git a/assets/images/2016/07/20111104_Fig_9.png b/docs/assets/images/2016/07/20111104_Fig_9.png similarity index 100% rename from assets/images/2016/07/20111104_Fig_9.png rename to docs/assets/images/2016/07/20111104_Fig_9.png diff --git a/assets/images/2016/07/20111106_Fig_1.png b/docs/assets/images/2016/07/20111106_Fig_1.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_1.png rename to docs/assets/images/2016/07/20111106_Fig_1.png diff --git a/assets/images/2016/07/20111106_Fig_10.png b/docs/assets/images/2016/07/20111106_Fig_10.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_10.png rename to docs/assets/images/2016/07/20111106_Fig_10.png diff --git a/assets/images/2016/07/20111106_Fig_11.png b/docs/assets/images/2016/07/20111106_Fig_11.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_11.png rename to docs/assets/images/2016/07/20111106_Fig_11.png diff --git a/assets/images/2016/07/20111106_Fig_12.png b/docs/assets/images/2016/07/20111106_Fig_12.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_12.png rename to docs/assets/images/2016/07/20111106_Fig_12.png diff --git a/assets/images/2016/07/20111106_Fig_2.png b/docs/assets/images/2016/07/20111106_Fig_2.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_2.png rename to docs/assets/images/2016/07/20111106_Fig_2.png diff --git a/assets/images/2016/07/20111106_Fig_3.png b/docs/assets/images/2016/07/20111106_Fig_3.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_3.png rename to docs/assets/images/2016/07/20111106_Fig_3.png diff --git a/assets/images/2016/07/20111106_Fig_4.png b/docs/assets/images/2016/07/20111106_Fig_4.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_4.png rename to docs/assets/images/2016/07/20111106_Fig_4.png diff --git a/assets/images/2016/07/20111106_Fig_5.png b/docs/assets/images/2016/07/20111106_Fig_5.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_5.png rename to docs/assets/images/2016/07/20111106_Fig_5.png diff --git a/assets/images/2016/07/20111106_Fig_6.png b/docs/assets/images/2016/07/20111106_Fig_6.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_6.png rename to docs/assets/images/2016/07/20111106_Fig_6.png diff --git a/assets/images/2016/07/20111106_Fig_7.png b/docs/assets/images/2016/07/20111106_Fig_7.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_7.png rename to docs/assets/images/2016/07/20111106_Fig_7.png diff --git a/assets/images/2016/07/20111106_Fig_8.png b/docs/assets/images/2016/07/20111106_Fig_8.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_8.png rename to docs/assets/images/2016/07/20111106_Fig_8.png diff --git a/assets/images/2016/07/20111106_Fig_9.png b/docs/assets/images/2016/07/20111106_Fig_9.png similarity index 100% rename from assets/images/2016/07/20111106_Fig_9.png rename to docs/assets/images/2016/07/20111106_Fig_9.png diff --git a/assets/images/2016/07/2011_Fig_11.jpg b/docs/assets/images/2016/07/2011_Fig_11.jpg similarity index 100% rename from assets/images/2016/07/2011_Fig_11.jpg rename to docs/assets/images/2016/07/2011_Fig_11.jpg diff --git a/assets/images/2016/07/20120220_Fig_1.png b/docs/assets/images/2016/07/20120220_Fig_1.png similarity index 100% rename from assets/images/2016/07/20120220_Fig_1.png rename to docs/assets/images/2016/07/20120220_Fig_1.png diff --git a/assets/images/2016/07/20120220_Fig_2.png b/docs/assets/images/2016/07/20120220_Fig_2.png similarity index 100% rename from assets/images/2016/07/20120220_Fig_2.png rename to docs/assets/images/2016/07/20120220_Fig_2.png diff --git a/assets/images/2016/07/20120220_Fig_3.png b/docs/assets/images/2016/07/20120220_Fig_3.png similarity index 100% rename from assets/images/2016/07/20120220_Fig_3.png rename to docs/assets/images/2016/07/20120220_Fig_3.png diff --git a/assets/images/2016/07/20120220_Fig_4.png b/docs/assets/images/2016/07/20120220_Fig_4.png similarity index 100% rename from assets/images/2016/07/20120220_Fig_4.png rename to docs/assets/images/2016/07/20120220_Fig_4.png diff --git a/assets/images/2016/07/20120220_Fig_5.png b/docs/assets/images/2016/07/20120220_Fig_5.png similarity index 100% rename from assets/images/2016/07/20120220_Fig_5.png rename to docs/assets/images/2016/07/20120220_Fig_5.png diff --git a/assets/images/2016/07/20120220_Fig_6.png b/docs/assets/images/2016/07/20120220_Fig_6.png similarity index 100% rename from assets/images/2016/07/20120220_Fig_6.png rename to docs/assets/images/2016/07/20120220_Fig_6.png diff --git a/assets/images/2016/07/20120220_Fig_7.png b/docs/assets/images/2016/07/20120220_Fig_7.png similarity index 100% rename from assets/images/2016/07/20120220_Fig_7.png rename to docs/assets/images/2016/07/20120220_Fig_7.png diff --git a/assets/images/2016/07/20120220_Fig_8.png b/docs/assets/images/2016/07/20120220_Fig_8.png similarity index 100% rename from assets/images/2016/07/20120220_Fig_8.png rename to docs/assets/images/2016/07/20120220_Fig_8.png diff --git a/assets/images/2016/07/20120316_Fig_1.png b/docs/assets/images/2016/07/20120316_Fig_1.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_1.png rename to docs/assets/images/2016/07/20120316_Fig_1.png diff --git a/assets/images/2016/07/20120316_Fig_10.png b/docs/assets/images/2016/07/20120316_Fig_10.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_10.png rename to docs/assets/images/2016/07/20120316_Fig_10.png diff --git a/assets/images/2016/07/20120316_Fig_11.png b/docs/assets/images/2016/07/20120316_Fig_11.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_11.png rename to docs/assets/images/2016/07/20120316_Fig_11.png diff --git a/assets/images/2016/07/20120316_Fig_12.png b/docs/assets/images/2016/07/20120316_Fig_12.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_12.png rename to docs/assets/images/2016/07/20120316_Fig_12.png diff --git a/assets/images/2016/07/20120316_Fig_13.png b/docs/assets/images/2016/07/20120316_Fig_13.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_13.png rename to docs/assets/images/2016/07/20120316_Fig_13.png diff --git a/assets/images/2016/07/20120316_Fig_14.png b/docs/assets/images/2016/07/20120316_Fig_14.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_14.png rename to docs/assets/images/2016/07/20120316_Fig_14.png diff --git a/assets/images/2016/07/20120316_Fig_15.png b/docs/assets/images/2016/07/20120316_Fig_15.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_15.png rename to docs/assets/images/2016/07/20120316_Fig_15.png diff --git a/assets/images/2016/07/20120316_Fig_16.png b/docs/assets/images/2016/07/20120316_Fig_16.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_16.png rename to docs/assets/images/2016/07/20120316_Fig_16.png diff --git a/assets/images/2016/07/20120316_Fig_2.png b/docs/assets/images/2016/07/20120316_Fig_2.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_2.png rename to docs/assets/images/2016/07/20120316_Fig_2.png diff --git a/assets/images/2016/07/20120316_Fig_3.png b/docs/assets/images/2016/07/20120316_Fig_3.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_3.png rename to docs/assets/images/2016/07/20120316_Fig_3.png diff --git a/assets/images/2016/07/20120316_Fig_4.png b/docs/assets/images/2016/07/20120316_Fig_4.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_4.png rename to docs/assets/images/2016/07/20120316_Fig_4.png diff --git a/assets/images/2016/07/20120316_Fig_5.png b/docs/assets/images/2016/07/20120316_Fig_5.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_5.png rename to docs/assets/images/2016/07/20120316_Fig_5.png diff --git a/assets/images/2016/07/20120316_Fig_6.png b/docs/assets/images/2016/07/20120316_Fig_6.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_6.png rename to docs/assets/images/2016/07/20120316_Fig_6.png diff --git a/assets/images/2016/07/20120316_Fig_7.png b/docs/assets/images/2016/07/20120316_Fig_7.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_7.png rename to docs/assets/images/2016/07/20120316_Fig_7.png diff --git a/assets/images/2016/07/20120316_Fig_8.png b/docs/assets/images/2016/07/20120316_Fig_8.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_8.png rename to docs/assets/images/2016/07/20120316_Fig_8.png diff --git a/assets/images/2016/07/20120316_Fig_9.png b/docs/assets/images/2016/07/20120316_Fig_9.png similarity index 100% rename from assets/images/2016/07/20120316_Fig_9.png rename to docs/assets/images/2016/07/20120316_Fig_9.png diff --git a/assets/images/2016/07/20121012_Fig_1.png b/docs/assets/images/2016/07/20121012_Fig_1.png similarity index 100% rename from assets/images/2016/07/20121012_Fig_1.png rename to docs/assets/images/2016/07/20121012_Fig_1.png diff --git a/assets/images/2016/07/20121012_Fig_2.png b/docs/assets/images/2016/07/20121012_Fig_2.png similarity index 100% rename from assets/images/2016/07/20121012_Fig_2.png rename to docs/assets/images/2016/07/20121012_Fig_2.png diff --git a/assets/images/2016/07/20121012_Fig_3.png b/docs/assets/images/2016/07/20121012_Fig_3.png similarity index 100% rename from assets/images/2016/07/20121012_Fig_3.png rename to docs/assets/images/2016/07/20121012_Fig_3.png diff --git a/assets/images/2016/07/20121018_Fig_1.png b/docs/assets/images/2016/07/20121018_Fig_1.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_1.png rename to docs/assets/images/2016/07/20121018_Fig_1.png diff --git a/assets/images/2016/07/20121018_Fig_10.png b/docs/assets/images/2016/07/20121018_Fig_10.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_10.png rename to docs/assets/images/2016/07/20121018_Fig_10.png diff --git a/assets/images/2016/07/20121018_Fig_11.png b/docs/assets/images/2016/07/20121018_Fig_11.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_11.png rename to docs/assets/images/2016/07/20121018_Fig_11.png diff --git a/assets/images/2016/07/20121018_Fig_12.png b/docs/assets/images/2016/07/20121018_Fig_12.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_12.png rename to docs/assets/images/2016/07/20121018_Fig_12.png diff --git a/assets/images/2016/07/20121018_Fig_13.png b/docs/assets/images/2016/07/20121018_Fig_13.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_13.png rename to docs/assets/images/2016/07/20121018_Fig_13.png diff --git a/assets/images/2016/07/20121018_Fig_14.png b/docs/assets/images/2016/07/20121018_Fig_14.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_14.png rename to docs/assets/images/2016/07/20121018_Fig_14.png diff --git a/assets/images/2016/07/20121018_Fig_14a.png b/docs/assets/images/2016/07/20121018_Fig_14a.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_14a.png rename to docs/assets/images/2016/07/20121018_Fig_14a.png diff --git a/assets/images/2016/07/20121018_Fig_15.png b/docs/assets/images/2016/07/20121018_Fig_15.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_15.png rename to docs/assets/images/2016/07/20121018_Fig_15.png diff --git a/assets/images/2016/07/20121018_Fig_16.png b/docs/assets/images/2016/07/20121018_Fig_16.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_16.png rename to docs/assets/images/2016/07/20121018_Fig_16.png diff --git a/assets/images/2016/07/20121018_Fig_17.png b/docs/assets/images/2016/07/20121018_Fig_17.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_17.png rename to docs/assets/images/2016/07/20121018_Fig_17.png diff --git a/assets/images/2016/07/20121018_Fig_18.png b/docs/assets/images/2016/07/20121018_Fig_18.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_18.png rename to docs/assets/images/2016/07/20121018_Fig_18.png diff --git a/assets/images/2016/07/20121018_Fig_19.png b/docs/assets/images/2016/07/20121018_Fig_19.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_19.png rename to docs/assets/images/2016/07/20121018_Fig_19.png diff --git a/assets/images/2016/07/20121018_Fig_2.png b/docs/assets/images/2016/07/20121018_Fig_2.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_2.png rename to docs/assets/images/2016/07/20121018_Fig_2.png diff --git a/assets/images/2016/07/20121018_Fig_20.png b/docs/assets/images/2016/07/20121018_Fig_20.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_20.png rename to docs/assets/images/2016/07/20121018_Fig_20.png diff --git a/assets/images/2016/07/20121018_Fig_21.png b/docs/assets/images/2016/07/20121018_Fig_21.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_21.png rename to docs/assets/images/2016/07/20121018_Fig_21.png diff --git a/assets/images/2016/07/20121018_Fig_22.png b/docs/assets/images/2016/07/20121018_Fig_22.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_22.png rename to docs/assets/images/2016/07/20121018_Fig_22.png diff --git a/assets/images/2016/07/20121018_Fig_23.png b/docs/assets/images/2016/07/20121018_Fig_23.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_23.png rename to docs/assets/images/2016/07/20121018_Fig_23.png diff --git a/assets/images/2016/07/20121018_Fig_24.png b/docs/assets/images/2016/07/20121018_Fig_24.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_24.png rename to docs/assets/images/2016/07/20121018_Fig_24.png diff --git a/assets/images/2016/07/20121018_Fig_25.png b/docs/assets/images/2016/07/20121018_Fig_25.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_25.png rename to docs/assets/images/2016/07/20121018_Fig_25.png diff --git a/assets/images/2016/07/20121018_Fig_26.png b/docs/assets/images/2016/07/20121018_Fig_26.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_26.png rename to docs/assets/images/2016/07/20121018_Fig_26.png diff --git a/assets/images/2016/07/20121018_Fig_27.png b/docs/assets/images/2016/07/20121018_Fig_27.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_27.png rename to docs/assets/images/2016/07/20121018_Fig_27.png diff --git a/assets/images/2016/07/20121018_Fig_28.png b/docs/assets/images/2016/07/20121018_Fig_28.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_28.png rename to docs/assets/images/2016/07/20121018_Fig_28.png diff --git a/assets/images/2016/07/20121018_Fig_29.png b/docs/assets/images/2016/07/20121018_Fig_29.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_29.png rename to docs/assets/images/2016/07/20121018_Fig_29.png diff --git a/assets/images/2016/07/20121018_Fig_3.png b/docs/assets/images/2016/07/20121018_Fig_3.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_3.png rename to docs/assets/images/2016/07/20121018_Fig_3.png diff --git a/assets/images/2016/07/20121018_Fig_4.png b/docs/assets/images/2016/07/20121018_Fig_4.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_4.png rename to docs/assets/images/2016/07/20121018_Fig_4.png diff --git a/assets/images/2016/07/20121018_Fig_5.png b/docs/assets/images/2016/07/20121018_Fig_5.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_5.png rename to docs/assets/images/2016/07/20121018_Fig_5.png diff --git a/assets/images/2016/07/20121018_Fig_6.png b/docs/assets/images/2016/07/20121018_Fig_6.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_6.png rename to docs/assets/images/2016/07/20121018_Fig_6.png diff --git a/assets/images/2016/07/20121018_Fig_7.png b/docs/assets/images/2016/07/20121018_Fig_7.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_7.png rename to docs/assets/images/2016/07/20121018_Fig_7.png diff --git a/assets/images/2016/07/20121018_Fig_8.png b/docs/assets/images/2016/07/20121018_Fig_8.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_8.png rename to docs/assets/images/2016/07/20121018_Fig_8.png diff --git a/assets/images/2016/07/20121018_Fig_9.png b/docs/assets/images/2016/07/20121018_Fig_9.png similarity index 100% rename from assets/images/2016/07/20121018_Fig_9.png rename to docs/assets/images/2016/07/20121018_Fig_9.png diff --git a/assets/images/2016/07/20130101_Fig_1.png b/docs/assets/images/2016/07/20130101_Fig_1.png similarity index 100% rename from assets/images/2016/07/20130101_Fig_1.png rename to docs/assets/images/2016/07/20130101_Fig_1.png diff --git a/assets/images/2016/07/20130101_Fig_2.png b/docs/assets/images/2016/07/20130101_Fig_2.png similarity index 100% rename from assets/images/2016/07/20130101_Fig_2.png rename to docs/assets/images/2016/07/20130101_Fig_2.png diff --git a/assets/images/2016/07/20130101_Fig_3.png b/docs/assets/images/2016/07/20130101_Fig_3.png similarity index 100% rename from assets/images/2016/07/20130101_Fig_3.png rename to docs/assets/images/2016/07/20130101_Fig_3.png diff --git a/assets/images/2016/07/20130101_Fig_4.png b/docs/assets/images/2016/07/20130101_Fig_4.png similarity index 100% rename from assets/images/2016/07/20130101_Fig_4.png rename to docs/assets/images/2016/07/20130101_Fig_4.png diff --git a/assets/images/2016/07/20130101_Fig_5.png b/docs/assets/images/2016/07/20130101_Fig_5.png similarity index 100% rename from assets/images/2016/07/20130101_Fig_5.png rename to docs/assets/images/2016/07/20130101_Fig_5.png diff --git a/assets/images/2016/07/20130101_Fig_6.png b/docs/assets/images/2016/07/20130101_Fig_6.png similarity index 100% rename from assets/images/2016/07/20130101_Fig_6.png rename to docs/assets/images/2016/07/20130101_Fig_6.png diff --git a/assets/images/2016/07/20130118_Fig_1.png b/docs/assets/images/2016/07/20130118_Fig_1.png similarity index 100% rename from assets/images/2016/07/20130118_Fig_1.png rename to docs/assets/images/2016/07/20130118_Fig_1.png diff --git a/assets/images/2016/07/20130118_Fig_2.png b/docs/assets/images/2016/07/20130118_Fig_2.png similarity index 100% rename from assets/images/2016/07/20130118_Fig_2.png rename to docs/assets/images/2016/07/20130118_Fig_2.png diff --git a/assets/images/2016/07/20130118_Fig_3.png b/docs/assets/images/2016/07/20130118_Fig_3.png similarity index 100% rename from assets/images/2016/07/20130118_Fig_3.png rename to docs/assets/images/2016/07/20130118_Fig_3.png diff --git a/assets/images/2016/07/20130118_Fig_4.png b/docs/assets/images/2016/07/20130118_Fig_4.png similarity index 100% rename from assets/images/2016/07/20130118_Fig_4.png rename to docs/assets/images/2016/07/20130118_Fig_4.png diff --git a/assets/images/2016/07/20130317_Fig_1.png b/docs/assets/images/2016/07/20130317_Fig_1.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_1.png rename to docs/assets/images/2016/07/20130317_Fig_1.png diff --git a/assets/images/2016/07/20130317_Fig_10.png b/docs/assets/images/2016/07/20130317_Fig_10.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_10.png rename to docs/assets/images/2016/07/20130317_Fig_10.png diff --git a/assets/images/2016/07/20130317_Fig_11.png b/docs/assets/images/2016/07/20130317_Fig_11.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_11.png rename to docs/assets/images/2016/07/20130317_Fig_11.png diff --git a/assets/images/2016/07/20130317_Fig_12.png b/docs/assets/images/2016/07/20130317_Fig_12.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_12.png rename to docs/assets/images/2016/07/20130317_Fig_12.png diff --git a/assets/images/2016/07/20130317_Fig_2.png b/docs/assets/images/2016/07/20130317_Fig_2.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_2.png rename to docs/assets/images/2016/07/20130317_Fig_2.png diff --git a/assets/images/2016/07/20130317_Fig_3.png b/docs/assets/images/2016/07/20130317_Fig_3.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_3.png rename to docs/assets/images/2016/07/20130317_Fig_3.png diff --git a/assets/images/2016/07/20130317_Fig_4.png b/docs/assets/images/2016/07/20130317_Fig_4.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_4.png rename to docs/assets/images/2016/07/20130317_Fig_4.png diff --git a/assets/images/2016/07/20130317_Fig_5.png b/docs/assets/images/2016/07/20130317_Fig_5.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_5.png rename to docs/assets/images/2016/07/20130317_Fig_5.png diff --git a/assets/images/2016/07/20130317_Fig_6.png b/docs/assets/images/2016/07/20130317_Fig_6.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_6.png rename to docs/assets/images/2016/07/20130317_Fig_6.png diff --git a/assets/images/2016/07/20130317_Fig_7.png b/docs/assets/images/2016/07/20130317_Fig_7.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_7.png rename to docs/assets/images/2016/07/20130317_Fig_7.png diff --git a/assets/images/2016/07/20130317_Fig_8.png b/docs/assets/images/2016/07/20130317_Fig_8.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_8.png rename to docs/assets/images/2016/07/20130317_Fig_8.png diff --git a/assets/images/2016/07/20130317_Fig_9.png b/docs/assets/images/2016/07/20130317_Fig_9.png similarity index 100% rename from assets/images/2016/07/20130317_Fig_9.png rename to docs/assets/images/2016/07/20130317_Fig_9.png diff --git a/assets/images/2016/07/20160718_Fig_1.PNG b/docs/assets/images/2016/07/20160718_Fig_1.PNG similarity index 100% rename from assets/images/2016/07/20160718_Fig_1.PNG rename to docs/assets/images/2016/07/20160718_Fig_1.PNG diff --git a/assets/images/2016/07/20160718_Fig_2.PNG b/docs/assets/images/2016/07/20160718_Fig_2.PNG similarity index 100% rename from assets/images/2016/07/20160718_Fig_2.PNG rename to docs/assets/images/2016/07/20160718_Fig_2.PNG diff --git a/assets/images/2016/07/20160718_Fig_3.PNG b/docs/assets/images/2016/07/20160718_Fig_3.PNG similarity index 100% rename from assets/images/2016/07/20160718_Fig_3.PNG rename to docs/assets/images/2016/07/20160718_Fig_3.PNG diff --git a/assets/images/2016/07/20160718_Fig_4.PNG b/docs/assets/images/2016/07/20160718_Fig_4.PNG similarity index 100% rename from assets/images/2016/07/20160718_Fig_4.PNG rename to docs/assets/images/2016/07/20160718_Fig_4.PNG diff --git a/assets/images/2016/07/Figure-1-1.png b/docs/assets/images/2016/07/Figure-1-1.png similarity index 100% rename from assets/images/2016/07/Figure-1-1.png rename to docs/assets/images/2016/07/Figure-1-1.png diff --git a/assets/images/2016/07/Figure-2.png b/docs/assets/images/2016/07/Figure-2.png similarity index 100% rename from assets/images/2016/07/Figure-2.png rename to docs/assets/images/2016/07/Figure-2.png diff --git a/assets/images/2016/07/Figure-3.png b/docs/assets/images/2016/07/Figure-3.png similarity index 100% rename from assets/images/2016/07/Figure-3.png rename to docs/assets/images/2016/07/Figure-3.png diff --git a/assets/images/2016/07/Figure-4.png b/docs/assets/images/2016/07/Figure-4.png similarity index 100% rename from assets/images/2016/07/Figure-4.png rename to docs/assets/images/2016/07/Figure-4.png diff --git a/assets/images/2016/07/Figure-5.png b/docs/assets/images/2016/07/Figure-5.png similarity index 100% rename from assets/images/2016/07/Figure-5.png rename to docs/assets/images/2016/07/Figure-5.png diff --git a/assets/images/2016/07/Maitreya.png b/docs/assets/images/2016/07/Maitreya.png similarity index 100% rename from assets/images/2016/07/Maitreya.png rename to docs/assets/images/2016/07/Maitreya.png diff --git a/assets/images/2016/07/Workday-Time-Diff-mono.svg b/docs/assets/images/2016/07/Workday-Time-Diff-mono.svg similarity index 100% rename from assets/images/2016/07/Workday-Time-Diff-mono.svg rename to docs/assets/images/2016/07/Workday-Time-Diff-mono.svg diff --git a/assets/images/2016/07/Workday-Time-Diff.svg b/docs/assets/images/2016/07/Workday-Time-Diff.svg similarity index 100% rename from assets/images/2016/07/Workday-Time-Diff.svg rename to docs/assets/images/2016/07/Workday-Time-Diff.svg diff --git a/assets/images/2016/07/advanced-dns-3-6-2016-171.png b/docs/assets/images/2016/07/advanced-dns-3-6-2016-171.png similarity index 100% rename from assets/images/2016/07/advanced-dns-3-6-2016-171.png rename to docs/assets/images/2016/07/advanced-dns-3-6-2016-171.png diff --git a/assets/images/2016/07/profile.PNG b/docs/assets/images/2016/07/profile.PNG similarity index 100% rename from assets/images/2016/07/profile.PNG rename to docs/assets/images/2016/07/profile.PNG diff --git a/assets/images/2016/09/ComputerFrustration.jpg b/docs/assets/images/2016/09/ComputerFrustration.jpg similarity index 100% rename from assets/images/2016/09/ComputerFrustration.jpg rename to docs/assets/images/2016/09/ComputerFrustration.jpg diff --git a/assets/images/2017/02/Administration-Command.PNG b/docs/assets/images/2017/02/Administration-Command.PNG similarity index 100% rename from assets/images/2017/02/Administration-Command.PNG rename to docs/assets/images/2017/02/Administration-Command.PNG diff --git a/assets/images/2017/02/Administration-Management.PNG b/docs/assets/images/2017/02/Administration-Management.PNG similarity index 100% rename from assets/images/2017/02/Administration-Management.PNG rename to docs/assets/images/2017/02/Administration-Management.PNG diff --git a/assets/images/2017/02/CuteMarkEd-2017-02-12-20-02-02.png b/docs/assets/images/2017/02/CuteMarkEd-2017-02-12-20-02-02.png similarity index 100% rename from assets/images/2017/02/CuteMarkEd-2017-02-12-20-02-02.png rename to docs/assets/images/2017/02/CuteMarkEd-2017-02-12-20-02-02.png diff --git a/assets/images/2017/02/DDNS.PNG b/docs/assets/images/2017/02/DDNS.PNG similarity index 100% rename from assets/images/2017/02/DDNS.PNG rename to docs/assets/images/2017/02/DDNS.PNG diff --git a/assets/images/2017/02/DateGantt.PNG b/docs/assets/images/2017/02/DateGantt.PNG similarity index 100% rename from assets/images/2017/02/DateGantt.PNG rename to docs/assets/images/2017/02/DateGantt.PNG diff --git a/assets/images/2017/02/GanttChartCuteMarkEd-1.PNG b/docs/assets/images/2017/02/GanttChartCuteMarkEd-1.PNG similarity index 100% rename from assets/images/2017/02/GanttChartCuteMarkEd-1.PNG rename to docs/assets/images/2017/02/GanttChartCuteMarkEd-1.PNG diff --git a/assets/images/2017/02/GanttChartCuteMarkEd-2.PNG b/docs/assets/images/2017/02/GanttChartCuteMarkEd-2.PNG similarity index 100% rename from assets/images/2017/02/GanttChartCuteMarkEd-2.PNG rename to docs/assets/images/2017/02/GanttChartCuteMarkEd-2.PNG diff --git a/assets/images/2017/02/GanttChartCuteMarkEd.PNG b/docs/assets/images/2017/02/GanttChartCuteMarkEd.PNG similarity index 100% rename from assets/images/2017/02/GanttChartCuteMarkEd.PNG rename to docs/assets/images/2017/02/GanttChartCuteMarkEd.PNG diff --git a/assets/images/2017/02/NAT-QOS-PortForwarding.PNG b/docs/assets/images/2017/02/NAT-QOS-PortForwarding.PNG similarity index 100% rename from assets/images/2017/02/NAT-QOS-PortForwarding.PNG rename to docs/assets/images/2017/02/NAT-QOS-PortForwarding.PNG diff --git a/assets/images/2017/02/NAT-QOS-PortRangeForwarding.PNG b/docs/assets/images/2017/02/NAT-QOS-PortRangeForwarding.PNG similarity index 100% rename from assets/images/2017/02/NAT-QOS-PortRangeForwarding.PNG rename to docs/assets/images/2017/02/NAT-QOS-PortRangeForwarding.PNG diff --git a/assets/images/2017/02/Services-Services.PNG b/docs/assets/images/2017/02/Services-Services.PNG similarity index 100% rename from assets/images/2017/02/Services-Services.PNG rename to docs/assets/images/2017/02/Services-Services.PNG diff --git a/assets/images/2017/02/SetupBasicSetup_1.PNG b/docs/assets/images/2017/02/SetupBasicSetup_1.PNG similarity index 100% rename from assets/images/2017/02/SetupBasicSetup_1.PNG rename to docs/assets/images/2017/02/SetupBasicSetup_1.PNG diff --git a/assets/images/2017/02/SetupBasicSetup_2.PNG b/docs/assets/images/2017/02/SetupBasicSetup_2.PNG similarity index 100% rename from assets/images/2017/02/SetupBasicSetup_2.PNG rename to docs/assets/images/2017/02/SetupBasicSetup_2.PNG diff --git a/assets/images/2017/02/Wireless-Basic-Settings.PNG b/docs/assets/images/2017/02/Wireless-Basic-Settings.PNG similarity index 100% rename from assets/images/2017/02/Wireless-Basic-Settings.PNG rename to docs/assets/images/2017/02/Wireless-Basic-Settings.PNG diff --git a/assets/images/2017/02/Wireless-Wireless-Security.PNG b/docs/assets/images/2017/02/Wireless-Wireless-Security.PNG similarity index 100% rename from assets/images/2017/02/Wireless-Wireless-Security.PNG rename to docs/assets/images/2017/02/Wireless-Wireless-Security.PNG diff --git a/assets/images/2017/10/Screenshot-from-2017-10-17-23-32-43.png b/docs/assets/images/2017/10/Screenshot-from-2017-10-17-23-32-43.png similarity index 100% rename from assets/images/2017/10/Screenshot-from-2017-10-17-23-32-43.png rename to docs/assets/images/2017/10/Screenshot-from-2017-10-17-23-32-43.png diff --git a/assets/images/2017/10/finish-install-process.PNG b/docs/assets/images/2017/10/finish-install-process.PNG similarity index 100% rename from assets/images/2017/10/finish-install-process.PNG rename to docs/assets/images/2017/10/finish-install-process.PNG diff --git a/assets/images/2017/10/nginx-not-found.PNG b/docs/assets/images/2017/10/nginx-not-found.PNG similarity index 100% rename from assets/images/2017/10/nginx-not-found.PNG rename to docs/assets/images/2017/10/nginx-not-found.PNG diff --git a/assets/images/2017/11/Menu_001.png b/docs/assets/images/2017/11/Menu_001.png similarity index 100% rename from assets/images/2017/11/Menu_001.png rename to docs/assets/images/2017/11/Menu_001.png diff --git a/assets/images/2018/01/20171219_163816.jpg b/docs/assets/images/2018/01/20171219_163816.jpg similarity index 100% rename from assets/images/2018/01/20171219_163816.jpg rename to docs/assets/images/2018/01/20171219_163816.jpg diff --git a/assets/images/2018/01/Workday-Time-Diff-mono.svg b/docs/assets/images/2018/01/Workday-Time-Diff-mono.svg similarity index 100% rename from assets/images/2018/01/Workday-Time-Diff-mono.svg rename to docs/assets/images/2018/01/Workday-Time-Diff-mono.svg diff --git a/assets/images/2018/01/Workday-Time-Diff.svg b/docs/assets/images/2018/01/Workday-Time-Diff.svg similarity index 100% rename from assets/images/2018/01/Workday-Time-Diff.svg rename to docs/assets/images/2018/01/Workday-Time-Diff.svg diff --git a/assets/images/2018/06/Gajim_2018-06-15_17-10-11.png b/docs/assets/images/2018/06/Gajim_2018-06-15_17-10-11.png similarity index 100% rename from assets/images/2018/06/Gajim_2018-06-15_17-10-11.png rename to docs/assets/images/2018/06/Gajim_2018-06-15_17-10-11.png diff --git a/assets/images/2018/06/PUTTY_2018-06-15_12-08-21.png b/docs/assets/images/2018/06/PUTTY_2018-06-15_12-08-21.png similarity index 100% rename from assets/images/2018/06/PUTTY_2018-06-15_12-08-21.png rename to docs/assets/images/2018/06/PUTTY_2018-06-15_12-08-21.png diff --git a/assets/images/2018/06/PUTTY_2018-06-15_12-19-30.png b/docs/assets/images/2018/06/PUTTY_2018-06-15_12-19-30.png similarity index 100% rename from assets/images/2018/06/PUTTY_2018-06-15_12-19-30.png rename to docs/assets/images/2018/06/PUTTY_2018-06-15_12-19-30.png diff --git a/assets/images/2018/06/PUTTY_2018-06-15_12-49-42.png b/docs/assets/images/2018/06/PUTTY_2018-06-15_12-49-42.png similarity index 100% rename from assets/images/2018/06/PUTTY_2018-06-15_12-49-42.png rename to docs/assets/images/2018/06/PUTTY_2018-06-15_12-49-42.png diff --git a/assets/images/2018/06/PUTTY_2018-06-15_17-23-18.png b/docs/assets/images/2018/06/PUTTY_2018-06-15_17-23-18.png similarity index 100% rename from assets/images/2018/06/PUTTY_2018-06-15_17-23-18.png rename to docs/assets/images/2018/06/PUTTY_2018-06-15_17-23-18.png diff --git a/assets/images/2018/06/chrome_2018-06-15_11-34-57.png b/docs/assets/images/2018/06/chrome_2018-06-15_11-34-57.png similarity index 100% rename from assets/images/2018/06/chrome_2018-06-15_11-34-57.png rename to docs/assets/images/2018/06/chrome_2018-06-15_11-34-57.png diff --git a/assets/images/2018/06/chrome_2018-06-15_11-43-31.png b/docs/assets/images/2018/06/chrome_2018-06-15_11-43-31.png similarity index 100% rename from assets/images/2018/06/chrome_2018-06-15_11-43-31.png rename to docs/assets/images/2018/06/chrome_2018-06-15_11-43-31.png diff --git a/assets/images/2018/06/chrome_2018-06-15_11-48-32.png b/docs/assets/images/2018/06/chrome_2018-06-15_11-48-32.png similarity index 100% rename from assets/images/2018/06/chrome_2018-06-15_11-48-32.png rename to docs/assets/images/2018/06/chrome_2018-06-15_11-48-32.png diff --git a/assets/images/2018/06/chrome_2018-06-15_11-53-35.png b/docs/assets/images/2018/06/chrome_2018-06-15_11-53-35.png similarity index 100% rename from assets/images/2018/06/chrome_2018-06-15_11-53-35.png rename to docs/assets/images/2018/06/chrome_2018-06-15_11-53-35.png diff --git a/assets/images/2018/06/chrome_2018-06-15_17-02-32.png b/docs/assets/images/2018/06/chrome_2018-06-15_17-02-32.png similarity index 100% rename from assets/images/2018/06/chrome_2018-06-15_17-02-32.png rename to docs/assets/images/2018/06/chrome_2018-06-15_17-02-32.png diff --git a/assets/images/2018/09/DSC_0469.JPG b/docs/assets/images/2018/09/DSC_0469.JPG similarity index 100% rename from assets/images/2018/09/DSC_0469.JPG rename to docs/assets/images/2018/09/DSC_0469.JPG diff --git a/assets/images/2020/05/2020-05-1919-17-07.png b/docs/assets/images/2020/05/2020-05-1919-17-07.png similarity index 100% rename from assets/images/2020/05/2020-05-1919-17-07.png rename to docs/assets/images/2020/05/2020-05-1919-17-07.png diff --git a/assets/images/2020/05/2020-05-1919-17-07_o.png b/docs/assets/images/2020/05/2020-05-1919-17-07_o.png similarity index 100% rename from assets/images/2020/05/2020-05-1919-17-07_o.png rename to docs/assets/images/2020/05/2020-05-1919-17-07_o.png diff --git a/assets/images/2020/05/2020-05-1919-46-13-1.png b/docs/assets/images/2020/05/2020-05-1919-46-13-1.png similarity index 100% rename from assets/images/2020/05/2020-05-1919-46-13-1.png rename to docs/assets/images/2020/05/2020-05-1919-46-13-1.png diff --git a/assets/images/2020/05/2020-05-1919-46-13_o-1.png b/docs/assets/images/2020/05/2020-05-1919-46-13_o-1.png similarity index 100% rename from assets/images/2020/05/2020-05-1919-46-13_o-1.png rename to docs/assets/images/2020/05/2020-05-1919-46-13_o-1.png diff --git a/assets/images/2020/05/2020-05-1920-34-14.png b/docs/assets/images/2020/05/2020-05-1920-34-14.png similarity index 100% rename from assets/images/2020/05/2020-05-1920-34-14.png rename to docs/assets/images/2020/05/2020-05-1920-34-14.png diff --git a/assets/images/2020/05/2020-05-1920-34-14_o.png b/docs/assets/images/2020/05/2020-05-1920-34-14_o.png similarity index 100% rename from assets/images/2020/05/2020-05-1920-34-14_o.png rename to docs/assets/images/2020/05/2020-05-1920-34-14_o.png diff --git a/assets/images/2020/05/2020-05-1920-35-14.png b/docs/assets/images/2020/05/2020-05-1920-35-14.png similarity index 100% rename from assets/images/2020/05/2020-05-1920-35-14.png rename to docs/assets/images/2020/05/2020-05-1920-35-14.png diff --git a/assets/images/2020/05/2020-05-1920-35-14_o.png b/docs/assets/images/2020/05/2020-05-1920-35-14_o.png similarity index 100% rename from assets/images/2020/05/2020-05-1920-35-14_o.png rename to docs/assets/images/2020/05/2020-05-1920-35-14_o.png diff --git a/assets/images/2021/03/00aec12e25c74fed8e124e788850090e.png b/docs/assets/images/2021/03/00aec12e25c74fed8e124e788850090e.png similarity index 100% rename from assets/images/2021/03/00aec12e25c74fed8e124e788850090e.png rename to docs/assets/images/2021/03/00aec12e25c74fed8e124e788850090e.png diff --git a/assets/images/2021/03/00aec12e25c74fed8e124e788850090e_o.png b/docs/assets/images/2021/03/00aec12e25c74fed8e124e788850090e_o.png similarity index 100% rename from assets/images/2021/03/00aec12e25c74fed8e124e788850090e_o.png rename to docs/assets/images/2021/03/00aec12e25c74fed8e124e788850090e_o.png diff --git a/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2.png b/docs/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2.png similarity index 100% rename from assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2.png rename to docs/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2.png diff --git a/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2_o.png b/docs/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2_o.png similarity index 100% rename from assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2_o.png rename to docs/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2_o.png diff --git a/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85.png b/docs/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85.png similarity index 100% rename from assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85.png rename to docs/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85.png diff --git a/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85_o.png b/docs/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85_o.png similarity index 100% rename from assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85_o.png rename to docs/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85_o.png diff --git a/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a.png b/docs/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a.png similarity index 100% rename from assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a.png rename to docs/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a.png diff --git a/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a_o.png b/docs/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a_o.png similarity index 100% rename from assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a_o.png rename to docs/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a_o.png diff --git a/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1.png b/docs/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1.png similarity index 100% rename from assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1.png rename to docs/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1.png diff --git a/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1_o.png b/docs/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1_o.png similarity index 100% rename from assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1_o.png rename to docs/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1_o.png diff --git a/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565.png b/docs/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565.png similarity index 100% rename from assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565.png rename to docs/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565.png diff --git a/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565_o.png b/docs/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565_o.png similarity index 100% rename from assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565_o.png rename to docs/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565_o.png diff --git a/assets/images/2021/03/64ed999845d644239615c3b0e2aab454.png b/docs/assets/images/2021/03/64ed999845d644239615c3b0e2aab454.png similarity index 100% rename from assets/images/2021/03/64ed999845d644239615c3b0e2aab454.png rename to docs/assets/images/2021/03/64ed999845d644239615c3b0e2aab454.png diff --git a/assets/images/2021/03/64ed999845d644239615c3b0e2aab454_o.png b/docs/assets/images/2021/03/64ed999845d644239615c3b0e2aab454_o.png similarity index 100% rename from assets/images/2021/03/64ed999845d644239615c3b0e2aab454_o.png rename to docs/assets/images/2021/03/64ed999845d644239615c3b0e2aab454_o.png diff --git a/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e.png b/docs/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e.png similarity index 100% rename from assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e.png rename to docs/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e.png diff --git a/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e_o.png b/docs/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e_o.png similarity index 100% rename from assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e_o.png rename to docs/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e_o.png diff --git a/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d.png b/docs/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d.png similarity index 100% rename from assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d.png rename to docs/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d.png diff --git a/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d_o.png b/docs/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d_o.png similarity index 100% rename from assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d_o.png rename to docs/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d_o.png diff --git a/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d.png b/docs/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d.png similarity index 100% rename from assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d.png rename to docs/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d.png diff --git a/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d_o.png b/docs/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d_o.png similarity index 100% rename from assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d_o.png rename to docs/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d_o.png diff --git a/assets/images/2021/03/ProfilePix.jpg b/docs/assets/images/2021/03/ProfilePix.jpg similarity index 100% rename from assets/images/2021/03/ProfilePix.jpg rename to docs/assets/images/2021/03/ProfilePix.jpg diff --git a/assets/images/2021/03/ProfilePix_o.jpg b/docs/assets/images/2021/03/ProfilePix_o.jpg similarity index 100% rename from assets/images/2021/03/ProfilePix_o.jpg rename to docs/assets/images/2021/03/ProfilePix_o.jpg diff --git a/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67.png b/docs/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67.png similarity index 100% rename from assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67.png rename to docs/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67.png diff --git a/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67_o.png b/docs/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67_o.png similarity index 100% rename from assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67_o.png rename to docs/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67_o.png diff --git a/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c.png b/docs/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c.png similarity index 100% rename from assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c.png rename to docs/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c.png diff --git a/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c_o.png b/docs/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c_o.png similarity index 100% rename from assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c_o.png rename to docs/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c_o.png diff --git a/assets/images/2021/03/d417b24684524a05985e737b656b55a9.png b/docs/assets/images/2021/03/d417b24684524a05985e737b656b55a9.png similarity index 100% rename from assets/images/2021/03/d417b24684524a05985e737b656b55a9.png rename to docs/assets/images/2021/03/d417b24684524a05985e737b656b55a9.png diff --git a/assets/images/2021/03/d417b24684524a05985e737b656b55a9_o.png b/docs/assets/images/2021/03/d417b24684524a05985e737b656b55a9_o.png similarity index 100% rename from assets/images/2021/03/d417b24684524a05985e737b656b55a9_o.png rename to docs/assets/images/2021/03/d417b24684524a05985e737b656b55a9_o.png diff --git a/assets/images/2021/03/tidepool.png b/docs/assets/images/2021/03/tidepool.png similarity index 100% rename from assets/images/2021/03/tidepool.png rename to docs/assets/images/2021/03/tidepool.png diff --git a/assets/images/2021/03/tidepool_o.png b/docs/assets/images/2021/03/tidepool_o.png similarity index 100% rename from assets/images/2021/03/tidepool_o.png rename to docs/assets/images/2021/03/tidepool_o.png diff --git a/assets/images/2023/01/1.png b/docs/assets/images/2023/01/1.png similarity index 100% rename from assets/images/2023/01/1.png rename to docs/assets/images/2023/01/1.png diff --git a/assets/images/2023/01/2.png b/docs/assets/images/2023/01/2.png similarity index 100% rename from assets/images/2023/01/2.png rename to docs/assets/images/2023/01/2.png diff --git a/assets/images/2023/01/3.png b/docs/assets/images/2023/01/3.png similarity index 100% rename from assets/images/2023/01/3.png rename to docs/assets/images/2023/01/3.png diff --git a/assets/images/2023/01/4.png b/docs/assets/images/2023/01/4.png similarity index 100% rename from assets/images/2023/01/4.png rename to docs/assets/images/2023/01/4.png diff --git a/assets/images/2023/01/5.png b/docs/assets/images/2023/01/5.png similarity index 100% rename from assets/images/2023/01/5.png rename to docs/assets/images/2023/01/5.png diff --git a/assets/images/2023/01/6.png b/docs/assets/images/2023/01/6.png similarity index 100% rename from assets/images/2023/01/6.png rename to docs/assets/images/2023/01/6.png diff --git a/assets/images/2023/01/7.png b/docs/assets/images/2023/01/7.png similarity index 100% rename from assets/images/2023/01/7.png rename to docs/assets/images/2023/01/7.png diff --git a/docs/assets/images/2024/232877297-2d3a2914-8a7f-4f20-bba1-af8d0e92c039.png b/docs/assets/images/2024/232877297-2d3a2914-8a7f-4f20-bba1-af8d0e92c039.png new file mode 100644 index 0000000..86d7431 Binary files /dev/null and b/docs/assets/images/2024/232877297-2d3a2914-8a7f-4f20-bba1-af8d0e92c039.png differ diff --git a/docs/assets/images/2024/232879216-22e3b81c-10d0-449f-80d1-30725c24b5ff.png b/docs/assets/images/2024/232879216-22e3b81c-10d0-449f-80d1-30725c24b5ff.png new file mode 100644 index 0000000..0d10dac Binary files /dev/null and b/docs/assets/images/2024/232879216-22e3b81c-10d0-449f-80d1-30725c24b5ff.png differ diff --git a/docs/assets/images/2024/232881326-f2ecdd14-8bf6-4f7b-bcd4-3e5de4f361a2.png b/docs/assets/images/2024/232881326-f2ecdd14-8bf6-4f7b-bcd4-3e5de4f361a2.png new file mode 100644 index 0000000..a1f5fd7 Binary files /dev/null and b/docs/assets/images/2024/232881326-f2ecdd14-8bf6-4f7b-bcd4-3e5de4f361a2.png differ diff --git a/docs/assets/images/2024/232881685-6a0eafd9-a5be-464b-ae0c-5814b101fc02.png b/docs/assets/images/2024/232881685-6a0eafd9-a5be-464b-ae0c-5814b101fc02.png new file mode 100644 index 0000000..4e1fc9a Binary files /dev/null and b/docs/assets/images/2024/232881685-6a0eafd9-a5be-464b-ae0c-5814b101fc02.png differ diff --git a/docs/assets/images/2024/232882657-dd1e4e69-26a3-4849-8e94-9811cedab6d7.png b/docs/assets/images/2024/232882657-dd1e4e69-26a3-4849-8e94-9811cedab6d7.png new file mode 100644 index 0000000..604c624 Binary files /dev/null and b/docs/assets/images/2024/232882657-dd1e4e69-26a3-4849-8e94-9811cedab6d7.png differ diff --git a/docs/assets/images/2024/357450387-8c9a7f4c-21a4-42a7-8951-1f4b301fa269.jpeg b/docs/assets/images/2024/357450387-8c9a7f4c-21a4-42a7-8951-1f4b301fa269.jpeg new file mode 100644 index 0000000..01f341b Binary files /dev/null and b/docs/assets/images/2024/357450387-8c9a7f4c-21a4-42a7-8951-1f4b301fa269.jpeg differ diff --git a/docs/assets/images/2024/357452219-097dab9f-33a0-4f4a-a807-15923b754e65.jpeg b/docs/assets/images/2024/357452219-097dab9f-33a0-4f4a-a807-15923b754e65.jpeg new file mode 100644 index 0000000..7cc2ca9 Binary files /dev/null and b/docs/assets/images/2024/357452219-097dab9f-33a0-4f4a-a807-15923b754e65.jpeg differ diff --git a/docs/assets/images/2024/357452627-5a295ec2-ab6c-447f-b485-d70166997eba.png b/docs/assets/images/2024/357452627-5a295ec2-ab6c-447f-b485-d70166997eba.png new file mode 100644 index 0000000..b30b6f8 Binary files /dev/null and b/docs/assets/images/2024/357452627-5a295ec2-ab6c-447f-b485-d70166997eba.png differ diff --git a/docs/assets/images/2024/358212031-4caa35b9-9c71-4862-9dc1-a0c0c111fe23.png b/docs/assets/images/2024/358212031-4caa35b9-9c71-4862-9dc1-a0c0c111fe23.png new file mode 100644 index 0000000..2bc93c3 Binary files /dev/null and b/docs/assets/images/2024/358212031-4caa35b9-9c71-4862-9dc1-a0c0c111fe23.png differ diff --git a/docs/assets/images/2024/358212180-a00cb3b5-497a-4401-810b-1276e7012641.png b/docs/assets/images/2024/358212180-a00cb3b5-497a-4401-810b-1276e7012641.png new file mode 100644 index 0000000..f64117a Binary files /dev/null and b/docs/assets/images/2024/358212180-a00cb3b5-497a-4401-810b-1276e7012641.png differ diff --git a/assets/images/profile_pix/profile_1.jpg b/docs/assets/images/profile_pix/profile_1.jpg similarity index 100% rename from assets/images/profile_pix/profile_1.jpg rename to docs/assets/images/profile_pix/profile_1.jpg diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css new file mode 100644 index 0000000..633bd6d --- /dev/null +++ b/docs/assets/stylesheets/extra.css @@ -0,0 +1,353 @@ +/* global variables */ +:root { + --md-hr-color: #ef7109; + --md-tag-fg-color--lightest: #fff4e5; + --md-tag-fg-color--lighter: maroon; + --md-table-header-bg-color: #fff4e5; + --md-table-header-font-color: maroon; + --md-typeset-a-color: green; + --md-pagination-bg-color: #ef7109; + --md-pagination-font-color: white; + --md-custom-slider-bg-color: #f3f0ec; + --md-nf-line-color: black; + --md-net-carb-font-color: green; + --md-cookmark: #d9ffe3; + --md-admonition-icon--tip: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--tag: url('data:image/svg+xml;charset=utf-8,'); + /*for tag cloud*/ + --md-color-blue: #3a86ff; + --md-color-purple: #8338ec; + --md-color-pinkred: #ff006e; + --md-color-orange: #fb5607; + --md-color-yellow: #ffbe0b; + --md-color-green: #69aa0d; + --md-color-lightgreen: #397e03; + --md-color-red: #f30731; + --md-color-navy: #24149d; + --md-color-skyblue: #05aaf7; + --md-color-lightyellow: #ffc971; + --md-color-lightpurple: #392f5a; +} + +[data-md-color-primary=orange]:not([data-md-color-scheme=slate]) { + --md-typeset-a-color: maroon; +} + +[data-md-color-scheme=slate] { + --md-hr-color: #ffa724; + --md-tag-fg-color--lightest: maroon; + --md-tag-fg-color--lighter: #fff4e5; + --md-table-header-bg-color: #ffa724; + --md-table-header-font-color: black; + --md-pagination-bg-color: #ffa724; + --md-pagination-font-color: black; + --md-custom-slider-bg-color: black; + --md-nf-line-color: white; + --md-net-carb-font-color: #08e508; + --md-cookmark: green; + /*for tag cloud*/ + --md-color-blue: #6da3fa; + --md-color-purple: #a76ef8; + --md-color-pinkred: #ff006e; + --md-color-orange: #fb5607; + --md-color-yellow: #ffbe0b; + --md-color-green: #04f620; + --md-color-lightgreen: #90be6d; + --md-color-red: #f30731; + --md-color-navy: #b5acf9; + --md-color-skyblue: #8ecae6; + --md-color-lightyellow: #ffc971; + --md-color-lightpurple: #e76ef7; +} + +/* search input */ +/*This css ensures that the search box is not shown and only the icon is shown.*/ + +[data-md-color-primary] .md-search__form { + background-color: transparent; +} +@media screen and (min-width: 60em) { + .md-search__inner { + width: 2.2rem; + } +} + +/* main content */ +/*This will ensure page width is bigger*/ +.md-grid { + max-width: 100%; +} + +/* navigation */ +.md-tabs__link.md-tabs__link--active, +.md-nav__link.md-nav__link--active { + font-weight: 700; +} + + +/*Fix to display numbers instead of alphbets in cards*/ +.md-typeset ol ol,.md-typeset ul ol { + list-style-type: auto; +} + +/*Header*/ +/* headers */ +.md-typeset h1 { + color: var(--md-hr-color); + text-align: center; + font-size: 2em; + margin: 0 0 0.5em 0; +} +.md-typeset h2 { + color: var(--md-hr-color); + font-size: 1.6em; + margin: 1.6em 0 0.5em 0; + padding-bottom: 0.125em; + border-bottom: 2px solid var(--md-hr-color); +} +.md-typeset h3 { + color: var(--md-hr-color); + font-size: 1.4em; + margin: 1.6em 0 0.5em 0; + border-bottom: 1px dashed var(--md-hr-color); +} +.md-typeset h4 { + font-size: 1.2em; + /* font-weight: normal; */ + margin: 1.6em 0 0.5em 0; + text-decoration: underline; + text-underline-offset: 0.25em; +} + +/* cookmark */ +.md-typeset cookmark { + background: var(--md-cookmark); + border-radius: 10px; + padding: 2px 5px 2px 5px; +} + +/*Custom Site admonitions*/ +/*---------------------note----------------------------*/ +.md-typeset .admonition.site-note,.md-typeset details.site-note { + border-color: #ff9100 +} + +.md-typeset .admonition.site-note:focus-within,.md-typeset details.site-note:focus-within { + box-shadow: 0 0 0 .2rem #ff91001a +} + +.md-typeset .site-note>.admonition-title,.md-typeset .site-note>summary { + background-color: #ff91001a +} + +.md-typeset .site-note>.admonition-title:before,.md-typeset .site-note>summary:before { + background-color: #ff9100; + -webkit-mask-image: var(--md-admonition-icon--note); + mask-image: var(--md-admonition-icon--note) +} + +.md-typeset .site-note>.admonition-title:after,.md-typeset .site-note>summary:after { + color: #ff9100 +} +/*---------------------info-----------------*/ +.md-typeset .admonition.site-info,.md-typeset details.site-info { + border-color: #ff9100 +} + +.md-typeset .admonition.site-info:focus-within,.md-typeset details.site-info:focus-within { + box-shadow: 0 0 0 .2rem #ff91001a +} + +.md-typeset .site-info>.admonition-title,.md-typeset .site-info>summary { + background-color: #ff91001a +} + +.md-typeset .site-info>.admonition-title:before,.md-typeset .site-info>summary:before { + background-color: #ff9100; + -webkit-mask-image: var(--md-admonition-icon--info); + mask-image: var(--md-admonition-icon--info) +} + +.md-typeset .site-info>.admonition-title:after,.md-typeset .site-info>summary:after { + color: #ff9100 +} +/*-----------------abstract-----------------*/ +.md-typeset .admonition.site-abstract,.md-typeset details.site-abstract { + border-color: #ff9100 +} + +.md-typeset .admonition.site-abstract:focus-within,.md-typeset details.site-abstract:focus-within { + box-shadow: 0 0 0 .2rem #ff91001a +} + +.md-typeset .site-abstract>.admonition-title,.md-typeset .site-abstract>summary { + background-color: #ff91001a +} + +.md-typeset .site-abstract>.admonition-title:before,.md-typeset .site-abstract>summary:before { + background-color: #ff9100; + -webkit-mask-image: var(--md-admonition-icon--abstract); + mask-image: var(--md-admonition-icon--abstract) +} + +.md-typeset .site-abstract>.admonition-title:after,.md-typeset .site-abstract>summary:after { + color: #ff9100 +} +/*------------------tip---------------*/ +.md-typeset .admonition.site-tip,.md-typeset details.site-tip { + border-color: #ff9100 +} + +.md-typeset .admonition.site-tip:focus-within,.md-typeset details.site-tip:focus-within { + box-shadow: 0 0 0 .2rem #ff91001a +} + +.md-typeset .site-tip>.admonition-title,.md-typeset .site-tip>summary { + background-color: #ff91001a +} + +.md-typeset .site-tip>.admonition-title:before,.md-typeset .site-tip>summary:before { + background-color: #ff9100; + -webkit-mask-image: var(--md-admonition-icon--tip); + mask-image: var(--md-admonition-icon--tip) +} + +.md-typeset .site-tip>.admonition-title:after,.md-typeset .site-tip>summary:after { + color: #ff9100 +} +/*---------------------quote----------------------------*/ +.md-typeset .admonition.site-quote,.md-typeset details.site-quote { + border-color: #ff9100 +} + +.md-typeset .admonition.site-quote:focus-within,.md-typeset details.site-quote:focus-within { + box-shadow: 0 0 0 .2rem #ff91001a +} + +.md-typeset .site-quote>.admonition-title,.md-typeset .site-quote>summary { + background-color: #ff91001a +} + +.md-typeset .site-quote>.admonition-title:before,.md-typeset .site-quote>summary:before { + background-color: #ff9100; + -webkit-mask-image: var(--md-admonition-icon--quote); + mask-image: var(--md-admonition-icon--quote) +} + +.md-typeset .site-quote>.admonition-title:after,.md-typeset .site-quote>summary:after { + color: #ff9100 +} +/*---------------------tag----------------------------*/ +.md-typeset .admonition.site-tag,.md-typeset details.site-tag { + border-color: #ff9100 +} + +.md-typeset .admonition.site-tag:focus-within,.md-typeset details.site-tag:focus-within { + box-shadow: 0 0 0 .2rem #ff91001a +} + +.md-typeset .site-tag>.admonition-title,.md-typeset .site-tag>summary { + background-color: #ff91001a +} + +.md-typeset .site-tag>.admonition-title:before,.md-typeset .site-tag>summary:before { + background-color: #ff9100; + -webkit-mask-image: var(--md-admonition-icon--tag); + mask-image: var(--md-admonition-icon--tag) +} + +.md-typeset .site-tag>.admonition-title:after,.md-typeset .site-tag>summary:after { + color: #ff9100 +} + +/*tag labels*/ +.md-typeset .md-tag { + background: var(--md-tag-fg-color--lightest); + color: var(--md-tag-fg-color--lighter); +} + +.md-typeset .md-tag[href]{ + background: var(--md-tag-fg-color--lightest); + color: var(--md-tag-fg-color--lighter); +} + +.md-typeset .md-tag:before { + background-color: var(--md-tag-fg-color--lighter); + content: ""; + display: inline-block; + height: 1.2em; + -webkit-mask-image: var(--md-admonition-icon--tag); + mask-image: var(--md-admonition-icon--tag); + -webkit-mask-position: center; + mask-position: center; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-size: contain; + mask-size: contain; + transition: background-color 125ms; + vertical-align: text-bottom; + width: 1.2em +} + +.md-typeset .md-tag[href]:focus:before,.md-typeset .md-tag[href]:hover:before { + background-color: var(--md-accent-bg-color) +} +/*******************Tag Cloud and tag cloud content style*****************************/ +.tag-cloud { + margin-top:0; + margin-bottom: 0.5em; +} +.tag-cloud-content { + padding: 0 0.6rem; +} +/******************************table header********************************************/ +.md-typeset table:not([class]) { + width: 100%; /* Make the table take the full width of the container */ + table-layout: auto; /* Allow the table to adjust its layout based on content */ +} + +.md-typeset table:not([class]) th { + background-color: var(--md-table-header-bg-color); + color: var(--md-table-header-font-color); + font-weight: 700; + padding: .9375em 1.25em; + vertical-align: top; + min-width: 0; +}} +/******************header display on mobile for previous and next page***************************/ +.md-header__nav { + float: right; +} +.md-header__nav__inner:not([hidden]) { + display: flex; +} +/******************************mobile navigation************************************************/ +@media screen and (max-width:76.234375em) { + .md-nav--primary .md-nav__title { + background-color:var(--md-primary-fg-color); + color:var(--md-primary-bg-color); + cursor:pointer; + height:5.6rem; + line-height:2.4rem; + padding:3rem .8rem .2rem; + position:relative; + white-space:nowrap + } +} +/******************************Blog pagination style override************************************************/ +.md-pagination>* { + border-radius: 2em; +} +.md-pagination__current { + color: var(--md-pagination-font-color); + background-color: var(--md-pagination-bg-color); +} + +.md-post--excerpt { + background-color: var(--md-accent-fg-color--transparent); + box-shadow: 0 0 0 1rem var(--md-accent-fg-color--transparent); + border-radius: 0.5rem; + margin-top: 1.5rem; + margin-left: 1.5rem; + margin-right: 1.5rem; + } \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..65876c3 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,7 @@ +--- +hide: + - navigation + - toc +--- + +# All Articles \ No newline at end of file diff --git a/docs/posts/2009-08-11-aao-a150l-step-by-step-installation-process-for-linux4one.md b/docs/posts/2009-08-11-aao-a150l-step-by-step-installation-process-for-linux4one.md new file mode 100644 index 0000000..30db0e9 --- /dev/null +++ b/docs/posts/2009-08-11-aao-a150l-step-by-step-installation-process-for-linux4one.md @@ -0,0 +1,176 @@ +--- +title: AAO A150L Step by Step Installation Process for Linux4one +slug: aao-a150l-step-by-step-installation-process-for-linux4one +draft: False +description: AAO A150L - Step by Step Installation Process for Linux4one +authors: ['ankit'] +date: + created: 2009-08-11 22:02:00 + updated: 2009-08-11 22:02:00 +comments: true +--- +Linux4one is the only Linux distro other than pre-installed Linpus that worked out of the box on my and two other Acer aspire one A150L which belonged to my friends. With the GUI same as that for Ubuntu Netbook Remix, it is a fantastic OS to have on your machine. The only downside I felt was that the icons looked little washed out compared to those on actual UNR but that is not so much of an issue. Everything pretty much worked out of the box which matters the most. I did find the splash screen at the time of start-up a little childish but again these are not major issues. + + + +However if you would rather have a more professional look and feel, Ubuntu may be your choice. Refer to other post on step by step process for installing Ubuntu Netbook Remix but be forewarned that not everything works as well on UNR as of now, at least not for me. I am still working and finding out more on how these can work but given the fact that my knowledge of Linux is zero it can take some time. I have compiled these tutorials solely by hunting on net and felt this will be my way of giving back to community. I hope you find it useful. If you do find this useful, please don’t forget to put a comment. A thanks will be enough to keep me motivated. + +Without further ado, the process is as below. + +You will need: + +* Two 2GB card with a USB Card Reader or a 2GB USB stick formatted to FAT32 +* One 1GB card with a USB Card Reader or a 1GB USB stick formatted to FAT32 +* One PC / Laptop with optical drive (DVD Drive) and windows installed as this tutorial uses a Windows based laptop. +* Ensure that you AAO is having a constant AC supply and you are not relying on battery. +* Lot of patience + + +## 1. Create a recovery USB for Acer Aspire One A150L: (Optional) + +This should be quite straight forward. Insert the recovery DVD that came with your Acer Aspire One A150. Connect the 2GB Card / USB stick and start the process. + +On different laptops this may mean pressing a different function key (F1 to F12) but generally it will be F2, F8 or F12. +So once your laptop shows the first screen after switching on, at that time press the relevant key to enter the boot set-up, now goto boot and change the order of boot to select DVD as first preference. Now press F10 to save and exit. +Your laptop will now boot using the recovery DVD and should help you create the recovery USB. + +It is best to once test if the recovery USB is working or not. You can do so by now plugging your recovery DVD into AAO and starting it, press F12 and change the boot order to make USB disk the first option. If the recovery USB is created properly it will start the recovery process. +If this does not happen, you are among the unfortunate few who received a faulty DVD as I have seen many posts around these. In such situations, you will find this blogpost very handy: + +* [Acer aspire one recovery dvd](http://macles.blogspot.com/2008/12/acer-aspire-one-recovery-dvd.html) + +!!! site-tip "Tip" + macles.blogspot.com has a wealth of information on how to customise Linpus Linux and everything on this site is explained very nicely so incase you want to stick to Linpus Linus, it is worth to bookmark this site. + +Anyway, now one way or the other once your recovery USB is ready, we have minimised the risk of not being able to restore to factory conditions in case you do not like the end result of what we have set out to achieve. + +## 2. Update BIOS Version to latest V.3309 (Optional) +You will be able to download the latest BIOS V.3309 from ACER website. The ftp link to the site is [ftp://ftp.acer-euro.com/netbook/aspire_one_110/bios/](ftp://ftp.acer-euro.com/netbook/aspire_one_110/bios/) and http link is [http://support.acer-euro.com/drivers/notebook/as_one_150.html](http://support.acer-euro.com/drivers/notebook/as_one_150.html) +Once you have downloaded the latest version, you will need to make a bootable USB. I used Unetbootin which will be used later on for creating installatioon USB for Linux4one as well so you will need to now download it from here. +After downloading, connect your 1 GB Card / USB stick and run the unetbootin-windows-357.exe file and select the screen as shown below: +With this setup achieved, click OK. Once this is completed, extract all the files from BIOS zip file into the root of USB Drive. Remember it is important to have it in Root. +Now connect this USB drive to your Acer Aspire One, reboot it and press F12 to select the bootable device.System will show an error message around missing CD ROm. Ignore it. The AAO150 screen will now show A prompt A>. +Type C: in front of A> and press enter. This should change your drive to C>. Now type 3309.BAT. +This should start the flashing of BIOS to V.3309. Once completed AAO150 will reboot. +This is it. Your BIOS should now be updated to latest version. + +## 3. Create a installation USB for Linux4one v1.1: +While the latest version of Linux4one is 1.5 and is available for download I was unable to make a successful installation USB from available iso. Therefore, I downloaded the V1.1 from this link: + +[http://downloads.quellicheilpc.com/linux4one/1.1/index.html](http://downloads.quellicheilpc.com/linux4one/1.1/index.html) +I don't know how long this version will be hosted there so I will at a later point in time try and upload this iso to some other filehost as well. +Once you have downloaded the iso, plug your 2GB card / USB and start Unetbootin. +Select the Disk image radio button as shown in figure and select the path for linux4one iso image that you have downloaded.Select the USB Drive and click OK. +This will take some time but once done it will ask for a restart. Do NOT restart and cancel it. + +Your installation USB is now ready. + +## 4. Install Linux4one +[Official Guide](http://www.linux4one.it/foru/index.php?topic=163.0) +Now plug the Installation USB made above and plug it into your AAO150 and boot it. Press F12 and select the boot device. +Once the system starts booting throgh USB you will be presented with the options, select Option 'Install Linux4One'. +Now the only place which turns out confusing could be when during installation it asks for partitioning. I did not want dual boot so I picked up option 2 which installs on whole hard drive.If you are not a power user, I don't recommend having dual boot for AAO150 but that has to be your call. +Right, this will ensure that your Linux4one V1.1 is now installed. At this stage, you will reboot, configure location keyboard etc etc and restart once again. + +Check that all is working as expected so far. Only thing that I found not responding well was microphone. It was not working for Skype and hence the next step. + +## 5. Download update script for Linux4one v1.5 +[Official Guide](http://www.linux4one.it/forum/index.php?topic=1194.0) +Download the script from here onto your AAO150L using mozilla browser. +Now goto Accessories and click on 'Terminal'. As mozilla downloads directly to 'Desktop' directory you will need to change your directore accordingly. The easiest way will be to click on the 'Desktop' link in right hand side navigator on your main screen. This will open the browser, now note the path to Desktop. In my case it was /home/Ankit/Desktop/ so I gave the following commands: + +```bash linenums="1" +cd /home/Ankit/Desktop/ +tar -xjvf linux4one-1.5.tar.bz2 +cd linux4one-1.5 +sudo ./aggiornamento.sh + +``` + +After this it will start installing and ask several questions that you just type Y and press enter. +At one point it will also ask do you want to uninstall mozilla and you answer Y as anyway we will install it again in next step. +Right now with V1.5 the browser provided is IceCat which is same as mozilla anyway. +This will take about good 15 to 20 minutes but at the end you would have got latest version of Linux4one installed. + +## 6. Install Mozilla (Optional): +With Linux4one installed, more than half of the work is already done but with last step mozilla was uninstalled and if you are used to Mozilla and would want to install it back it is quite straight forward. Just goto Administration and select Synaptic Package Manager. It will then ask you to enter your password to perform administrative tasks. You must now enter the password that you gave during installation. +It will now open a window. In Search field enter 'mozilla' and it will show several options listed. If you scroll you will find an entry 'firefox' under package. When you select that you can read the description that will be something like 'Safe and easy web browser from Mozilla'. Select the checkbox next to this entry and click 'Mark for Installation'. It will show you dependencies, just say yes to everything and then it will download and install Mozilla Browser for you. + +## 7. Install and configure Skype +Goto www.skype.com and download the skype version for Ubuntu 7.04 - 8.04. Mozilla browser will download it to Desktop folder. Now once the download is complete right click on the downloaded file and click on 'Open with 'GDebi Package Installer'. You will be asked for password, enter the password you gave during installation of Linux4one. After that Skype installation will begin. There will be some dialogue boxes on dependencies for which you just click Yes / OK. +Once skype is installed it will appear as an icon in your desktop under Internet. If you want it under favourite, right click the icon and select add to favourite. This can be done for all installed softwares. + +Now open skype, login and at left side bottom corner click on skype settings, select Options. Now in Options select 'Video Devices' and click on Test to check that Webcam is set correct. +Next click on 'Sound Devices' and click on Make a sound Test and Make a test call. If all is configured fine you should hear a voice and a test call will be made and in test call you will be asked to speak and what you speak will be played back that you should be able to hear. + +It did not work for me at first but when I selected HDA Intel (hw:Intel,0) in all three it worked. However for my friends netbook I had to do more circus and if you are not able to resolve your mic issues, it is time to move to next step. + +## 8. Modify Mic settings + +!!! site-tip "Tip" "Remember" + You need to do this only if in previous step mic did not work. + +[Official Guide](http://www.linux4one.it/forum/index.php?topic=212.0) + +While there is some explanation on Official guide it took me some time to figure out how to get those windows to look like they do in the screenshots there. + +First goto Preferences and scroll down. You will see 'Sound' icon. Click on this and change 'Sound Playback' and 'Sound Capture' to OSS. +Next change the 'Device' to 'Realtek ALC268 (OSS Mixer) + +Now close this window and click on Volume icon in right hand corner of screen and then click on Edit and select device. Then for HDA Intel (ALSA Mixer) select all options that are not selected - Capture, Capture 1, Beep, Input, Input 1. I have borrowed the image from link above to keep information at one place. +Ensure that on last tab you select 'Mic' and not 'Front Mic'. That is it. This should complete the mic settings. Now we need to check it in Skype. In official tutorial they suggest testing with recorder but that did not work for my friends AAO150 but skype did. I figure we anyway need it for skype so why bother with voice recorder at all. So over to next step then. + +## 9. Test Skype +Test skype the same way we did in step 7 and see if it is working. Click on 'Sound Devices' and click on Make a sound Test and Make a test call. If all is configured fine you should hear a voice and a test call will be made and in test call you will be asked to speak and what you speak will be played back that you should be able to hear. +If this does not work try different combinations from the dropdown one should definitely work. + +## 10. Extra – Install Moneydance (Optional) +OK now is one piece of software that is not used by everyone. Moneydance is a moneymanagement tool. It is a paid software that I use for managing my finances and have grown quite fond of it and dependent on it at the same time and I really wanted this installed on my netbook and it was one of the not so easy things to install but with following instructions it should be piece of cake really. + +
    +
  1. Download linux version of Moneydance from this here. Mozilla will download it into your Desktop folder. + +([http://www.moneydance.com/download/2008/installers/Moneydance_linux_x86.tar.gz](http://www.moneydance.com/download/2008/installers/Moneydance_linux_x86.tar.gz)) +
  2. Now goto Accessories -> Terminal. +
  3. Type cd /home/YourUserName/Desktop/ and press enter +
  4. Type tar xfvz Moneydance_linux_x86.tar.gz and press enter +
  5. It will print following kind of stuff: +
+ +```bash linenums="1" +Moneydance/ +Moneydance/.install4j/ +Moneydance/.install4j/i4jruntime.jar +Moneydance/Moneydance +Moneydance/.install4j/firstrun +Moneydance/.install4j/i4jparams.conf +Moneydance/.install4j/MessagesDefault +Moneydance/.install4j/user.jar +Moneydance/appsrc.jar +Moneydance/jcommon-1.0.12.jar +Moneydance/jfreechart-1.0.9.jar +Moneydance/license.txt +Moneydance/moneydance.jar +Moneydance/moneydance_icon32.png +``` + +
    +
  1. Now it will present the command prompt again. Type cd Moneydance +
  2. Now Type `./Moneydance` +
+It will display testing JVM in /usr and then open the Monedance software. +This is it software is now installed. +Unfortunately, this does not create any icon that you can directly click every-time and can only be run by clicking on Moneydance.sh file in Moneydance folder. So to make it easy do the following. +
    +
  1. Goto Prefrences -> Main Menu -> Favourites. +
  2. Now click on 'New Item'. It will open a dialogue box 4 fields. In second field Enter 'Moneydance'. +
  3. In third field click on Browse and navigate to Desktop->Moneydance->Moneydance.sh +
  4. If you want to change the icon click on icon and select the one that you want. +
  5. Click OK. +
+ +This is it you are all done. +Ensure that now you restart your Acer Aspire One 150 atleast three times before you start using as I noticed that it was only after three or four restarts that everything was well settled. + +## 11. That's it friends....Now Enjoy. +Please let me know if you are stuck somewhere and I might be able to help. diff --git a/docs/posts/2009-08-13-get-gmail-as-push-email-on-sony-p990i.md b/docs/posts/2009-08-13-get-gmail-as-push-email-on-sony-p990i.md new file mode 100644 index 0000000..dbc3f70 --- /dev/null +++ b/docs/posts/2009-08-13-get-gmail-as-push-email-on-sony-p990i.md @@ -0,0 +1,82 @@ +--- +title: Get Gmail as Push Email on Sony P990i +slug: get-gmail-as-push-email-on-sony-p990i +draft: False +description: Get Gmail as Push Email on Sony P990i +authors: ['ankit'] +date: + created: 2009-08-13 16:52:00 + updated: 2009-08-13 16:52:00 +comments: true +--- +While I have moved on from P990i which is now in safe hands of my dear wife, I remember doing some good amount of web searching and still had no idea how to set up push-mail on P990i. + +I then thought I will configure a mail anyway and to my surprise the device is capable of enabling push-mail on it`s own as I found while fiddling along. Anyway I have configured push-mail for wifey dear and she was mighty impressed. :smile: + +The steps I followed are as below: + + + +* Main Menu -> Tools -> Control Panel -> Messaging -> Email Accounts -> New + +* Fill Account Name as Gmail + +* Your Name as ..well... your name.. :smile: + +* Email Address - Your gmail address + +* In Connection Type select IMAP from the drop down list. + +* Tick on Push email + +* Now goto `Inbox` Tab. + +* Type imap.gmail.com under `Incoming Server Address` + +* Type your email address `xyz@gmail.com` under `Username` + +* Enter your `password` under `Password` + +* Depending on you data plan you might want to put something else but I have unlimited internet plan so I have selected `No Restriction` under `Download Restrictions` + +* Limit number of Emails - I have selected 100, you can chose as per your needs. + +* Receive using Group - Select the group of internet account that has your phone provider configured. (I am assuming that you have already configured internet settings on your phone. If not that is a separate topic but you can easily find information on user manual so at the moment let`s consider it as out of scope for this entry.) + +* Now goto `Outbox` Tab. + +* Type `smtp.gmail.com` under `Outgoing Server Address` + +* Tick the checkbox `Use SMTP Authentication` + +* Tick the checkbox `Use Inbox Login details` + +* Select the same internet group as above under `Send using Group` + +* Now click on the arrow next to `Email account` on top of the screen and click on `Advanced` from the dropdown list + +* Under `Incoming` tab Select `SSL` under the field `Secure connection` + +* Type `993` under field `Incoming mail port` + +* Next in `Outgoing` tab under `Secure Connection` filed select `TLS` + +* Type `587` under field `Outgoing mail port` + +* Tick the checkbox `Use MIME encoding` + +* Click on `Save` + +* Click on `Save` again + +* Now the screen will show Gmail listed as your email account. + +* On this screen again click on the arrow next to Email account on top of the screen and select `Always on Pushmail`. + +* Tick the checkbox next to `Always On` + +* Select the timings and select the phone providers datasetting name under `Internet Account` and click `Save`. + +* This is it. You are now all set to receive your mails on the go... + +Have fun !!! diff --git a/docs/posts/2009-09-15-sony-vaio-fe21h-webcam-on-skype.md b/docs/posts/2009-09-15-sony-vaio-fe21h-webcam-on-skype.md new file mode 100644 index 0000000..92514b5 --- /dev/null +++ b/docs/posts/2009-09-15-sony-vaio-fe21h-webcam-on-skype.md @@ -0,0 +1,42 @@ +--- +title: Sony VAIO FE21H Webcam on skype +slug: sony-vaio-fe21h-webcam-on-skype +draft: False +description: Sony VAIO FE21H Webcam on skype +authors: ['ankit'] +date: + created: 2009-09-15 17:00:00 + updated: 2009-09-15 17:00:00 +comments: true +--- + +Alright friends not a huge tip but still I, being new fan of Ubuntu, installed it on my media laptop...Sony VAIO... + +One might ask what is media laptop...well I had a bit of problem with my Sony VAIO some 1.5 years back and a key got stuck and as it goes with any Sony product there was no cheap solution at hand... + +At that time for some reason it appeared like a motherboard issue and I just bought another Dell laptop...later I realised that it was a keyboard issue so I invested in a wireless keyboard and had two lappies at home just like that :smile:... I figured that with wireless keyboard VAIO laptop will make perfect companion to my 32' Samsung and hence it got the name of media laptop. + + + +I use this laptop to browse without fear as I will never ever do any important work on it so am never worried of loosing..not that I ended up having any virus at all....and now with Linux I doubt if there will ever be any virus on this laptop....but anyway I have gone on a tangent... + +What I started to tell was a tip on how we can make VAIO's inbuilt motion-eye webcam to behave and the tip goes as below... +Incase your webcam is not giving good images on ur Sony VAIO, you may want to try this: + +1.Goto System->Preferences->Main Menu + +1.In Main Menu window click on Internet in left hand navigation under 'Menu' and then click on Skype' in right hand under 'Items'. + +1.Now click on 'Properties' button. + +1.It will open a Launcher Properties dialogue box. + +1.In third field 'Command' replace 'Skype' with this line: +```bash +bash -c 'LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so skype' +``` + +That is it. You should now have a properly working motion-eye with skype. +There is more info on [this link](https://help.ubuntu.com/community/Webcam) + +Ciao !!! diff --git a/docs/posts/2009-09-16-sony-vaio-n-vidia-setup-to-make-s-video-work.md b/docs/posts/2009-09-16-sony-vaio-n-vidia-setup-to-make-s-video-work.md new file mode 100644 index 0000000..3029024 --- /dev/null +++ b/docs/posts/2009-09-16-sony-vaio-n-vidia-setup-to-make-s-video-work.md @@ -0,0 +1,336 @@ +--- +title: Sony VAIO N-VIDIA setup to make S-Video work +slug: sony-vaio-n-vidia-setup-to-make-s-video-work +draft: False +description: Sony VAIO N-VIDIA setup to make S-Video work +authors: ['ankit'] +date: + created: 2009-09-16 17:10:00 + updated: 2009-09-16 17:10:00 +comments: true +--- + +!!! important "UPDATE for 9.10" + For Ubuntu 9.10 I was just not able to get it work and finally I figured it out. The problem is with the latest Nvidia driver, the one that ubuntu says recommended. In order to make your TV Out work, you must uninstall the latest release version and install the one just lower than that. (The working version for me was 173.) Then follow these steps: + ```bash linenums="1" + sudo nvidia-xconfig + sudo reboot + sudo nvidia-settings + ``` + Then follow the steps shown below. If you are lucky you wont need to refer Section A of this post at all. I did not have to do that. + + + +## Background + +S-Video did not work out of the box on ubuntu Sony Vaio combination but it was not difficult to have it sorted once the following steps were taken. + +I am giving the steps to set-up TV-Out assuming your n-vidia file is working fine, if not follow steps in Section A before completing steps below. + +* Step 1: Connect laptop and TV through S-Video Cable. + +* Step 2. System->Administration->Nvidia X-Server Settings + +* Step 3: Click on X-Server Display Configuration and then click on 'Detect Displays'. If you have connected fine, the screen should be something like this: + + ![image](../assets/images/2009/09/16/Screenshot-NVIDIA%20X%20Server%20Settings-1.png) + +* Step 4: Click on the TV icon, following screen will appear. + + ![image](../assets/images/2009/09/16/Screenshot-NVIDIA%20X%20Server%20Settings-2.png) + +* Step 5: Click on 'Configure' and then select 'Twinview' + + ![image](../assets/images/2009/09/16/Screenshot-NVIDIA%20X%20Server%20Settings-3.png) + +* Step 6: Now I found that keeping TV on left ensured that while using dailymotion full screen it will come on TV but keeping on right it came on laptop monitor so you may want to depending on your preference change the location to left as shown below. + + ![image](../assets/images/2009/09/16/Screenshot-NVIDIA%20X%20Server%20Settings-4.png) + +This is it.You should now be able to watch streaming video on your TV. :smile: + +## Section A + +I found the most useful instructions [here](http://ubuntuforums.org/showthread.php?t=98456), but I did have to make few tweaks. + +Right, I will walk step by step based on the guide from the source mentioned above and mention the changes / tweaks I did to make it work on my laptop. I am sure it should work with same conf on other VAIO as well. + +* Step 1: Aplication-> Accessories-> Terminal + +* Step 2: Type `sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup` + +* Step 3: You will need to enter password at this stage. Enter the password. + +* Step 4: Now Type: `sudo gedit /etc/X11/xorg.conf` + +Difference in old and new xorg.conf files: + +I used the following command on terminal to compare the old and new .conf files: + +`diff -u /etc/X11/xorg.conf.backup /etc/X11/xorg.conf` + +The numbers between @@ represent Row number and column number. - stands for old and + for new. + +```bash linenums="1" title="/etc/X11/xorg.conf" +@@ -61,9 +61,9 @@ +Section "Monitor" +Identifier "Monitor0" +VendorName "Unknown" +- ModelName "TV-0" +- HorizSync 28.0 - 55.0 +- VertRefresh 43.0 - 72.0 ++ ModelName "Nvidia Default Flat Panel" ++ HorizSync 29.0 - 49.0 ++ VertRefresh 0.0 - 60.0 +EndSection + +Section "Monitor" +@@ -110,12 +110,14 @@ + +## Removed Option "TwinView" "0" +## Removed Option "metamodes" "DFP: nvidia-auto-select +0+0" ++## Removed Option "TwinView" "1" ++## Removed Option "metamodes" "TV: nvidia-auto-select +0+0, DFP: nvidia-auto-select +1024+0" +Identifier "Screen0" +Device "Device0" +Monitor "Monitor0" +DefaultDepth 24 +- Option "TwinView" "1" +- Option "metamodes" "TV: nvidia-auto-select +0+0, DFP: nvidia-auto-select +1024+0" ++ Option "TwinView" "0" ++ Option "metamodes" "DFP: nvidia-auto-select +0+0" +SubSection "Display" +Depth 24 +EndSubSection +``` +Copy of my xorg.conf and xorg.conf.backup + +```bash linenums="1" title="xorg.conf - CURRENT - WORKING VERSION" +Section "ServerLayout" +Identifier "Default Layout" +Screen 0 "Screen0" 0 0 +InputDevice "Keyboard0" "CoreKeyboard" +InputDevice "Mouse0" "CorePointer" +EndSection + +Section "Module" +Load "glx" +EndSection + +Section "ServerFlags" +Option "Xinerama" "0" +EndSection + +Section "InputDevice" + +## generated from default +Identifier "Keyboard0" +Driver "kbd" +EndSection + +Section "InputDevice" + +## generated from default +Identifier "Mouse0" +Driver "mouse" +Option "Protocol" "auto" +Option "Device" "/dev/psaux" +Option "Emulate3Buttons" "no" +Option "ZAxisMapping" "4 5" +EndSection + +Section "Monitor" +Identifier "Configured Monitor" +EndSection + +Section "Monitor" +Identifier "Monitor0" +VendorName "Unknown" +ModelName "Nvidia Default Flat Panel" +HorizSync 29.0 - 49.0 +VertRefresh 0.0 - 60.0 +EndSection + +Section "Monitor" +Identifier "Monitor1" +VendorName "Unknown" +ModelName "TV-0" +HorizSync 28.0 - 55.0 +VertRefresh 43.0 - 72.0 +EndSection + +Section "Device" +Identifier "Configured Video Device" +Driver "nvidia" +Option "NoLogo" "True" +EndSection + +Section "Device" +Identifier "Device0" +Driver "nvidia" +VendorName "NVIDIA Corporation" +BoardName "GeForce Go 7400" +EndSection + +Section "Device" +Identifier "Device1" +Driver "nvidia" +VendorName "NVIDIA Corporation" +BoardName "GeForce Go 7400" +Option "TVOutFormat" "SVIDEO" +Option "TVStandard" "PAL-G" +Option "ConnectedMonitor" "Monitor[1]" +BusID "PCI:1:0:0" +Screen 1 +EndSection + +Section "Screen" +Identifier "Default Screen" +Device "Configured Video Device" +Monitor "Configured Monitor" +DefaultDepth 24 +EndSection + +Section "Screen" + +## Removed Option "TwinView" "0" +## Removed Option "metamodes" "DFP: nvidia-auto-select +0+0" +## Removed Option "TwinView" "1" +## Removed Option "metamodes" "TV: nvidia-auto-select +0+0, DFP: nvidia-auto-select +1024+0" +Identifier "Screen0" +Device "Device0" +Monitor "Monitor0" +DefaultDepth 24 +Option "TwinView" "0" +Option "metamodes" "DFP: nvidia-auto-select +0+0" +SubSection "Display" +Depth 24 +EndSubSection +EndSection + +Section "Screen" +Identifier "Screen1" +Device "Device1" +Monitor "Monitor1" +DefaultDepth 24 +Option "TwinView" "0" +Option "metamodes" "TV: nvidia-auto-select +0+0" +SubSection "Display" +Depth 24 +EndSubSection +EndSection + +xorg.conf.backup - OLD COPY +
+Section "ServerLayout"
+Identifier "Default Layout"
+Screen 0 "Screen0" 0 0
+InputDevice "Keyboard0" "CoreKeyboard"
+InputDevice "Mouse0" "CorePointer"
+EndSection
+
+Section "Module"
+Load "glx"
+EndSection
+
+Section "ServerFlags"
+Option "Xinerama" "0"
+EndSection
+
+Section "InputDevice"
+
+## generated from default
+Identifier "Keyboard0"
+Driver "kbd"
+EndSection
+
+Section "InputDevice"
+
+## generated from default
+Identifier "Mouse0"
+Driver "mouse"
+Option "Protocol" "auto"
+Option "Device" "/dev/psaux"
+Option "Emulate3Buttons" "no"
+Option "ZAxisMapping" "4 5"
+EndSection
+
+Section "Monitor"
+Identifier "Configured Monitor"
+EndSection
+
+Section "Monitor"
+Identifier "Monitor0"
+VendorName "Unknown"
+ModelName "TV-0"
+HorizSync 28.0 - 55.0
+VertRefresh 43.0 - 72.0
+EndSection
+
+Section "Monitor"
+Identifier "Monitor1"
+VendorName "Unknown"
+ModelName "TV-0"
+HorizSync 28.0 - 55.0
+VertRefresh 43.0 - 72.0
+EndSection
+
+Section "Device"
+Identifier "Configured Video Device"
+Driver "nvidia"
+Option "NoLogo" "True"
+EndSection
+
+Section "Device"
+Identifier "Device0"
+Driver "nvidia"
+VendorName "NVIDIA Corporation"
+BoardName "GeForce Go 7400"
+EndSection
+
+Section "Device"
+Identifier "Device1"
+Driver "nvidia"
+VendorName "NVIDIA Corporation"
+BoardName "GeForce Go 7400"
+Option "TVOutFormat" "SVIDEO"
+Option "TVStandard" "PAL-G"
+Option "ConnectedMonitor" "Monitor[1]"
+BusID "PCI:1:0:0"
+Screen 1
+EndSection
+
+Section "Screen"
+Identifier "Default Screen"
+Device "Configured Video Device"
+Monitor "Configured Monitor"
+DefaultDepth 24
+EndSection
+
+Section "Screen"
+
+## Removed Option "TwinView" "0"
+## Removed Option "metamodes" "DFP: nvidia-auto-select +0+0"
+Identifier "Screen0"
+Device "Device0"
+Monitor "Monitor0"
+DefaultDepth 24
+Option "TwinView" "1"
+Option "metamodes" "TV: nvidia-auto-select +0+0, DFP: nvidia-auto-select +1024+0"
+SubSection "Display"
+Depth 24
+EndSubSection
+EndSection
+
+Section "Screen"
+Identifier "Screen1"
+Device "Device1"
+Monitor "Monitor1"
+DefaultDepth 24
+Option "TwinView" "0"
+Option "metamodes" "TV: nvidia-auto-select +0+0"
+SubSection "Display"
+Depth 24
+EndSubSection
+EndSection
+```
\ No newline at end of file
diff --git a/docs/posts/2009-10-07-o2-xda-serra-official-htc-upgrade-with-tf3d-of-touch-pro-2.md b/docs/posts/2009-10-07-o2-xda-serra-official-htc-upgrade-with-tf3d-of-touch-pro-2.md
new file mode 100644
index 0000000..a0014e3
--- /dev/null
+++ b/docs/posts/2009-10-07-o2-xda-serra-official-htc-upgrade-with-tf3d-of-touch-pro-2.md
@@ -0,0 +1,190 @@
+---
+title: O2 XDA Serra - Official HTC upgrade with TF3D of Touch Pro 2
+slug: o2-xda-serra-official-htc-upgrade-with-tf3d-of-touch-pro-2
+draft: False
+description: O2 XDA Serra - Official HTC upgrade with TF3D of Touch Pro 2
+authors: ['ankit']
+date: 
+  created: 2009-10-07 17:44:00
+  updated: 2009-10-07 17:44:00
+comments: true
+---
+## Background
+
+Ever since I laid my hands on O2 XDA Serra aka HTC Raphael aka HTC Touch Pro , I have always loved the device despite it’s limitations on battery life and have found some really useful apps during my association with windows mobile (for last five years or so) which found their way onto Serra as well. While I have known for a while that we can flash ROMS, I was perhaps over protective when it came to Serra and never really went beyond doing a HardSPL for device but last Sunday when I was fiddling with the facebook application and SMS registration, I realised that each time I sent an SMS and then tried to open the internet explorer or opera they will just crash demanding a soft reset. I could instantly find the problem to be Kaspersky Anti-Virus(KAV) failure. It is not possible to remove KAV without a hard reset at least not to my knowledge. (A hard reset is what brings your device back to factory conditions). Now since a Hard Reset would mean lot of work in terms of reinstalling all my beloved apps etc, I figured I might as well see if there is some other ROM I could use. This is what triggered my quest.
+
+
+
+What started as fixing the issue caused with a Kaspersky Anti Virus failure rendering crashes to internet browsers on my HTC Touch Pro ended in my pleasantly getting a complete device makeover and in the process making my gadget work way better than it was working before. Lovely GUI, great Facebook integration, faster boot time and most important of all a functional GPS, yes you read it right a functional GPS. The problem that plagued almost all handsets provided by O2.
+
+I must start by saying that if it worked for me it must work for you but if it does not please don’t hold me responsible. Another thing you must know is doing a HardSPL strips your device of the warranty. There is a way of putting back the StockSPL for warranty reasons but I have not tried it but then it does not sound too complicated. You may also find views on forums that suggest installing a cooked ROM is better but as I said I am too much in love with the device to install flaky ROMs I actually opted for the official update ROM released by HTC and then gave it the touchflo3d of touch pro 2 and after some tweaks here and there which I will all list down, I am completely (I stress the word completely) satisfied with the final results.
+
+Ok so now over to the process:
+
+## Objective
+
+1. To install the manufacturer provided ROM
+1. To get the handset a good look and feel.
+1. Ensure that GPS functions
+1. To get phone address book integrated with face-book so you can get your contacts pictures from their FB profile onto your device.
+1. To get Weather for the local city that may not be present in the default list.
+1. Gmail sync to ensure Gmail is configured as push mail on your device.
+1. The Google calendar sync to your on device outlook calendar.
+
+## Pre-requisites
+
+1. A windows PC / laptop.
+1. O2 XDA Serra / HTC Raphael / HTC Touch Pro
+1. USB cable to connect XDA to PC / laptop
+1. At least a 1 GB Mini SD Card. Considering you have XDA, you may want to get a bigger capacity memory card (of up to 8GB or 16GB…). I have a 8GB one.
+1. Access to internet.
+1. A good data plan that will ensure good use of the effort you are about to put in.
+1. Downloaded cabs and ROM. You can either download all in bulk from here ([http://www.mediafire.com/?l12vaj688qwh85w](http://www.mediafire.com/?l12vaj688qwh85w)) (I have uploaded them for ease as a bundle) or follow the links and download individually under each section.
+1. and as I always ask, lot of patience.
+
+
+Steps:
+
    +
  1. HardSPL
  2. +
  3. Install HTC ROM
  4. +
  5. Install touchflo3d
  6. +
  7. Install Dialler
  8. +
  9. Install .net 3.5 and weather database editor
  10. +
  11. Configure Device
  12. +
  13. Configure Email
  14. +
+ +## Step 1: HardSPL + +Now to start, we will first need to apply HardSPL to the device. I do not know what the words SPL stand for but what I have come to understand after reading for hours on XDA-developer forums is that if you want to install ROM that is not provided by the vendor who sold you the device (O2 in my case), you will need to apply this HardSPL or you may either not be able to install the new ROM or may even be at risk of bricking your device. HardSPL is not complicated and all credit goes to developers at xda-developer community. You will have official instructions if you follow [this lin](http://forum.xda-developers.com/showthread.php?t=410150)>. + +For the sake of completeness, I am anyway including instructions here. + +### Instructions: + +1. Download Hard-SPL package from attachment, extract to an empty folder. Make sure it's launched from a local drive (not through network drive, etc.) +2. You must Have Phone Synced with PC in Windows Mobile! +3. Run `RaphaelHardSPL-Unsigned_190_1_3.exe` +4. Follow steps in the RUU, check device for prompts after PC shows loading bar. +5. It should go to black screen now. +6. SPL flashes, device automatically reboots, job done. +7. To confirm you got it installed, go into bootloader mode (tricolour screen!) and verify the screen shows `1.90.OliNex`. + +!!! note + 1. You will not see the SPL version during normal boot, that is the OS version, not SPL! to enter bootloader mode to see version: with the device turned on, press and hold the volume down button, then press the reset button with the stylus tip, then release the volume down button when bootloader tricolour screen appears. + 2. Anyone having problems with the device entering SSPL automatically, please copy SSPLManual.exe from second attachment to the device and run it. then once the screen is black, run RUU manually. i.e. you run the RUU on the PC, if it isn't obvious. + 3. This is unsigned Hard-SPL. no limitations on flashing ROMs or radio packages. also, this has overwrite protection, if someone needs to revert to stock SPL for warranty reasons, we will soon post a stock SPL downgrade package. + 4. Do not use this RUU for anything other than SPL flashing (i.e. hardspl or stock spl restore)!!! if you want to flash some other rom, then use customruu from: [http://forum.xda-developers.com/showthread.php?t=410761](http://forum.xda-developers.com/showthread.php?t=410761) + +## Return to stock spl *(for warranty reasons only!)* + +1. Be sure to first restore stock OS, and stock radio. stock SPL is always to be done last!! +2. Download the stock spl package from this post. +3. Also download the original hardspl from the attachments in this post. +4. Run the hardspl exe but do not click anything in RUU yet. just let the hardspl EXE extract the files for flashing. +5. The SPL you want to revert to is a .NBH file, put the NBH in the extracted hardspl package, overwriting the original NBH file in it! +6. Continue with the RUU (or if needed, run SSPL-Manual.exe manually, then run RUU when it goes to black screen), it goes to 100%, reboots, done. +7. To verify, volume down + reset, see version number on tricolour screen, should now just say 1.90.0000. + +## Step 2: Install HTC ROM + +Straight forward really. Connect your phone to the PC through the USB cable. Ensure that a connection is established with pc through active sync. Now double click on the ROM update utility (RUU) (RUU_Raphael_HTC_Europe_5.05.401.1_R2_Radio_Signed_Raphael_52.58.25.30_1.11.25.01_Ship) and it will guide you through the process. + +If you want to directly download from HTC you can do so from [this link](http://www.htc.com/uk/SupportDownload.aspx?p_id=140&cat=2&dl_id=501) + +You will have to use the non-O2 serial number. The one I used was HT833K016924. + +!!! note "Side Note" + Now if all went well what follows is the non-risky bit. To be honest I don’t even understand why we have to do this but then that’s the process and I was not about to experiment on my lovely instrument based on my limited knowledge led beliefs so I did this nonetheless. + +Once completed it will restart XDA. Once it reaches the screen where it asks to configure Stylus, do a Hard Reset by pressing the Volume down key and the enter key (Round centre key) simultaneously and pressing the reset key with your stylus. (Reset Key is a small hole at the bottom of your handset next to the charging slot.) Once the system switches off release the reset key but continue to hold Volume Down key and enter key. + +It will now show a screen cautioning you that if you continue it will result in loss of data and if you wish to continue press Vol Up key. Press the Vol up key now. I don’t distinctly remember but I think it asked me twice to press Vol Up which I did. Basically just follow the instructions. + +That should sort out the new ROM installation. + +Now at this stage, you would have got rid of the O2 splash screen which has given way to elegant Touch Pro splash screen. This itself was an extreme form of happiness as I was not a huge fan of the O2 splash screen anyway. Ok you may want to take a moment with the new screen and play around. If you are happy and are not overly worried about facebook integration, I will recommend that you skip to Step 5. If however you want FB integration and would want a more Touch Pro 2 kind of interface there is still some work to be done. Moving on, then to Step 3. + +## Step 3: Install touchflo3d + +``` title="text borrowed from XDA-developer website" +http://forum.xda-developers.com/showthread.php?t=542113 +Instructions +1) Disable "TouchFLO 3D" from your Today items. Soft reset. +2) Go to System Settings, "Power", and uncheck all of the Options on the "Advanced" tab. +3) Install the "Gen.Y_Manila_R1_5.cab" (install may take 10 minutes or more). DO NOT RESTART. +4) Install Language Pack cab 0409 Gen.Y_Manila_R1_5. DO NOT RESTART. +5) Install the HTC Scroll_1_0_1914_2726 cab file. NOW SOFT RESET. +Done! +``` + +I did not install anything in the optional installs but if you would want to, you can follow the instructions on the post by Captain Throwback on the link above. The version I downloaded was R1.5 which is included in the pack. + +## Step 4: Install Dialler + +I downloaded the dialler from ppcgeek forums, many thanks to them. It is not available on the link provided in xda-developer post. If you want to download from there, you will have to register on their site and do a bit of googling. Alternatively, it is included in the pack above, just the non confusing cab file named - . + +Move it to your memory card on phone. Now from XDA go to the location where you saved it and click the cab to install it. It will take about 3 to 5 minutes. + +## Step 5: Install .net 3.5 and weather database editor + +Copy the < NETCFv35.wm.armv4i> cab(.net 3.5) and < WeatherDatabaseEditor 1.1 Modified> cab(weather DB) onto the memory card on your device. Now first install .net 3.5 by clicking the cab file from the location where you copied it. + +To install weather DB follow the steps below: + +1. Install Weather Database Editor + +2. Find your locCode on [http://www.accuweather.com](http://www.accuweather.com). + + !!! example + Accuweather URL for Northwich in UK is : [http://www.accuweather.com/world-index-forecast.asp?partner=accuweather&traveler=0&loccode=EUR|UK|UK123|Northwich](http://www.accuweather.com/world-index-forecast.asp?partner=accuweather&traveler=0&loccode=EUR%7CUK%7CUK123%7CNorthwich), The locCode is EUR|UK|UK123|Northwich + +3. Now open the weather DB on XDA, select your country and then select a city that begins with the same alphabet as your city and the one you are unlikely to use. For this example lets say - Nuneaton. Click on Edit -> Edit City.
+ +4. Now change the name of city to the one you want and in “Accu Weather Code” Field enter the locCode obtained in Step 5.2. For our example it would be - EUR|UK|UK123|Northwich
+ +5. Click on File and exit.
+ +6. Go to Weather tab and add your city and update the weather. + + !!! site-tip "Tip" + Steps 7 to 9 are not relevant to you if you directly jumped to this section from Step 2 and have not installed the new TF3D + +7. Go to home page on XDA and click on watch, now click on “Add City” and add the local city. +8. Make this as your default city by clicking the radio button. +9. Now click on Menu-> Rearrange Cities and bring your local city to top of the list. + +This is it, we will now move to next step. + +## Step 6: Configure Device + +Many people don’t care to update the owner details but I think it is important to have that updated and hence my first step when I am done with initial installations and all is to update owner details. This ensures that if phone is lost and lands in honest hands you still have a chance of getting it back. It did happen to me so it isn’t a fairy tale…J + +Click on Windows icon -> Settings-> All Settings ->Personal -> Owner Information and update these details. Ensure that the telephone number you enter is different than the one for this instrument else it pretty much defies the purpose of entering this information on the first place. + +Next give your XDA a name. Click on Windows icon -> Settings-> All Settings -> System -> About. -> Device ID. Update your device name and description. + +Personalise weather updates. Slide over to weather, add any other cities you are interested in and click update now. + +!!! site-tip "Tip" + I recommend that you install registry editor through the cab file provided in my bundle named and a file Explorer named but these are completely optional + +Your basic configuration is now complete. + +## Step 7: Configure Email + +If you use hotmail or live and you have a good data plan (mine is unlimited internet usage) it may be a good idea to configure windows live as that ensures push mail so you have instant delivery of your mail as soon as it arrives into your handset. +To do this, Click on Windows icon -> All Programmes -> Windows Live. Enter details and configure. + +!!! site-tip "Tip" + Ensure that you change sync settings from “Manual” to “As soon as it comes” and the time schedule according to your needs. + +Gmail has recently introduced Gmail Sync that can sync your email, calendar and address book. They have provided instructions but they were not exactly mapping to how it was shown on my device. I instead used the following route. + +Connect your phone to your PC / laptop through ActiveSync and open Device Centre. Now click on Setup device -> Sync Setup and in server name enter m.google.com. enter your username and password. The SSL checkbox is clicked by default so let it remain. If it is not checked, please select it in the checkbox. + +Save settings. Now under items to be synced, of the three : email, calendar and address book select whichever you want synced…(Remember if you set anything other than these three to be synced through exchange nothing will work on Google Sync). + +I did not want my address book sync with Gmail so I left it and for other two I changed the sync settings to Exchange server. This is it your email will now be delivered into outlook mailbox on your XDA. You may want to check in your Gmail settings that you have activated IMAP or else even though this setup is correct you will not get mails delivered. + +Congratulations on successful completion of the whole process. Now enjoy the new look XDA with enhanced capabilities!!! diff --git a/docs/posts/2010-03-07-kubuntu-blog-entry.md b/docs/posts/2010-03-07-kubuntu-blog-entry.md new file mode 100644 index 0000000..e9bba4c --- /dev/null +++ b/docs/posts/2010-03-07-kubuntu-blog-entry.md @@ -0,0 +1,123 @@ +--- +title: KUBUNTU Blog Entry +slug: kubuntu-blog-entry +draft: False +description: KUBUNTU Blog Entry +authors: ['ankit'] +date: + created: 2010-03-07 10:22:00 + updated: 2010-03-07 10:22:00 +comments: true +--- + +This is how my love for Kubuntu has started....and growing by the minute... + +I was experimenting with different Linux distros and then I went ahead with Linux Mint – which is quite popular and is know as “ubuntu done right”. I liked it and started dwelling more and played around with themes and such before I figured it is becoming kind of prescriptive and thought will actually play with the a distro with KDE not too far from Ubuntu – Kubuntu and boy was I surprised with the difference … all to their own opinion but mine is KDE is one helluva beautiful thing....the stuff that is done here is simply amazing …. alright once I was done with dropping my jaw at every step I figured there is a bit of learning curve right from the word go and so before I start forgetting what all I have learnt I felt it will be safe jotting it all down and thus this post. + + + +* How to upgrade Ubuntu 9.10 to Kubuntu 9.10 + +* Restoring the default panel at bottom of the screen? + +* Problems with system audio, you-tube audio and how it all finally started working for me. + +* Change the theme. + +* Change the splash screen + +* How I managed to change the Log-in Screen (KDM Screen) + +* Finally, change boot splash screen + + +Right so if any of this catches your fancy, please be my guest... :smile: + +## How to upgrade Ubuntu 9.10 to Kubuntu 9.10 + +Plenty of information on the website and better presented at the one site than other. I liked the way it was explained [here](http://www.psychocats.net/ubuntu/kde) + +This site is also a good source of information in general so well worth a bookmark. + +## Restoring the default panel at bottom of the screen? + +Once I finished installing Kubuntu as per the instruction from above link, I started playing around and ended up deleting the panel thus learning about how to get that back. In the process I learnt important lesson on making a backup of setting as soon as you have configured system to your first level of satisfaction as if you do not take this precaution you will have to start all over again. +The steps I took were as below: + +Goto Applications tab, click on Settings → Terminal and open the terminal, Type following commands: + +```bash +sudo cp -R ~/.kde .kde_backup sudo rm -rfv .kde kquitapp plasma-desktop sudo restart +``` +This is it. + +Now once the system restarts, your panel will be in place. However you will have to put all your configuration again. So to avoid that in future, repeat first two steps and next time you end up in similar situation all you need to do is give this command sudo cp -R ~/.kde_backup .kde and you should be good to go. + +## Problems and Resolutions + +**Problems with system audio, you-tube audio and how it all finally started working for me.** + +When I opened a video on youtube, I was not getting any sound. After some googling with no results I tried this and again today after restoring panel the sound was gone and trying this made it work so I assume at-least for all Dell Inspiron 1525 this should work. +Open the voice control by clicking on volume icon in system tray and clicking on Mixer as and then unmute the “Headphone”. +After this I restarted the computer and logged into GNOME session, and played a youtube video. Sound was coming alright. I logged out from GNOME session and logged in again in KDE session and tried a video on youtube and it was working fine. + +#### Change the theme and wallpaper. + +To change the theme, it is quite simple. Just right click anywhere on desktop and select desktop settings, and under theme either select the available option or download from available options and install. For wallpaper also do the same thing. + +#### Change the splash screen + +Download the splash screen. I downloaded “Kcarbon” splash screen from [here](http://kde-look.org/index.php?xcontentmode=35x45) as it was going nicely with my desktop theme and wallpaper. + +Once it was downloaded, I opened from Application Menu → Computer → System Settings → Appearance (under look and feel section) → Splash Screens to get to this screen and then click install, select location where you downloaded the tar file. + +#### Change the Log-in Screen (KDM Screen) + +**UPDATE** + +* Open the 'System Settings' KDE application. +* Choose the 'Advanced' tab. +* Go to 'Login Manager'. +* Choose 'Theme' tab. +* Click on the 'Install new theme' button. +* Choose the compressed file and click ok. + + +This one was rather flaky solution. I could not find anything that could change the initial background screen where we enter user credentials and password. This is called KDM Theme as I learnt while finding out how to do it. Several searches on google talked about something called KDM Theme Manager but they are all old mails and for new KDE 4+ it comes pre-installed and I did not know what to do. +So I downloaded one of the KDM themes from [http://kde-look.org](http://kde-look.org) and unzipped it into the following location as root. + +```bash +kdesudo dolphin /usr/share/kde4/apps/kdm/themes/ +``` + +Next, I renamed the folder “oxygen-air” as “oxygen-air_old” and the downloaded and unzipped folder as “oxygen-air”. +This is it. When I restarted I had the brand new KDM Theme to my satisfaction.:) + + +#### Change the boot splash screen + +I tried many suggestions but only after going through the whole GRUB2 entries as explained on [this link](http://ubuntuforums.org/showthread.php?t=1195275&highlight=grub2), I got the result I was looking for. However, I did have to do a little bit of trial and error so I will put the steps that finally worked for me. These may also come handy if you do not want to know in depth about all GRUB 2 stuff. + + +* In GIMP, open the image you want to show as the background when GRUB shows choices to select which OS you want to load at start-up + +* Now goto Image -> Scale and then enter height as 640, press tab. + +* Now save the image as a .png file. + +* in the terminal type kdesudo dolphin /usr/share/images/desktop-base + +* Copy the image saved in step 3 and paste it in the desktop-base folder + +* Now in the terminal type kdesudo kate /etc/grub.d/05_debian_theme + +* This will open 05_debian_theme file with kate text editor. + +* Go to line 16 and find the following line and edit the highlighted area, replacing it with the name of image copied into desktop-base folder in Step 5 `for i in {/boot/grub,/usr/share/images/desktop-base}/moreblue-orbit-grub.{png,tga} ; do` + +* Save the file and in the terminal type: + +```bash +sudo update-grub2 +sudo reboot +``` \ No newline at end of file diff --git a/docs/posts/2010-03-15-configure-blogtk-1-0-for-blogger.md b/docs/posts/2010-03-15-configure-blogtk-1-0-for-blogger.md new file mode 100644 index 0000000..8213abe --- /dev/null +++ b/docs/posts/2010-03-15-configure-blogtk-1-0-for-blogger.md @@ -0,0 +1,29 @@ +--- +title: Configure BlogTK 1.0 for blogger +slug: configure-blogtk-1-0-for-blogger +draft: False +description: Configure BlogTK 1.0 for blogger +authors: ['ankit'] +date: + created: 2010-03-15 12:39:00 + updated: 2010-03-15 12:39:00 +comments: true +--- + +Right so I am happy with Blogilo, then why BlogTK? + +It so happened that I was trying to edit my last post and for some unknown reason I was getting error in updating through Blogilo. I was not able to update through Blogilo and I think it is because of the snapshots included in the post. + + + +Anyhoo...so I installed BlogTK and after entering the details I found it not connecting so I opened the gnome-blog and then when I was configuring its preference I saw the default entry in the field XML/RPC URL - [http://www.blogger.com/api/RPC2](http://www.blogger.com/api/RPC2) + +I opened BlogTK, Edit -> Accounts and Settings and then in Server URL entered - [http://www.blogger.com/api/RPC2](http://www.blogger.com/api/RPC2) + +Next entered username and password fields. Clicked Save and then OK. Now on main window File-> Connect and it showed the message connected to server at [http://www.blogger.com/api/RPC2](http://www.blogger.com/api/RPC2). + +I was then able to edit the post however the Edit post etc were not all that great and meanwhile I found that Blogilo is working fine so am back to Blogilo. + +Not a huge tip and am sure many might already know but it took me a while to work out the working configuration. + +However, if someone knows better way to connect, please do let me know as BlogTK sure wasn't living up to the name and fame it has with this way of configuration so maybe there is a better way to do it. diff --git a/docs/posts/2010-03-19-audio-problem-in-wine-under-kde-4-4-1-solved.md b/docs/posts/2010-03-19-audio-problem-in-wine-under-kde-4-4-1-solved.md new file mode 100644 index 0000000..e44f5b0 --- /dev/null +++ b/docs/posts/2010-03-19-audio-problem-in-wine-under-kde-4-4-1-solved.md @@ -0,0 +1,25 @@ +--- +title: Audio problem in Wine under KDE 4.4.1 - Solved +slug: audio-problem-in-wine-under-kde-4-4-1-solved +draft: False +description: Audio problem in Wine under KDE 4.4.1 - Solved +authors: ['ankit'] +date: + created: 2010-03-19 12:43:00 + updated: 2010-03-19 12:43:00 +comments: true +--- +I was trying to install spotify on linux which used to work perfectly on Gnome and when I tried on KDE it was giving error box. I wrote winecfg on terminal and got following error: + +!!! failure "Error" + fixme:jack:JACK_drvLoad error loading the jack library libjack.so.0, please install this library to use jack + + + +After a bit of google I found the answer to be as simple as running this command on terminal: + +```bash +sudo apt-get install libjack0 +``` + +After this audio was working fine. Hope this helps few others. diff --git a/docs/posts/2010-03-22-install-maitreya-vedic-astrology-software-on-ubuntu-kbuntu.md b/docs/posts/2010-03-22-install-maitreya-vedic-astrology-software-on-ubuntu-kbuntu.md new file mode 100644 index 0000000..39129c3 --- /dev/null +++ b/docs/posts/2010-03-22-install-maitreya-vedic-astrology-software-on-ubuntu-kbuntu.md @@ -0,0 +1,125 @@ +--- +title: Install Maitreya - Vedic Astrology Software on Ubuntu / Kbuntu +slug: install-maitreya-vedic-astrology-software-on-ubuntu-kbuntu +draft: False +description: Install Maitreya - Vedic Astrology Software on Ubuntu / Kbuntu +authors: ['ankit'] +date: + created: 2010-03-22 13:38:00 + updated: 2010-03-22 13:38:00 +comments: true +--- + +First I must thank the Maitreya developers for coming up with such a wonderful Vedic Astrology software that works on Linux. I am not aware of any other vedic astrology software that works on Linux. + +Next I have to say that the install instructions on the site (and in the tarball) are not written with a newbie in mind and I had to struggle a bit before I could get it to work. The compiling of source code is really similar for I guess all source codes in general on linux and in particular in Ubuntu / Kubuntu but thing is when you are new to the platform and probably have almost all required software in repositories you rarely come across a situation where you need to compile from a source code to install your favourite software. Anyway so without wasting time in chit-chat, below is the step by step installation of Maitreya 6 on Ubuntu / Kubuntu. + + + +## Download Maitreya 6 tarball + +From your browser goto [http://maitreya.svn.sourceforge.net/viewvc/maitreya/](http://maitreya.svn.sourceforge.net/viewvc/maitreya/) and click on the link 'Download GNU tarball'. This will download the maitreya.tar.gz file on your system. + +## Prepare the system for installing + +I used the instructions from ubuntu help documentation that can be found here. However, I have documented the step that I used in sequence to achieve the objective. + + +1. Open the terminal. + +1. Type - sudo apt-get install build-essential checkinstall + +1. You will be asked for the password. Enter it. + +1. Once system completes the above instruction and is ready to take next instruction then Type: sudo apt-get install cvs subversion git-core mercurial + +1. Next type: `sudo chown yourusername /usr/local/src` + + !!! site-tip "Tip" + Please note that here you need to put the your user name so don't just copy paste. So if say user name is "ankit" , you will type sudo chown ankit /usr/local/src + +1. Next Type: `sudo chmod u+rwx /usr/local/src` + + +Now the system is prepared for installing. + + +## Install wxWidgets 2.8 Dependencies + +As mentioned on Maitreya site, the software depends on wxWidgets 2.8 and corresponding packages must be installed. On the site itself is given the code that needs to copied onto the terminal to achieve this. + + +1. Either from the site or from below select the text. + + ```bash + sudo apt-get install libwxbase2.8-0 libwxbase2.8-dev libwxgtk2.8-0 libwxgtk2.8-dev wx2.8-headers wx2.8-i18n + ``` + +2. Press ++ctrl+c++ + +3. Goto Terminal window and press ++ctrl+shift+v++ or click on Edit from top menu and select Paste. + +4. Press ++enter++. + +5. You may have to provide password. + +6. This should now install wxWidgets 2.8 + + +Over to next step. + + +## Configure and Build + +There are few things that should be done before we start to configure the downloaded source code. + +1. First goto the folder where maitreya.tar.gz file was downloaded in Step 1. + +2. Now right click and select 'Extract Archive To'. + +3. Select the location /usr/local/src + +4. This will extract a folder named maiterya into the location /usr/local/src + + +The content downloaded may change in future but at the time of writing this article it has two folders maitreya5 and maitreya6. All next steps will assume that folders name maitreya6 is present in your download but if not you will just have to replace with whatever folder is inside the extracted maitreya folder. + +1. Goto your termincal window and type: cd /usr/local/src/maitreya/maitreya6/trunk + +2. Now type `./configure`. + +3. If it gives some bash error like permission denied or file does not exist etc try `sh ./confgure`. This is what worked from me though everywhere instructions were to just use without sh. + +4. It will take a bit of time but it should complete without any error and end with some instructions about using 'make'. + +5. Now type `make` on terminal. + +6. It should be done with no errors if all steps were followed correctly so far. + + +Over to next step. + + + +## Install + +Again there were options around using sudo make install but the ubuntu help I have referred to (link above), suggested that checkinstall is better and it also creates a .deb file and I like the idea so that next time if I have to reinstall I don't need to do all this circus so I used the following and would recommend the same. + + +1. So in terminal window type `sudo checkinstall`. + +2. When you run it it will ask some questions like doc-pak is not there, do you want to create?(Y) just type Y. + +1. Then it shows some options and asks if you want to edit. I typed 2 to edit name and entered Maitreya. + +1. It threw a warning that maitreya 6-1_i386 is not complaint with debian standard or something to that effect and I just pressed enter. + +1. After this it was all fine and finally a message was shown telling a debian package has been created and to remove use dpkg ... + +The software should now be installed and you can test it by clicking the file named Maitreya6 at Location - /usr/local/src/maitreya/maitreya6/trunk/src/gui. However if you want to access it easily from desktop there is just one more step. + +## Create a desktop icon + +To create a desktop icon goto the folder `/usr/local/src/maitreya/maitreya6/trunk` and copy the file `maitreya6.desktop` and paste in on desktop. + +This is it you have now installed the Maitreya software !!! diff --git a/docs/posts/2010-05-03-jagannath-hora-on-linux-play-on-linux-magic.md b/docs/posts/2010-05-03-jagannath-hora-on-linux-play-on-linux-magic.md new file mode 100644 index 0000000..1113b74 --- /dev/null +++ b/docs/posts/2010-05-03-jagannath-hora-on-linux-play-on-linux-magic.md @@ -0,0 +1,56 @@ +--- +title: Jagannath Hora on Linux - Play on Linux Magic +slug: jagannath-hora-on-linux-play-on-linux-magic +draft: False +description: Jagannath Hora on Linux - Play on Linux Magic +authors: ['ankit'] +date: + created: 2010-05-03 12:57:00 + updated: 2010-05-03 12:57:00 +comments: true +--- + +## Background + +While I prefer Maitreya as it can run with Linux as native, quite a few of my friends have asked me if Jagannatha Hora will work on Linux and hence this post. + +Right, when I tried last time around mid Oct'09, JHora was not working using wine. However, recently things have changed. +If you are not aware or have not used Play On Linux then you should try it out. It works. Anyway back to original topic, the steps to install Jagannatha Hora on Kubuntu 10.04 are as below. (I am mighty sure this will work on other linux machines but I have tried it only on Kubuntu 10.04 which is increasingly becoming my OS of choice.) + + + +## Install Play On Linux (POL) + +You can install using Package Manager - Synaptic or KPackagekit but you will most likely get a little older version. I installed using Synaptic but then updated it by downloading directly from the site or follow this link to download the version 3.7.6. This is latest at the time of writing but it may be best to just get it from the website here. Once downloaded and installed, we move to a very simple and straightforward Step 2. + +## Download Jagannatha Hora (JH) + +!!! site-tip "Tip" + I am sure if you have come here searching on net, you don't need introduction to this software but in any case I admire the author of this software Mr. P. V. R Narsimha Rao for various reasons. One I consider him my Guru and as I am just a beginner to the world of astrology I find his to book the best reference one can get. I purchased it in 2006 when it was not easily available in UK but now the book itself is included in the software. Though the topic of this post does not require mention of book, I will take a moment to write few words on it. As the author is an engineer from IIT, his approach to subject was structured much like an engineering book. Very logical flow that takes you through the concepts in a way I have not found in any other book till date. It does not mean I don't like other authors. It just means that I recommend this to any beginner as it makes the concepts easy to grasp. + +OK, now back to topic, if you don't already know, you can get this software by following [this link](http://www.vedicastrologer.org/jh/) + +Once you download the zip file, extract it in the same folder. Just remember where you extracted. The file you have extracted will be named - `jh_full_install.exe`. + +## Install JH using POL + +Open the Play on Linux software. In Kubuntu you will find it by clicking `KLauncher -> Applications -> Games`. Once it starts, click on 'Install'. This will open a new window. + +In this window, click on the line in lower left hand side corner - “Install a .pol or an unsupported application”. This will close the above window and open another window. + +!!! site-tip "Tip" + Please note that if this window does not close, it appears that Play On Linux has hanged. In such case click on cross to close that window and it will show an error message suggesting that “PlayOnLinux” is not responding or something to that effect but you select to force close it and you will still land up on the next window. I found that this problem went away when I installed the latest version 3.7.6. + +a) In this window select “Manual installation” and click on “Next”. +b) On the next window that appears, click “Forward”. +c) You will be presented with another window with choices. Default choice being – “Install a program in a new prefix”. Keep it selected or if it is not selected, select it and click on “Forward”, +d) Next will be presented a window asking name for wine prefix. Type “Jhora” and click “Forward” +e) On the next window, there will be two check-boxes. Leave them un-ticked, do nothing and click Forward. +f) Once prefix is created, you will be presented with this window. Browse to the the file extracted in step 2 and then press Forward. +g) Now it should start installing and once complete, it will ask if you want it to be shown on desktop. I chose Yes but it will be up to personal preference. + +Play On Linux can also be used to install Spotify and 7zip, but more importantly you can see that an entry for Jhora has now been created. + +Finally on desktop you should be able to see the link for JH. You should now be able to use JH without any problems.Hope you found this post useful. + +-Ankit. \ No newline at end of file diff --git a/docs/posts/2010-11-13-part-1-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md b/docs/posts/2010-11-13-part-1-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md new file mode 100644 index 0000000..5f87205 --- /dev/null +++ b/docs/posts/2010-11-13-part-1-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md @@ -0,0 +1,112 @@ +--- +title: Part 1 - Configure Epson S515W on Linux Mint / Ubuntu 10.04 +slug: part-1-configure-epson-s515w-on-linux-mint-ubuntu-10-04 +draft: False +description: Part 1 - Configure Epson S515W on Linux Mint / Ubuntu 10.04 +authors: ['ankit'] +date: + created: 2010-11-13 14:50:00 + updated: 2010-11-13 14:50:00 +comments: true +--- + +!!! site-abstract "UPDATE" + While this tutorial will get your printer up and running, you should also follow [Part 2](./2011-05-04-part-2-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md) to ensure that it continues to work even after you have restarted your printer. + + + +Lately I have not done much experiments and hence a stable system. I did not require any changes and all was well and then recently I changed over to Linux Mint which by the way is a UBUNTU derivative, very slick and very cool. Now after this reinstall I was able to get back all my previous installs and everything the usual way but scanning using Epson S515W was not out of the box and below are the steps I followed to get it working. + + +## Step 1: Configure Printer + +This really works quite easily in all Ubuntu installs. Goto System > Administration > Printer + +![Alt Text](../assets/images/2016/07/201011_Fig_1.png) + +Now you can see my printer configured but when you will get this window, you wil only see Print_to_PDF. You should then Click on arrow next to ADD and select Printer. It will open the window below: + +![Alt Text](../assets/images/2016/07/201011_Fig_2.png) + +Again under Network Printer it may not show anything initially but if your printer is on and configured to your wireless router it will identify in a moment or two. If it does not, click on Find Network Printer. + +![Alt Text](../assets/images/2016/07/201011_Fig_3.png) + +Once your printer appears, click on it and then click on 'Forward'. + + +## Step 2: Print a test Page + +Open the Printer window again from System>Administration>Printer and double click on printer. It should open the following window: + +![Alt Text](../assets/images/2016/07/201011_Fig_4.png) + +Click on 'Print Test Page'. If it prints the ubuntu test page correctly your printer is configured. Mine was so I will not go more in details of alternative option. If you do want to know more let me know and I will put a post. +However if now you will try to scan you will find that scanner either is not identified or if it is it does not complete the scanning and printer gets hanged, so over to next steps then. + + +## Step 3 - Install drivers and software for scanner + +Goto the [avasys site](http://avasys.jp/eng/) that provides downloads and navigate for your model or if you have the same as mine just click on the link below and then goto Downloads and select All In One Printers. On the next page scroll down all the way and select the radio button for your printer. + + + +![Alt Text](../assets/images/2016/07/201011_Fig_5.png) + +Now these installs need to happen in a sequence and we don't need all deb files on the next page anyway so I will mention download and install in sequence as it should be done. + + +1. From the section 'Download for Epson Stylus NX510/NX515/SX510W/SX515W/TX550W data package' download the data package iscan-data_1.4.0-1_all.deb. + +2. Install this package now. + +3. From the section 'Download for Epson Stylus NX510/NX515/SX510W/SX515W/TX550W core package' download iscan_2.26.0-3.ltdl7_i386.deb. + +4. Install this package now + +5. From the section 'Download for Epson Stylus NX510/NX515/SX510W/SX515W/TX550W network plugin package' download iscan-network-nt_1.1.0-2_i386.deb + +6. Install this package now. + +7. Now on your printer(actual machine not on laptop / computer) goto Settings (Press the button with Wrench and Screwdriver symbol as shown in the image Printer Control). + + ![Alt Text](../assets/images/2016/07/201011_Fig_6.png) + +8. Using left arrow navigate to Network Settings (Computer and Printer icon) + +9. Click OK button. + +10. Using Down Arrow select 'Confirm Settings' and click OK button. + +11. Press Down Arrow twice and it should show the Printer IP Address. Note it Down. It will be something like 192.168.1.60. + +12. Now back on your laptop open terminal and type gksudo nautilus. You will be asked your superuser password. Provide that. It will open the file explorer with admin privileges. Be extremely careful now, you do not want to delete anything in this privilege mode. + +13. In the file explorer, click on 'File System' and browse to the file path etc>sane.d and open the file named epkowa.conf. (Screenshot below) + +14. In the file below usb and scsi add the line net 1865 so for our example this will be net 192.168.1.60 1865. (In gedit it was line 12 for me.) + +15. Save and close the file. + +16. Close all windows. + + ![Alt Text](../assets/images/2016/07/201011_Fig_7.png) + + +## Step 4 - Test Scanner + +Now open Menu>All Applications>Graphics>Image Scan! for Linux. + +![Alt Text](../assets/images/2016/07/201011_Fig_8.png) + +This should open the software window. Now click on preview to see that a document preview is produced. If it does you are all set. If not you must check the configuration of epkowa.conf and try again. + +![Alt Text](../assets/images/2016/07/201011_Fig_9.png) + +The preview of my 3.5 year olds drawing from scanner : + +![Alt Text](../assets/images/2016/07/201011_Fig_10.png) + +and the final scan is shown below: + +![Alt Text](../assets/images/2016/07/2011_Fig_11.jpg) \ No newline at end of file diff --git a/docs/posts/2011-02-19-call-us-and-several-other-countries-free-using-android.md b/docs/posts/2011-02-19-call-us-and-several-other-countries-free-using-android.md new file mode 100644 index 0000000..116e3bb --- /dev/null +++ b/docs/posts/2011-02-19-call-us-and-several-other-countries-free-using-android.md @@ -0,0 +1,38 @@ +--- +title: Call US and several other countries free using Android +slug: call-us-and-several-other-countries-free-using-android +draft: False +description: Call US and several other countries free using Android +authors: ['ankit'] +date: + created: 2011-02-19 15:30:00 + updated: 2011-02-19 15:30:00 +comments: true +--- + +That's right...with smartphones all that was possible using computers is increasingly becoming feasible through phones. I just now configured my Nexus S to make free phone calls over internet to USA. How you ask? Well here we go: + + + +The site offering free calls to USA landlines and mobiles is www.voipstunt.com so I registered an account with this site. + +Now Android 2.3 has inbuilt SIP support so I directly configured instead of downloading any app from market but it can be as easily done using sipdroid or csipsimple but anyway since there is good dialer integration I opted for direct route. + +1. Goto Settings -> Call Settings and under Internet Call Settings click on 'Accounts'. + +1. Untick receive calls. + +1. Click on Add Account. + +1. Now in username enter the username with which you have registered on voipstunt website. + +1. Enter the password used for voipstunt account in password field. + +1. Enter `sip.voipstunt.com` in server. + +1. Untick the 'Set as primary account' field. + +1. Press back button till you are back to call settings. Now under Internet Call Settings click on 'Use Internet Calling' and select 'Ask Each Time'. + + +This is it. All done. Try calling landline or mobile number of your US contact and before placing the call your phone will ask whether to place call over internet or cellular network. Choose internet and you are off to free calls. diff --git a/docs/posts/2011-02-20-google-voice-sip2sip-ikall-free-international-calls-to-known-contacts.md b/docs/posts/2011-02-20-google-voice-sip2sip-ikall-free-international-calls-to-known-contacts.md new file mode 100644 index 0000000..c540764 --- /dev/null +++ b/docs/posts/2011-02-20-google-voice-sip2sip-ikall-free-international-calls-to-known-contacts.md @@ -0,0 +1,172 @@ +--- +title: Google Voice + SIP2SIP + Ikall = Free international Calls to known contacts +slug: google-voice-sip2sip-ikall-free-international-calls-to-known-contacts +draft: False +description: Google Voice + SIP2SIP + Ikall = Free international Calls to known contacts +authors: ['ankit'] +date: + created: 2011-02-20 15:32:00 + updated: 2011-02-20 15:32:00 +comments: true +--- +## Background + +Second post in succession on the topic but believe me when I get a new gadget I try getting all information and then once I have had the stuff working I have to make a post right away or I will forget and hence this post. This post also overrides the previous posts. +Right then, let's get down to business. + +!!! quote "Objective" + We aim to make free international calls and there is nothing illegal in this set-up, not to my knowledge. + +!!! question "How?" + Google has introduced Google Voice and allows free calls to all US numbers. This can be done using their google talk plugin in the gmail browser. + + + +## Pre-Requisites + +* Gmail account Preferably a new one and not the one you use for your day to day usage. + +* Ability to install X-Lite 4.0 which will require a machine running Windows PC directly or on virtualbox. + +* Ability to install Hotspot Shield if residing outside of USA. + +* An Android device at both source and destination of the call. + + +## Get a SIP number + +If outside of USA, install hotspot shield on windows machine by going to this site - [http://www.hotspotshield.com](http://www.hotspotshield.com) .I am not sure how safe this is from spyware and all security perspective. I am not really worried about it as I carry out these things on virtualmachine using virtualbox and there is no real threat to my actual machine which runs on Linux. So if Windows is your primary machine you do it on your own risk. +Once installed, open the site www.sip2sip.info.Register on sip2sip using your new gmail account. Ensure that you select US Central as your region. +You will get an email from sip2sip on the new gmail account giving your login details which will be something like: + +```yaml linenums="1" +SIP address: 2233xxxxxx@sip2sip.info +Password: abcdabcdabcd +``` + +Open the email and click on the link provided for lgging in. Enter the login details provided and goto settings tab (3rd from left). +In the first field under SIP Account, enter a new easy to remember password and click `SAVE`. +This completes Step 1 and you have successfully created SIP number for yourself. + +## Get a US phone number using ipkall + +Go to the [ipkall website](http://www.ipkall.com) and click on sign-up.On the sign-up page complete the following details using the email from sip2sip: + +```yaml linenums="1" +SIP username: 2233xxxxxx +Hostname or IP address: sip2sip@info +Email Address: Preferably the email address you used to register at sip2sip +Password: Prefereably the same password as what you changed on sip2sip in Step 1-5. +Enter the human verification codes and click 'Submit'. +``` + +You will receive a mail with in your email account with a new US number with text of something to following effect: + +!!! success + Thank you for signing up. Your IPKall phone number is: 253-XXX-XXXX. + SIP Phone Number: 2233xxxxxx + SIP Proxy: sip2sip.info + Email: abcdefg@gmail.com + Password: qwerty + +This completes Step 2. You have now received a US phone number that is linked to your sip2sip account. + + +## Set-up Xlite / softphone to receive calls made to US phone number + +In order to activate Google Voice account, it is important to be able to receive call on the new phone number that we have created in Step 2 so install Xlite v4.0 from [here](http://download.cnet.com/X-Lite/3000-2349_4-10547103.html) + +Once X-Lite is installed, open it and click on `Softphone -> Account Settings`. Now fill the following fields: + +```yaml linenums="1" +Account Name: Fill your gmail username. +User ID: 2233xxxxxx +Domain: sip2sip.info +Password: sip2sip password (qwerty for this example) +``` + +Click OK at the bottom of the window. This completes Step 3. + +## Activate Google Voice for this Gmail account + +* Log into the [google voice account](https://www.google.com/voice). + +* Provide a user pin to retrieve voicemails + +* Now provide the US phone number obtained in Step 2-4 (253-XXX-XXXX) + +* A window will be shown with two numbers and a button call now. + +* Click on Call Now and you should receive call on Xlite phone. + +* Accept the call on Xlite and enter the two numbers shown in google's window. + +* You will get confirmation that the numbers are correct and will be asked to set-up voice mail greeting or hang-up. + +* Hang-up now as you can set this up later. + +Google Voice account is now set-up. + +## Configure Android to receive calls using Google Voice + +If you are using nexus S, good news, it has inbuilt capability to get the SIP calls though this can be also be done using SIPDROID on other android devices. For Nexus S you can follow the steps below: + +* Goto Settings -> Call Settings and under Internet Call Settings click on 'Accounts'. + +* Untick receive calls. + +* Click on Add Account. + +* Now in username enter the 2233xxxxxx provided by sip2sip + +* Enter the password used for sip2sip account in password field. (qwerty in this example) + +* Enter sip2sip.info in server. + +* Untick the 'Set as primary account' field. + +* Click on Optional Settings and in Outbound proxy address enter proxy.sipthor.net + +* Press back button till you are back to call settings. Now under Internet Call Settings click on 'Use Internet Calling' and select 'Only for Internet Calls'. + + +For SIPDROID once you have downloaded and installed it from android market, follow the steps below: + +* Open SIPDROID, and goto Settings ->SIP Account. + +* In Authorization Username enter: 2233xxxxxx@sip2sip.info + +* Enter the password used for sip2sip account in password field. (qwerty in this example) + +* In Server or Proxy enter proxy.sipthor.net + +* In Domain enter sip2sip.info + + +Now save and exit. SIPDROID will register the VOIP and turn green. +Now from gtalk plugin in the browser from some other gmail account try to call US phone number obtained in Step 2-4 (253-XXX-XXXX). Your phone should ring and so should the Xlite. +If step 4 did not happen as expected, you need to review the configuration and once it does happen as expected, your set-up to recieve calls is completed. + + +## Configure Android to make calls using Google Voice + +* Download and install Google Voice Callback on android device - [https://market.android.com/details?id=com.xinlu.gvdial&feature=search_result](https://market.android.com/details?id=com.xinlu.gvdial&feature=search_result) + +* Provide the gmail credentials for the application. This will perhaps explain my recommendation for a new gmail account. You will be giving login credentials to a third party application but since it's a new account with no confidential info, it should really be safe. + +* In the settings for when to use callback select 'Ask Everytime' if you are outside of USA. + + +This is it. Try calling one of your USA contact and this application should make a call back and you should be able to talk for free to your US friends. + +This is happy ending for those who don't have sight of our aim - make free international calls. For free international calls though you have reached a point where you will have dependency on person you are calling. Following 3 options will be possible: + +If the person you are calling also has android device and they follow this tutorial they will have a US number which you can then store in your contacts against that person's name and from thereon you both can call each other absolutely free. + +If your friend has a SIP enabled device, they can follow this tutorial and replace the set-up of Android device to setting up their own SIP device. + +If above two are not viable options, you can ask your friend to call you on your international number through googletalk plugin in their web browser. Unfortunately this takes away the flexibility of you being able to call them but given the constraints this may still be a good option to talk for free. + +> Final words - I know it's a long post and looks complex but believe me if you do it right it takes roughly 20 minutes. + +Hope you find the post helpful. \ No newline at end of file diff --git a/docs/posts/2011-04-17-time-for-a-bit-of-show-off.md b/docs/posts/2011-04-17-time-for-a-bit-of-show-off.md new file mode 100644 index 0000000..3424a9d --- /dev/null +++ b/docs/posts/2011-04-17-time-for-a-bit-of-show-off.md @@ -0,0 +1,45 @@ +--- +title: Time for a bit of show-off +slug: time-for-a-bit-of-show-off +draft: False +description: Time for a bit of show-off +gallery: [{'url': '/assets/images/2016/07/20110417_Fig_1.jpg', 'image_path': '/assets/images/2016/07/20110417_Fig_1.jpg', 'alt': 'Image 1', 'title': 'Image 1'}, {'url': '/assets/images/2016/07/20110417_Fig_2.jpg', 'image_path': '/assets/images/2016/07/20110417_Fig_2.jpg', 'alt': 'Image 2', 'title': 'Image 2'}, {'url': '/assets/images/2016/07/20110417_Fig_3.jpg', 'image_path': '/assets/images/2016/07/20110417_Fig_3.jpg', 'alt': 'Image 3', 'title': 'Image 3'}] +authors: ['ankit'] +date: + created: 2011-04-17 15:02:00 + updated: 2011-04-17 15:02:00 +comments: true +--- + +Hey Hey I made an Android app named "Sai Satcharitra". It's a very basic app and +all it does is helps people read Sai Satcharitra on their Android Smartphones, +something that can also be achieved by maybe converting the text ino a pdf, epub +file etc. + + + +![Image 1](../assets/images/2016/07/20110417_Fig_1.jpg "Image 1") +![Image 2](../assets/images/2016/07/20110417_Fig_2.jpg "Image 2") + +Anyhoo, all I wanted was to experiment with Android coding to see how much of +that developer is still alive in this business project manager. It took me about +5 hours to complete it after understanding the nuances of Android SDK and +refreshing my java coding skills which were quite minimal to start with :winking:. I +used to be more of a PL/SQL / Lotus Script / C++ kind of developer in my prime. + +![Image 3](../assets/images/2016/07/20110417_Fig_3.jpg "Image 3") + +So well long story short, I paid the amount to be registered as developer so I +can publish this app on android market all the while thinking that if people do +find it useful, I will assume this amount and effort is my way of giving +something as Charity in name of Sai Baba. + +I published the app on Market on 26/03/2011 and then I was busy with all the +work that spring brings with it. Then today when I checked my account I was +happily surprised to see the stats. The app has been downloaded over 200 times +with about 180 active installs. + +It felt very good to see that many people are finding my work useful.I was a bit +disappointed that of the 200+ downloads only 2 have given feedback but hey, I +wasn't there fishing for reviews so as long as it helps someone, I am a happy +dude. \ No newline at end of file diff --git a/docs/posts/2011-04-24-logitech-ex100-wireless-keyboard-and-mouse-not-working-read-on.md b/docs/posts/2011-04-24-logitech-ex100-wireless-keyboard-and-mouse-not-working-read-on.md new file mode 100644 index 0000000..043bd3e --- /dev/null +++ b/docs/posts/2011-04-24-logitech-ex100-wireless-keyboard-and-mouse-not-working-read-on.md @@ -0,0 +1,39 @@ +--- +title: Logitech Ex100 - Wireless Keyboard and Mouse not working? Read on.. +slug: logitech-ex100-wireless-keyboard-and-mouse-not-working-read-on +draft: False +description: Logitech Ex100 - Wireless Keyboard and Mouse not working? Read on.. +authors: ['ankit'] +date: + created: 2011-04-24 17:06:00 + updated: 2018-03-29 15:37:53 +comments: true +--- + +Today for some unknown reason suddenly my Logitech Wireless Keyboard and Mouse - Model Number EX100 (*Logitech Cordless Desktop EX100 (920-000879)*) stopped working and very stubbornly denied to work despite my repeated attempts on all obvious and logical steps - resets, battery change and such. + +After trawling through the internet for some time I figured that I am not alone in facing the issue but surely have been hit quite late by it. It appears Logitech was more than happy to replace it at one point. + + + +Anyway, further forum hopping lead me to a post that felt like a very unlikely solution but I gave it a shot and should I say more? It worked indeed. So this post is not only for world but for my future reference. + +With thanks to "Andromedia" on logitech forum, I present the solution that resurrected my dead keyboard and mouse. + +For Keyboard: + + 1. Remove the batteries from the Keyboard. + 2. Type on the keyboard for about 10 to 30 seconds. + 3. Insert the batteries back into Keyboard. + 4. Press left ++alt+++left ++ctrl+f12++ all at the same time and hold for about a + second. + 5. Now PRESS the Connect Button on Receiver. (DO NOT HOLD) + 6. Now PRESS the Connect Button on Keyboard. (DO NOT HOLD) + 7. Finally, Press "Esc" on Keyboard. + +For Mouse: + + 1. PRESS the Connect Button on Receiver. (DO NOT HOLD) + 2. Now PRESS the Connect Button on Mouse. (DO NOT HOLD) + +That should do the trick. At least for me it did. :smile: \ No newline at end of file diff --git a/docs/posts/2011-04-29-mmc-convert-media-files-on-linux.md b/docs/posts/2011-04-29-mmc-convert-media-files-on-linux.md new file mode 100644 index 0000000..6a1f695 --- /dev/null +++ b/docs/posts/2011-04-29-mmc-convert-media-files-on-linux.md @@ -0,0 +1,55 @@ +--- +title: MMC Convert media files on Linux +slug: mmc-convert-media-files-on-linux +draft: False +description: MMC - Convert media files on Linux +authors: ['ankit'] +date: + created: 2011-04-29 14:48:00 + updated: 2011-04-29 14:48:00 +comments: true +--- + +I have been using Mobile Media Converter for almost a year now and it is such a great tool. I think it is a must have at-least on Linux. +It not only converts almost all popular media formats into other formats but also has an inbuilt youtube video downloader which comes very handy for converting all the free official(and unofficial) song videos into MP3. +Let me spell it out, how it all works. + + + +## 1. Download and Install MMC + +Well you download and install MMC from [this site](http://www.miksoft.net/mobileMediaConverterDown.htm) + +Scroll down to the part of screen that shows the following: + +![Alt Text](../assets/images/2016/07/20110429_Fig_1.png) + +Now follow the instructions to add Medibuntu repo if you haven't already done so. + +## 2. Download media: + +Open youtube and search for a song that you want to have on you mp3 player. Copy the link from browser and open MMC. In Linux Mint follow Menu - All Applications - Sound & Video, to open following window. + +![Alt Text](../assets/images/2016/07/20110429_Fig_2.png) + +Now clicking on Add YouTube video will open following window: +Only in this window your link copied from youtube would be already populated. +Click on Download and wait till it downloads your song. + +![Alt Text](../assets/images/2016/07/20110429_Fig_3.png) + +## 3. Convert it to MP3 + +Once downloaded the video gets added into the queue as shown in the following screenshot: + +![Alt Text](../assets/images/2016/07/20110429_Fig_4.png) + +Now you can select the location where you want to store the mp3 and the conversion type as can be seen below. + +![Alt Text](../assets/images/2016/07/20110429_Fig_5.png) + +This also shows how many other formats this nice little piece of software can handle. +Anyway, select MP3 Audio and click on Convert. +That's it all done. +Now I don't condone the download of any material with copyright, I do support use of anything that is legal. +There are some really good official videos (like the one in this example) that can be converted into MP3 or even video formats to enjoy on a long journey. diff --git a/docs/posts/2011-05-02-glympse.md b/docs/posts/2011-05-02-glympse.md new file mode 100644 index 0000000..0062163 --- /dev/null +++ b/docs/posts/2011-05-02-glympse.md @@ -0,0 +1,25 @@ +--- +title: Glympse +slug: glympse +draft: False +description: Glympse +authors: ['ankit'] +date: + created: 2011-05-02 15:09:00 + updated: 2011-05-02 15:09:00 +comments: true +--- +Every now and then we come across something that has a strong potential, something that is a great phenomenon in making and **Glympse** to me is that idea. + +The simple to use and highly effective application available on android market for free that allows you to share your position during the travel in real time. + + + +While it's moderately useful for long journeys as was evident on my holiday travel this weekend when my host was able to monitor my progress to their house 250+ miles away, I think this application can find great and effective use in postal and transportation sector. + +It not only allows you to share your journey but also shows you when was your progress last viewed and who is viewing it right now.I provides you the control on who can have access to this real time view and for how long. You provide a time-frame for which you would prefer this monitoring to be available and then allows you to add more time in 15 minutes intervals. It integrates with phone contacts and has a very slick GUI. + +All in all very impressed with this application and the fact that it's available for free is the icing on cake. + +If you have an android phone, do lot of travelling and need to keep calling for your whereabouts, guess this application can save you on unnecessary calls while letting you concentrate on your journey. +Highly recommended application. diff --git a/docs/posts/2011-05-04-part-2-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md b/docs/posts/2011-05-04-part-2-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md new file mode 100644 index 0000000..7e345e6 --- /dev/null +++ b/docs/posts/2011-05-04-part-2-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md @@ -0,0 +1,53 @@ +--- +title: Part 2 - Configure Epson S515W on Linux Mint / Ubuntu 10.04 +slug: part-2-configure-epson-s515w-on-linux-mint-ubuntu-10-04 +draft: False +description: Part 2 - Configure Epson S515W on Linux Mint / Ubuntu 10.04 +authors: ['ankit'] +date: + created: 2011-05-04 15:12:00 + updated: 2011-05-04 15:12:00 +comments: true +--- + +While the majority of settings are covered in my previous post here I found that each time I switched off my printer, it used to change it's IP address and I had to repeat Steps 7 to 16 each time. My printing and scanning needs are pretty limited so I never bothered working out a solution until today and knowing what I now know, it was quite a simple and quick solution I should have done this on the first place. Anyway as they say better late than never. :smile: + +So to carry out the magical transformation to your printing experience follow the steps below: + + + +1. On your printer (actual machine not on laptop / computer) go to Settings (Press the button with Wrench and Screwdriver symbol as shown in picture). + + ![Alt Text](../assets/images/2016/07/201011_Fig_6.png) + +2. Using left arrow navigate to Network Settings (Computer and Printer icon) + +3. Click OK button. + +4. Using down arrow navigate to 'General Setup' and click OK button. + +5. Printer will show the question 'After changing the settings, network may be disconnected. Continue?' and present options Yes and No with No selected (highlighted in Yellow.) + +6. Using left arrow move to Yes and press OK. + +7. Printer will now show the screen for 'Printer Name Setup', do not change anything. Just Click OK to proceed to next screen. + +8. Now printer will show screen for TCP/IP screen with two options Auto which is selected by default and highlighted in yellow and Manual. Here using down arrow key select Manual. + +9. Click OK button. + +10. The screen will show current IP address assigned to printer something like 192.168.1.66. + +11. Now I am assuming that you have already followed part 1 of this tutorial so on your laptop open the file epkowa.conf from `/etc/sane.d`. You can also open this file by typing the following command in terminal `gedit /etc/sane.d/epkowa.conf` + +12. Note down the IP address you entered last time 192.168.1.60 below usb and scsi. (Line 12 on my file.) + +13. Now on your printer change IP address to match the one on last step. To do so, first click on left arrow on printer to reach the last digit of displayed IP address and then adjust the number using up or down arrow. + +14. Once it is same as that on epkowa.conf file (192.168.1.60 in this example), click OK button. Now continue to click OK button on all remaining screens till you reach Network Settings screen (About 5 times) + +15. Press OK one final time and that's it you are done. + + +If you are to now switch off and switch on the printer and test scan it should work without any issues. +Hope you find this useful. diff --git a/docs/posts/2011-05-07-how-to-edit-pdf-in-linux-the-easy-way.md b/docs/posts/2011-05-07-how-to-edit-pdf-in-linux-the-easy-way.md new file mode 100644 index 0000000..a28809a --- /dev/null +++ b/docs/posts/2011-05-07-how-to-edit-pdf-in-linux-the-easy-way.md @@ -0,0 +1,123 @@ +--- +title: How to edit PDF in Linux - The easy way. +slug: how-to-edit-pdf-in-linux-the-easy-way +draft: False +description: How to edit PDF in Linux - The easy way. +authors: ['ankit'] +date: + created: 2011-05-07 15:35:00 + updated: 2011-05-07 15:35:00 +comments: true +--- + +## Background + +Recently someone asked this question to me and after some search on Google I came across mentions of PDFedit, Scribus, flpsed, Gimp, PDFMod and even the openoffice plugin for importing PDF and I tried all of these. PDFescape is probably a good solution but is only online and limited to 30 pages in it's free avatar. If your aim is similar to the one stated below, these tools are way too complicated (PDFedit), limiting (PDFescape) or ineffective (rest of them). +So, Let's start with the usual what was my aim question. + +!!! quote "Objective" + To be able to highlight and put his own annotations, highlights and comments in the lecture notes that he gets from his college lecturers in pdf and be able to print the amended notes from any platform. (Linux / Mac / Windows.) + + + +**What Worked?** + +What I gave my friend as his final solution, in the end, kills two birds with one stone - Use of 'Calibre' to convert the pdf to rtf and then use the open office to edit the notes. Where is the second bird, you ask...well Calibre is a great tool, infact in my opinion the best tool for ebook management. Using Calibre will not only help in editing the notes from the pdf but enable us to have a copy of final notes for ready reference right on our smartphone. There you have the second bird. :smile: + +## Step 1 - Install and set-up Calibre: + +The current version of Calibre at the time of writing is 0.8 while the one in ubuntu repository is 0.6 so I recommend you should update after installing from repo as that will ensure all dependencies are satisfied and then you have the latest version as well. +So first open your package manager (on Linux Mint: Menu - Package Manager). You will need to provide root password and then search for Calibre and install it. +Now to update to latest version, open the terminal (on Linux Mint: Menu - Terminal) and type the following command: + +```bash +sudo python -c "import urllib2; exec urllib2.urlopen('http://status.calibre-ebook.com/linux_installer').read(); main()" +``` + +You will be asked for your root password so provide that and terminal will show a question: + +```bash +Enter the installation directory for calibre [/opt]: # (1) +``` +1. Type `/opt` and press enter. + +Now type Calibre and it will fire up the welcome wizard. + +**Follow these screen-shots:** + +Select your language and Directory where you will want your ebooks to be stored. I keep it default. + + +![Alt Text](../assets/images/2016/07/20110507_Fig_1.png) + +Select your ebook Device. I have selected Android as that is the smartphone I use for reading ebooks. + + +![Alt Text](../assets/images/2016/07/20110507_Fig_2.png) + +That's Calibre configured. Easy-Peasy !!! :) + + +![Alt Text](../assets/images/2016/07/20110507_Fig_3.png) + + +## Step 2: Import pdf into Calibre + +Open Calibre (On Linux Mint: Menu - All Applications - Office - Calibre or just by typing calibre on terminal). + +![Alt Text](../assets/images/2016/07/20110507_Fig_4.png) + +Now click on 'Add Books' and select 'Add books from single directory. + +![Alt Text](../assets/images/2016/07/20110507_Fig_5.png) + +It will open the dialogue box for you to select file. Go to the location where you have saved your pdf. In my case it was in /Downloads/Tutorials as you can see in next screenshot. + +![Alt Text](../assets/images/2016/07/20110507_Fig_6.png) + +Select the file and click open. Calibre will then import the pdf. While importing it shows the 'Adding' screen as can be seen in screenshot below. + +![Alt Text](../assets/images/2016/07/20110507_Fig_7.png) + +Depending on size of the pdf it can take a while or be very quick. In this case as it's a small lecture note it was hardly few seconds. Once completed, imported file will appear in your library as shown. + +![Alt Text](../assets/images/2016/07/20110507_Fig_8.png) + +Once completed, it's time to move to next step. + + +## Step 3: Convert pdf to rtf using Calibre + +Select and right click on the pdf imported into Calibre and select Convert - Convert Individually. + +![Alt Text](../assets/images/2016/07/20110507_Fig_9.png) + +It will open the window to show options for conversion as shown below. In this window on right hand side corner select 'rtf' from the drop-down against 'Output'. + +![Alt Text](../assets/images/2016/07/20110507_Fig_10.png) + +Now click OK. Once Converted it will show the rtf format in right pane as shown in red circle in following figure. + +![Alt Text](../assets/images/2016/07/20110507_Fig_11.png) + + +## Step 4: Open rtf file and start editing + +Click on rtf and it will open the file in open-office and you are ready to edit, highlight and do pretty much what you like. +You may notice that some pictures are not coming on the page but all that is required is to do some formatting for openoffice which is quite straight forward. + +Double click on the picture and in most cases it will be fixed if you click on 'keep Ratio' and changing the anchor to Page. + +![Alt Text](../assets/images/2016/07/20110507_Fig_12.png) + +Some changes to page layout from Portrait to landscape may also help. To do so go to Format and select Page. It will open the dialogue box as shown below where you can switch between Portrait and landscape. + +![Alt Text](../assets/images/2016/07/20110507_Fig_13.png) + + +## Step 5: Convert final version of rtf to epub and transfer to your phone (Optional) + +Once done save your work with a different filename and follow steps 2 and 3 to import the saved rtf file into calibre and convert to epub this time (Keep output to epub in step 3) and then transfer it to your smartphone through mail or by usb transfer. +That's it all done. It's a long tutorial keeping in mind people who are new to Linux but carrying out the steps to convert doesn't take more than 2 minutes so trying this will be well worth it. + +I must add that this may not be required if all you will ever need is to add notes and comments and highlight in pdf and then print from your own laptop / computer. In which case OKULAR is a far superior way of doing it and you must try it out. However, having said that I don't know many college going students who have easy access to Printers at their hostel and in all likelihood their print-outs will be from college library in which case solution above should come handy. \ No newline at end of file diff --git a/docs/posts/2011-06-04-install-open-workbench-and-jre-on-wine-in-linux-mint.md b/docs/posts/2011-06-04-install-open-workbench-and-jre-on-wine-in-linux-mint.md new file mode 100644 index 0000000..595b23a --- /dev/null +++ b/docs/posts/2011-06-04-install-open-workbench-and-jre-on-wine-in-linux-mint.md @@ -0,0 +1,137 @@ +--- +title: Install Open Workbench and JRE on Wine in Linux Mint +slug: install-open-workbench-and-jre-on-wine-in-linux-mint +draft: False +description: Install Open Workbench and JRE on Wine in Linux Mint +authors: ['ankit'] +date: + created: 2011-06-04 15:55:00 + updated: 2011-06-04 15:55:00 +comments: true +--- + +## What is Open Workbench? + +Open Workbench is a Project Planning Software comparable to Microsoft Project. There are mixed views on whether it is truly open source or not but as it is considered a very good alternative for Microsoft Project and it is free to download, it is something I as a Project Manager would want to know about. After all some of my clients are going to be using this. :) + + + +Now then, as of writing this article Open Workbench is not available from the well publicised site www.openworkbench.org which seems to be down. Instead it is available for download fromhttp://www.itdesign.de/en/products-solutions/open-workbench.html + +As you will find that the installer is an exe and the product is made for Windows platform and requires Java Runtime Environment, we will need to either use Windows in virtualbox or Wine. I am going to cover below the steps for installing the software on Linux using Wine. + +Steps to install Open Workbench and JRE on Wine V1.2.2 in Linux Mint: +
    +
  1. Install JRE in wine
  2. +
  3. Install Open Workbench in wine
  4. +
  5. Configure wine to play well with Open Workbench
  6. +
  7. Configure icon to launch Open Workbench
  8. +
+ +## What do we need? +
    +
  1. We will need to download the installer exe file from [http://www.itdesign.de/en/products-solutions/open-workbench.html](http://www.itdesign.de/en/products-solutions/open-workbench.html)
  2. +
  3. As the product requires Java Runtime Environment, we will need to download the JRE for windows.
  4. +
  5. We will need access to system32 folder of a WindowsXP machine or in Virtualbox.
  6. +
+

Step 1: Install JRE in wine

+You can download the JRE file from [http://www.oracle.com/technetwork/java/javase/downloads/index.html](http://www.oracle.com/technetwork/java/javase/downloads/index.html) . Remember, we only need JRE not JDK so click the download button in second column. +This will open another page for you to select which JRE package you want to download.
+![Alt Text](../assets/images/2016/07/20110604_Fig_2.png) +Click on the radio-button to accept license agreement and then select Windows x86 Offline for download. + +!!! site-tip "Tip" + I am assuming that your hardware is 32 bit, if not please select Windows x64 but it will not have the offline version and I have no way of checking if it will work or not; so please leave a comment either way as it will help others. + +![Alt Text](../assets/images/2016/07/20110604_Fig_3.png) + +a) Copy the downloaded (jre-6u25-windows-i586.exe) file into .wine/drive_C/Program Files. You can do this using GUI on Linux Mint using steps below: + +![Alt Text](../assets/images/2016/07/20110604_Fig_4.png) +b) Right click on the exe file and select 'open with wine windows program loader'.
+c) Follow the installation wizard.
+![Alt Text](../assets/images/2016/07/20110604_Fig_5.png)
+Once completed move on to next step. +

Step 2: Install Open Workbench in wine

+a) Download the “Open Workbench” installer file(Open_Workbench_Setup_1.1.6.exe) and copy it into .wine/drive_C/Program Files. + +!!! site-tip "Tip" + You can use Step 1 bullet "a" to reach drive_c and then click on windows folder and then on system32 folder. + + +b) Right click on the exe file and select 'open with wine windows program loader'. + +!!! site-tip "Tip" + You can use Step 1 bullet "b" to reach drive_c and then click on windows folder and then on system32 folder. + + +c) Follow the installation wizard. + +Step 3: Configure wine to play well with Open Workbench +Due to some bug identified in Wine V1.2 the odbc32.dll file does not work and gives the error “err:module:attach_process_dlls “odbc32.dll” failed to initialize, aborting” if you try to run file from Terminal. +The following workaround is one suggested on Launchpad ([https://bugs.launchpad.net/ubuntu/+source/wine1.2/+bug/572393](https://bugs.launchpad.net/ubuntu/+source/wine1.2/+bug/572393)) and does solve the problem. + +I have just tried to make it easier to follow the instructions by providing screenshots and explaining each step. +
    +
  1. +On the WindowsXP machine / virtualbox goto following location – C:\WINDOWS\system32
    +![Alt Text](../assets/images/2016/07/20110604_Fig_6.png) +
  2. +
  3. +Now copy odbc32.dll and odbcint.dll files onto the Linux machine at this location - .wine/drive_c/windows/system32 . +
  4. +
+!!! site-tip "Tip" + You can use Step 1 bullet "a" to reach drive_c and then click on windows folder and then on system32 folder. + + +
    +
  1. +Now goto wine configuration (On Linux Mint: MENU-ALL APPLICATIONS-WINE-CONFIGURE WINE) +
  2. +
  3. +Click on Libraries tab. +
  4. +
  5. +From the dropdown select odbc32 and click add. +
  6. +
  7. +Click OK +
  8. +
+

Step 4: Configure Open Workbench icon to launch the application

+
    +
  1. +Open terminal (MENU - TERMINAL) +
  2. +
  3. +Type: `wine ~/.wine/drive_c/Program\ Files/Open\ Workbench/bin/npWBench.exe` +
  4. +
  5. +Once Open Workbench is opened we are sure the command works. Select this command and right click and select copy. +
  6. +
+!!! site-tip "Tip" + You can also press Ctrl+Shift+C to copy the selected text from terminal + + +
    +
  1. +Close 'Open Workbench' and goto icon in MENU-ALL APPLICATIONS-WINE. +
  2. +
  3. +Right click the 'Open Workbench' icon and click on 'Edit Properties'. +
  4. +
  5. +In Command click on browse and navigate to following location: `.wine/drive_c/Program Files/Open Workbench/bin/ and select the file npWBench.exe`. +
  6. +
+ ![Alt Text](../assets/images/2016/07/20110604_Fig_7.png) +
    +
  1. Now click 'OK'
  2. +
+This is it. You are ready to use Open workbench on Linux using wine. diff --git a/docs/posts/2011-06-20-visio-alternative-on-linux-business-process-model-and-notation-tool.md b/docs/posts/2011-06-20-visio-alternative-on-linux-business-process-model-and-notation-tool.md new file mode 100644 index 0000000..b529af9 --- /dev/null +++ b/docs/posts/2011-06-20-visio-alternative-on-linux-business-process-model-and-notation-tool.md @@ -0,0 +1,66 @@ +--- +title: Visio Alternative on Linux - Business Process Model and Notation Tool +slug: visio-alternative-on-linux-business-process-model-and-notation-tool +draft: False +description: Visio Alternative on Linux - Business Process Model and Notation Tool +authors: ['ankit'] +date: + created: 2011-06-20 17:41:00 + updated: 2011-06-20 17:41:00 +comments: true +--- +!!! site-abstract "UPDATE" + [PENCIL](http://pencil.evolus.vn/) is an opensource software which is a pretty good alternative as well with a smaller learning curve and is Opensource. + + + +I was recently looking for Visio alternatives on Linux and while Dia is good it lacks the oomph of Visio and hence not an easy sell for new and potential Linux converts. + +Now good news for those open to enter the wonderful world of Linux is that any OS need not have an alternative for it to be usable to you, all it needs is the ability to let you run the software you find useful. + +So this post isn't about why Linux is better. It is about knowing that there is something better than the software you have got accustomed to. If someone is adamant on continuing with the software they have fallen in love with, there is always WINE / Virtualbox but if you have opened to the idea of new OS but you are taking baby steps software like yEd can help you take a giant leap. yEd is written in Java and can run on Windows, Mac and of-course Linux. + +Before we move into the steps of how to get it and use it let me bore you little with what are the other alternatives I explored. +During my quest I came across two other useful candidates Activiti 5.6, ARIS Express 2.3. What went against these and in favour of yEd? Read on: +
    +
  1. +Ease of installation +
      +
    • +First on the list is ARIS Express 2.3. Now this requires registration which is my first gripe. I could have lived with that but as claimed on their website the product is meant for Windwos and is reported to be working fine for Linux. What they forgot to mention is on linux using Wine or atleast that is what it did on my set-up. Now am not sure if it has something to do with my installing JRE in wine for using Open Workbench (see last post) or it is because the product works on similar lines as Open Workbench installer but eighther way it does not run natively on Linux and for that reason alone it is unreliable and looses points even to Activiti. +
    • +
    • +For easiest installation, Activiti 5.6 can be added into Eclipse but that results in a bit complicated and not so user friendly user-experience. You will at-least need to have one Activiti project created in eclipse before you can draw using Activiti Diagram. (Check Screenshot) + ![Alt Text](/content/images/2016/07/20110620_Fig_2.png) +
    • +
    • +Above might be circumvented by installing standalone Activiti bit that involves configuring ANT and other stuff. While guide is there, it is not very straight forward and considering we want to win new users not scare them, it is best left as untouched topic. +
    • +
    +
  2. +
+ +OK, now that I have covered comparison, let's get down to how we install it on our beloved Linux Mint. It's really very simple. +Step 1: Go to this website - [http://www.yworks.com/en/products_yed_download.html](http://www.yworks.com/en/products_yed_download.html) +Step 2: Download yEd for your platform. In our case for Linux Mint the 43 MB sh file in front of Linux. +Step 3: + +All Done !!! +A quick tutorial from yWorks: + +Find more on [http://www.yworks.com/en/products_yed_videos.html](http://www.yworks.com/en/products_yed_videos.html) +Having seen, how nice and easy it is to create the flowchart, let's also see the best feature of the product that is one click alignment. + diff --git a/docs/posts/2011-11-04-access-files-folders-directories-from-linux-mint-on-android.md b/docs/posts/2011-11-04-access-files-folders-directories-from-linux-mint-on-android.md new file mode 100644 index 0000000..b2377e0 --- /dev/null +++ b/docs/posts/2011-11-04-access-files-folders-directories-from-linux-mint-on-android.md @@ -0,0 +1,135 @@ +--- +title: Access (files / folders) Directories from Linux Mint on Android +slug: access-files-folders-directories-from-linux-mint-on-android +draft: False +description: Access (files / folders) Directories from Linux Mint on Android +authors: ['ankit'] +date: + created: 2011-11-04 11:03:00 + updated: 2011-11-04 11:03:00 +comments: true +--- + +![Fig-1](../assets/images/2016/07/20111104_Fig_1.png){ width=50% } + +Let me clear the air before anyone mentions. Yes, I know it's directories and not folders and yes I know many still call these folders and this may encourage the wrong usage but my aim is to help not educate but hopefully making this the first line in post will have some educational effect :smile:. + + + +Right, so to start with, presented below is the problem statement: + +We want to share particular folder on our home WiFi network such that all members of the family can access it using their gadget - laptop / smartphone / netbook etc. Now like a true project manager, I will scope it down by making an assumption that any gadget that runs a variant of linux - Android included. It's not to say that the solution will not work on iOS or Windows, it's to say that these operating systems are not covered but might as well work with right application downloaded.However the solution offered will make no such claims...:p. Having said that, I will actually only be covering Android in this article as for Linux on desktop, it is fairly straight forward by going through 'Network' places. + +Ok now to the exciting stuff: + +## Step 1: Decide which Directory (Folder) you want to share. + + +For purpose of this demonstration, let's create a new folder called 'DemoShare'. + +## Step 2: Decide whether you want it to be accessed by specific users or anyone and everyone connected to your home network + +a) If you would want the shared directory (folder) to be password protected go through all steps below. + +b) If you would want to give guest access to all users, skip to Step 4. + +## Step 3 + +a) Create new User(s) - Let's create a new user - androshare. This can be done by following the images below: + +![Fig-2](../assets/images/2016/07/20111104_Fig_2.png){ width=50% } + +![Fig-3](../assets/images/2016/07/20111104_Fig_3.png){ width=50% } + +![Fig-4](../assets/images/2016/07/20111104_Fig_4.png){ width=50% } + +![Fig-5](../assets/images/2016/07/20111104_Fig_5.png){ width=50% } + +![Fig-6](../assets/images/2016/07/20111104_Fig_6.png){ width=50% } + +![Fig-7](../assets/images/2016/07/20111104_Fig_7.png){ width=50% } + +![Fig-8](../assets/images/2016/07/20111104_Fig_8.png){ width=50% } + +Obviously you are free to be creative with the username. Just replace `androshare` with your username in subsequent commands. + +b) Create samba username(s)/password(s) + +Open the terminal and type the following command: + +`sudo smbpasswd -a androshare`. + +You will be asked for the root password and then new password for the username. Once you type in new password, you will be asked to retype the new password. Again as shown in image. + +![Image](../assets/images/2016/07/20111104_Fig_9.png){ width=50% } + +c) Restart Samba + +Open the terminal and type the following command: + +`sudo service smbd restart` + +## Step 4: Update Share Properties of the Directory(ies) to be shared + + +Goto the folder "DemoShare" created in Step 1, right click on the folder and select properties. On the properties dialogue box click on Share tab. Click on share the folder checkbox. + +![Fig-10](../assets/images/2016/07/20111104_Fig_10.png){ width=50% } + +For scenario (a) of Step 2 click on checkbox - "Allow users to create and delete files in this folder" as shown in the figure below and click on Create Share. + +![Fig-11](../assets/images/2016/07/20111104_Fig_11.png){ width=50% } + +For scenario (b) of Step 2, mark the "Guest access" Checkbox too as shown in next figure before clicking the Create Share button. + +![Fig-12](../assets/images/2016/07/20111104_Fig_12.png){ width=50% } + +After the Create Share button is clicked following dialogue will appear. Select "Add the permissions automatically" + +![Fig-11](../assets/images/2016/07/20111104_Fig_13.png){ width=50% } + +The folder icon will then change to show a share flag as shown below. + +![Image](../assets/images/2016/07/20111104_Fig_14.png){ width=50% } + +## Step 5: Download and install the file explorer app + +ES File explorer is what I use and recommend. It can be downloaded from market here - [https://market.android.com/details?id=com.estrongs.android.pop](https://market.android.com/details?id=com.estrongs.android.pop) + +![Image](../assets/images/2016/07/20111104_Fig_15.png){ width=50% } + +## Step 6: Configure the app to access the shared directory + +On your computer, open the terminal and type: +`ifconfig` + +In the resulting information, locate wlan0 (last entry) and under that in second line you will find something like 'inet addr: 192.168.1.74', Note this down. + +Open the app and goto LAN tab. + + +![Fig-16](../assets/images/2016/07/20111104_Fig_16.png){ width=50% } + +Press the menu button and click on 'New'. + +Now click on 'Server'. This will open the 'New/Edit Samba Server Screen'. + +![Fig-17](../assets/images/2016/07/20111104_Fig_17.png){ width=50% } + +Complete it as shown with following information: + + +| Field | Scenario A | Scenario B | +|-----------|-----------------------|-----------------------| +| Server | IP Address from above | IP Address from above | +| Username | Androshare | BLANK | +| Password | As given in Step 3a | BLANK | +| Anonymous | BLANK | Select the checkbox | + +Click OK. + +Now if you click on the IP address, it should show the shared directory. As you can see in the screenshot at the beginning of this post, I have already shared my Calibre Library and it does make life really simple. I can download files and e-books without actually going to my laptop. + +That is all there is to it. + +Hope you find it useful. diff --git a/docs/posts/2011-11-06-openvpn-on-linux-mint-to-access-us.md b/docs/posts/2011-11-06-openvpn-on-linux-mint-to-access-us.md new file mode 100644 index 0000000..75d3a55 --- /dev/null +++ b/docs/posts/2011-11-06-openvpn-on-linux-mint-to-access-us.md @@ -0,0 +1,113 @@ +--- +title: OpenVPN on Linux Mint to access US sites +slug: openvpn-on-linux-mint-to-access-us +draft: False +description: OpenVPN on Linux Mint to access US sites +authors: ['ankit'] +date: + created: 2011-11-06 10:26:00 + updated: 2011-11-06 10:26:00 +comments: true +--- +
+!!! site-abstract "UPDATE" + LOOKS LIKE HOSTIZZLE IS NOT WORKING ANYMORE. THE STEPS IN THIS GUIDE WILL STILL BE RELEVANT FOR SETTING UP OPEN VPN, JUST THAT YOU WILL NEED TO FIND SOME OTHER PROVIDER.** +
+ + + +I received a Google Music invite and as it is only available in US, I used OpenVPN on linux. Now this is a handy little trick to bypass the geographical constraints that are placed to block services on net. All this without opening the windows box to install dodgy looking services of Hotspot Shield which anyway does not work on Linux. + +Ever come across 'This video is not available in your country.' on you tube or ever wanted to access Hulu only to be greeted by a similar message. Well then, if yes is your answer, openVPN is the solution to such sorrows. + +It also comes with some other benefits such as anonymous browsing but then highlighting benefits of VPN is not exactly the aim of this post. The aim of this post is: + +To configure a free VPN service that allows you to bypass country restrictions for US based sites. Keyword - US. As the site I am going to use only gives a US IP. Ofcourse if we remove the word free it opens up a range of possibilities which I will leave the readers to explore. :smile: + +Alright, let's get on with the business: + +## Step 1: Install OpenVPN + +Open Synaptics and type OpenVPN in 'Quick Search'. Then select all the packages marked green in screenshot below but not in your synaptic window and click on 'Apply'. + +![20111106_Fig_1.png](../assets/images/2016/07/20111106_Fig_1.png) + +Then type 'pptp' in 'Quick Search' and select all the packages marked green in the screenshot below but not in your synaptic window and click on 'Apply'. + +![20111106_Fig_2](../assets/images/2016/07/20111106_Fig_2.png) + +## Step 2: Register with the free OpenVPN provider 'Hostizzle' + +Open the website [http://hostizzle.com/](http://hostizzle.com/) and follow the screenshots below: + +[20111106_Fig_3](../assets/images/2016/07/20111106_Fig_3.png) + +![image](../assets/images/2016/07/20111106_Fig_4.png) + +![image](../assets/images/2016/07/20111106_Fig_5.png) + +## Step 3: Set-up OpenVPN on Linux Mint + +Open Terminal and type the following command: + +```bash +gksudo nautilus /etc/openvpn/ +``` + +You will be asked for root password and the File Explorer will be opened with root access. This is necessary as /opt directory only gives write access to root and as you wil see next step requires some files to be extracted in this directory. This extracted directory will be some long number. + +!!! site-tip "Tip" + Please be extremely careful now, as you are accessing your file system as root. + +Now copy the zip file downloaded from Hostizzle in Step 2, to this directory and extract it here. + +## Step 4: Configure network manager + +Open the Network Manager as shown in following screenshot: + +Menu > All Applications > Preferences > Network Connections + +![image](../assets/images/2016/07/20111106_Fig_6.png) + +This will open the following window: + +![image](../assets/images/2016/07/20111106_Fig_7.png) + +Now click on VPN tab and then on Import button as shown in next screenshot. + +It will open the file selection box. Navigate to File System/etc/openvpn/ and now open the long numbered directory that was extracted in Step 3(a) as shown in next figure. + +![image](../assets/images/2016/07/20111106_Fig_8.png) + +Here select the .ovpn file and click Open. Following dialogue box will open. + +![Fig-9](../assets/images/2016/07/20111106_Fig_9.png) + +Just accept defaults and click 'Apply'. + +Then Click on 'Close' on Network Connections window. + +![image](../assets/images/2016/07/20111106_Fig_10.png) + +## Step 5: Connect to the OpenVPN + +Restart your system and once it is connected to your home WiFi, click on Network Indicator in the panel and select 'VPN Connections'. + +![image](../assets/images/2016/07/20111106_Fig_11.png) + +This will list all available VPN connections as can be seen in the screenshot. Select the VPN name with big number which is what we have just configured. + +![image](../assets/images/2016/07/20111106_Fig_12.png) + +Once done if everything was done correctly, it should connect to VPN and you should be able to browse with an american IP address. +Some key points to remember: + +Free service of Hostizzle is quite generous compared to so many other options I explored, yet it is worth knowing the restrictions: + +1. 100GB of bandwidth each month. +2. US IP +3. Limited to one month. You need to download new Keys and configure VPN using steps below each month. + +Now considering that it takes less than 5 minutes to complete these steps and that it is a free alternative with a generous bandwidth, I would say it is all worth it. + +Ofcourse, if you are not happy with the restrictions, there are some paid alternatives that can be implemented for as low as $4 per month from various providers, Hostizzle included. Go shopping !!! diff --git a/docs/posts/2012-02-20-how-to-boot-from-usb-when-bios-does-not-have-the-option.md b/docs/posts/2012-02-20-how-to-boot-from-usb-when-bios-does-not-have-the-option.md new file mode 100644 index 0000000..00c52a0 --- /dev/null +++ b/docs/posts/2012-02-20-how-to-boot-from-usb-when-bios-does-not-have-the-option.md @@ -0,0 +1,189 @@ +--- +title: How to boot from USB when BIOS does not have the option. +slug: how-to-boot-from-usb-when-bios-does-not-have-the-option +draft: False +description: How to boot from USB when BIOS does not have the option. +authors: ['ankit'] +date: + created: 2012-02-20 18:50:00 + updated: 2012-02-20 18:50:00 +comments: true +--- + +I have an old Sony VAIO which is not in it's best of health and has long been really a companion for my telly, faithfully streaming media from bbc iplayer, youtube, dailymotion and likes. Internet enabled TV arrived in my home long long back :). + +Now the thing with this laptop is that it's kinda gimpy - inbuilt keyboard won't work, battery is dead and it hangs on life with constant supply of energy from the AC source on the wall and the one thing that helps me load new OS on this machine - the optical reader - is temperamental and may or may not work and is moody in selecting which CD / DVD it will read and which it won't. It does in particular like CD's authored by Linux Format guys though. Writing is a skill it has forgotten long back and if it reads something, anything I am found celebrating. + + + +Anyway, I had ubuntu installed on this laptop for quite some time but as this laptop has one more flaw - the nvidia graphic card - and the latest update from ubuntu broke the nvidia drivers which aren't all that well supported anyway, I was being forced to reformat the machine. So I decided to try a new distro named Bodhi Linux which is very cool and uses Enlightenment as desktop which is very very good and way better than Unity and some might argue even Gnome 3.2. However, in order to do so I had to cross the hurdle of burning a CD that my laptop's Optical Drive will find intresting enough to read. + +I have checked and rechecked the BIOS of this laptop and there is no way to make BIOS understand that it can boot from USB. The only options it provides are Hard Drive, Floppy Disk, Optical Reader and Network Boot. None of these were particularly useful for reasons explained above and unfortunately I was hitting the wall. So I started looking for alternative ways to get Bodhi Linux installed. Alternative is what I found in Plop Boot Manager. + +Now open source enthusiasts at this point be aware, this nifty piece of software is not open source but it is so useful that this one minor flaw must be completely ignored. It gives you options to boot from USB in several ways - you can burn a CD and fool BIOS to boot from CD onto plop boot manager which in turn allows you to boot from device of your choice aka USB, it can also be put on floppy or the option that I have used - install on hard drive and configured through GRUB. + +So presented below without further ado is the guide to how you can install this on your hard drive but before I do so a quick thanks to several boards and posts I referred in the process of making this work: + +Steps: + +!!! info + Please note that these instructions will work for machines that have one of these OS installed: Bodhi Linux and Ubuntu variants. For other linux versions it should be on similar lines + + +1. Download the Plop Boot Manager (plpbt-5.0.14.zip file) on the machine where you want to achieve the result from [this link](http://www.plop.at/en/bootmanager/download.html) + + ![Fig-1](../assets/images/2016/07/20120220_Fig_1.png) + +2. Extract the zip file in folder where it was downloaded. In my case I have my browser setting set to download everything to 'Download' folder. + + ![Fig-2](../assets/images/2016/07/20120220_Fig_2.png) + +3. Now open the terminal and type following command relevant to your distro: + + * For UBUNTU + + ``` bash + gksu nautilus /boot + ``` + + * "For Bodhi" + + ``` bash + sudo pcmanfm /boot + ``` + + You will be presented with a dialogue box to enter password. Once you enter the password you will be presented the contents of boot folder as shown below. + + ![Fig-3](../assets/images/2016/07/20120220_Fig_3.png) + +4. Now + + 1. Go to the extracted plpbt-5.0.14 from step 2, click on Linux folder + + ![Fig-4](../assets/images/2016/07/20120220_Fig_4.png) + + 2. Then copy the files - 'plpbt.bin' and 'plpcfgbt' and paste them in the boot folder opened through step 3. + + ![Fig-5](../assets/images/2016/07/20120220_Fig_5.png) + +5. Once the files are copied in boot folder, double click on folder named grub and there open the file named 'grub.cfg' in texteditor. + + ![Fig-6](../assets/images/2016/07/20120220_Fig_6.png) + + Once the file is opened, press 'Ctrl+f' and search for string 'END /etc/grub.d/10_linux'. Now copy the text as highlighted in screen below and paste it in a new text-editor window. + + ![Fig-7](../assets/images/2016/07/20120220_Fig_7.png) + +6. In the new text editor after pasting the four lines from above + + 1. Edit the fourth line so it reads as below: + + ```bash + linux16 /boot/plpbt.bin + ``` + + 2. Complete the block in new editor to read as below, keeping the first three lines intact from what was copied in step 5 from grub.cfg file. In our example it will read as below: + + ```bash linenums="1" + menuentry 'Plop Bootmanager' { + insmod ext2 + set root='(hd0,6)' + search --no-floppy --fs-uuid --set cb7a6eb7-b355-4d0f-865e-f7312880f887 + linux16 /boot/plpbt.bin + } + ``` + + Once again, this is important so remember the final structure will be achieved by following steps below. + + Copy Paste this in Line 1: `menuentry 'Plop Bootmanager' {` + + Next three lines remain same as copied from step 5: + + ```bash linenums="1" + insmod ext2 + set root='(hd0,6)' + search --no-floppy --fs-uuid --set cb7a6eb7-b355-4d0f-865e-f7312880f887 + ``` + + Then the fourth line will be edited to look as shown below. You can copy paste this in fourth line. + + ```bash + linux16 /boot/plpbt.bin + ``` + + Fifth line will be closing bracket - `}` + +7. Now open another terminal window and type following command relevant to your distro: + + * For UBUNTU + + ``` bash + gksu nautilus /etc/grub.d + ``` + + * "For Bodhi" + + ``` bash + sudo pcmanfm /etc/grub.d + ``` + + You will be presented with a dialogue box to enter password. Once you enter the password you will be presented the contents of boot folder as shown below. + + ![Fig-8](../assets/images/2016/07/20120220_Fig_8.png) + + +8. Open the file 40_custom (highlighted in screenshot above) in texteditor - gedit on ubuntu or leafpad on Bodhi and paste the block from step 6(b) in this file and save it. + + ```bash linenums="1" + #!/bin/sh + exec tail -n +3 $0 + ## This file provides an easy way to add custom menu entries. Simply type the + ## menu entries you want to add after this comment. Be careful not to change + ## the 'exec tail' line above. + menuentry 'Plop Bootmanager' { + insmod ext2 + set root='(hd0,6)' + search --no-floppy --fs-uuid --set cb7a6eb7-b355-4d0f-865e-f7312880f887 + linux16 /boot/plpbt.bin + } + ``` + + !!! important + Press ++enter++ at-least twice after pasting to ensure there are atleast two new lines below closing bracket. + +9. Close all windows and open terminal once again and type following command: + + ```bash + sudo update-grub + ``` + +10. Now open /boot/grub/grub.conf and you should find the following entry on it: + + ```bash linenums="1" + #### BEGIN /etc/grub.d/40_custom ### + ## This file provides an easy way to add custom menu entries. Simply type the + ## menu entries you want to add after this comment. Be careful not to change + ## the 'exec tail' line above. + menuentry 'Plop Bootmanager' { + insmod ext2 + set root='(hd0,6)' + search --no-floppy --fs-uuid --set cb7a6eb7-b355-4d0f-865e-f7312880f887 + linux16 /boot/plpbt.bin + } + #### END /etc/grub.d/40_custom ### + ``` + +11. Now reboot your machine with your Live USB plugged in. If you already dual boot your grub will show on restart and will have an additional option in the end - 'Plop Bootmanager'. + + If however, you just have single OS ubuntu, press ++shift++ once the bios logo shows up and keep holding for getting the system to show Grub. + + Once Grub is shown it will have the additional 'Plop Bootmanager' menu entry on grub. + + Select the 'Plop Bootmanager' and press enter. + +12. Plop Bootmanager will show option to boot from USB. It was third option for me. Select and press enter. If your Live USB is working, you will be able to load OS from it. + + +This is it. You can check the [video](https://youtu.be/gG_UtAGFA8I?si=33bdJVJvm0nVnm7B) + +Please do let me know in comments if you found this useful. If there are any other ways I will be keen to hear those too. \ No newline at end of file diff --git a/docs/posts/2012-03-04-stagevu-divx-video-on-bodhi-linux.md b/docs/posts/2012-03-04-stagevu-divx-video-on-bodhi-linux.md new file mode 100644 index 0000000..6370163 --- /dev/null +++ b/docs/posts/2012-03-04-stagevu-divx-video-on-bodhi-linux.md @@ -0,0 +1,54 @@ +--- +title: StageVu / DivX video on Bodhi Linux +slug: stagevu-divx-video-on-bodhi-linux +draft: False +description: StageVu / DivX video on Bodhi Linux +authors: ['ankit'] +date: + created: 2012-03-04 22:25:00 + updated: 2012-03-04 22:25:00 +comments: true +--- + +If you read my last post you will know I have been playing with Bodhi Linux lately. One of the selling point for this distro is it's minimalistic approach. However, that also means it doesn't come with some of the media packages that help stream all type of media - stagevu (DivX) included. + +Fortunately it does not require lot of effort to get them all working. At-least for me it was quite quick. + +The steps I followed are listed below: + + + +* Install non-free codecs: + + [http://appcenter.bodhilinux.com/software/showDesc/Non-Free_Codecs](http://appcenter.bodhilinux.com/software/showDesc/Non-Free_Codecs) + +* Install dvd codecs: + + [http://appcenter.bodhilinux.com/software/showDesc/Dvd_Playback](http://appcenter.bodhilinux.com/software/showDesc/Dvd_Playback) + +* Install VLC Player: + + [http://appcenter.bodhilinux.com/software/showDesc/VLC](http://appcenter.bodhilinux.com/software/showDesc/VLC) + +* Install SMplayer: + + [http://appcenter.bodhilinux.com/software/showDesc/SMPlayer](http://appcenter.bodhilinux.com/software/showDesc/SMPlayer) + +* Install totem, totem-mozilla, mozilla-plugin-vlc, mencoder using Synaptic Package Manager: + + You can find Synaptic Package Manager under Applications or simply by typing the following command in terminal: + ```bash + sudo synaptic + ``` + +* Install divx4linux package: + + It can be downloaded from [this link](http://www.mediafire.com/?71fs4c9cy8xy4q4). + + Double click on the downloaded file and it will launch the installer. + + Once installed, restart the system and then open media sites in firefox and check that the videos are working. + + For stagevu though divx4linux should work out of the box on firefox but if not click on 'Tools' > 'Manage Content Plugin' and select divx to play the plugin. Restart browser and that should be it. + +Let me know your experiences and tips in comments. diff --git a/docs/posts/2012-03-16-exchange-2007-on-thunderbird-using-davmail.md b/docs/posts/2012-03-16-exchange-2007-on-thunderbird-using-davmail.md new file mode 100644 index 0000000..79a4068 --- /dev/null +++ b/docs/posts/2012-03-16-exchange-2007-on-thunderbird-using-davmail.md @@ -0,0 +1,126 @@ +--- +title: Exchange 2007 on Thunderbird using DAVMail +slug: exchange-2007-on-thunderbird-using-davmail +draft: False +description: Exchange 2007 on Thunderbird using DAVMail +authors: ['ankit'] +date: + created: 2012-03-16 22:39:00 + updated: 2012-03-16 22:39:00 +comments: true +--- + +## Background + +The start of this week was like a nightmare for me. Whole family was down with flu and I had the fever that is probably the highest ever of my entire life at 40.5 C (~ 106 F). + +Anyway, surviving that was easier compared to the aftermaths of this health problem that forced me to stay in bed and inadvertently deal with office mails at home on a non-IE browser with Lite version which is crap and makes you feel miserable enough to kill yourself. + +So the option I had was to either boot windows on a virtual machine or find a solution within linux. Obviously, I prefer the latter and was glad to work out a solution that can help me avoid booting windows. + +I have listed below the steps I followed to achieve this, though in all honesty the documentation is quite good on sourceforge site itself. It's just that some of their screenshots are dated and in French (literally, no pun intended). + +Now there are several options floating around but this set-up works flawlessly for me and so I will obviously recommend this over other methods. + +It's so easy to configure that there really is no reason not to give it a shot. + + + +## Step 1. Install DAVMail + +You can get the latest version from sourcefourge by following [this link](http://davmail.sourceforge.net/download.html). + +![Fig-1](../assets/images/2016/07/20120316_Fig_1.png) + +!!! site-tip "Tip" + Select the download based on your distro. For Linux Mint 12 it will be Green Box and for non-debian based distros the red. + +Now double click on the downloaded .deb file and DAVMail will be installed taking care of any required dependencies. + + +## Step 2. Configure DAVMail + +Once installed, you can open DAVMail on Linux Mint 12 under Internet. + +![Fig-2](../assets/images/2016/07/20120316_Fig_2.png) + +You can copy all the settings from this screenshot, leave them with what is there by default or change if you need to. Most important part is the first field OWA (Exchange) URL. You must paste your exchange 2007 OWA URL here. + +![Fig-3](../assets/images/2016/07/20120316_Fig_3.png) + +Believe it or not, that's all the configuration you need to do for DavMail. + + +## Step 3. Configure Thunderbird Email Client + +Now over to configuring the Thunderbird Email Client. Enter Details and Click on Continue. It will show next screen by itself. + +![Fig-4](../assets/images/2016/07/20120316_Fig_4.png) + +Follow instructions as per next screenshot. + +![Fig-5](../assets/images/2016/07/20120316_Fig_5.png) + +If you see following warning, tick the checkbox and Click on Create Account. + +![Fig-6](../assets/images/2016/07/20120316_Fig_6.png) + +After this you may be presented with a dialogue box to enter the username and password once again. If so provide details. Remember to try just `abc.xyz` as username for `abc.xyz@officemail.com` and only if that does not work and you are presented with the dialogue box again should you try the whole email id as username. + +It does take quite some time in first run as Thunderbird downloads all the mails. I was happy with the speed though YMMV. + +I have applied an MS Office based theme that you can find in add-ons directory on [this link.](https://addons.mozilla.org/en-US/thunderbird/addon/ms-office-2003-jb-edition/) + +Finally my mailbox looks as below: + +![Fig-7](../assets/images/2016/07/20120316_Fig_7.png) + + +## Step 4. Configure Calendar + +On Linux Mint 12 Lightning the Thunderbird calendar client does not come pre-installed. So head over to Synaptic package manager and search for 'xul-ext-light', select the shown items and install them. + +![Fig-8](../assets/images/2016/07/20120316_Fig_8.png) + +Once installed, restart thunderbird and you will see calendar icon and Task Pane. + +![Fig-9](../assets/images/2016/07/20120316_Fig_9.png) + +Either click on Calendar or just press ++ctrl+shift+c++. This will open Calendar view as shown below: + +![Fig-10](../assets/images/2016/07/20120316_Fig_10.png) + +Select 'New Calendar'. + +![Fig-11](../assets/images/2016/07/20120316_Fig_11.png) + +Select 'On the Network' radio button and click on 'Next' + +![Fig-12](../assets/images/2016/07/20120316_Fig_12.png) + +Select CalDAV radio button, and fill the location field with `http://localhost:1081/users/ankit@officemail.com/calendar`. + +!!! important + Make sure you adjust the port as per your settings of Step 2. + +![Fig-13](../assets/images/2016/07/20120316_Fig_13.png) + +Give a name to this Calendar - say Office Cal for instance - and click Next. + +![Fig-14](../assets/images/2016/07/20120316_Fig_14.png) + +After this you may be presented with a dialogue box to enter the username and password once again. If so provide details. Here provide `abc.xyz@officemail.com` and if that does not work and you are presented with the dialogue box again try with just the abc.xyz as username. + +Once connected, your Calendar will be in sync as will be your tasks. + +## Step 5: Configure Global Address Book + +Open Address Book and then select File > New > LDAP Directory. It will open the following box. + +![Fig-15](../assets/images/2016/07/20120316_Fig_15.png) + +Fill as shown below and make sure Port number is as advised in red text. Then Click 'OK' + +![Fig-16](../assets/images/2016/07/20120316_Fig_16.png) + +That is it. Test and see if you are now able to update your calendar, tasks, emails etc. and if all has gone as explained above you should be good to go. diff --git a/docs/posts/2012-08-06-top-10-android-apps-that-i-use.md b/docs/posts/2012-08-06-top-10-android-apps-that-i-use.md new file mode 100644 index 0000000..21ac3e6 --- /dev/null +++ b/docs/posts/2012-08-06-top-10-android-apps-that-i-use.md @@ -0,0 +1,138 @@ +--- +title: Top 10 Android Apps that I use !!!! +slug: top-10-android-apps-that-i-use +draft: False +description: Top 10 Android Apps that I use !!!! +authors: ['ankit'] +date: + created: 2012-08-06 22:05:00 + updated: 2012-08-06 22:05:00 +comments: true +--- + +I have been using Android Phones and Tablets for quite some time now and have +monitored my use for apps that I use on a daily basis and those I would not even +come to know if they were removed without my knowledge. So clearly there is a +personal perspective on the list below: + + + +## Gmail + +The most obvious and the most heavily used app. No introduction required. + +- What I like best? + - Clean Interface + - Push Notification + +- What can improve? + * Ability to zoom messages. + +## AppyGeek / AppyGeek for Tablet + +I use this app on a daily basis to get my daily dose of news in technical world. + +- What I like best? + * It pulls news based on keywords you can select. So my feed includes news on tags such as "Linux", "Smartphones", "Galaxy Tab", "Nexus", "Raspberry Pi" ...you get the gist. + +- What can improve? + * Ability to access to stories in offline mode. + +## Guardian Anywhere + +Fine, I admit wholeheartedly, I am left of the centre in my politics. Now with that out of the way, I prefer this app over the official Guardian app as this downloads content overnight. + +* What I like best? + * Offline Access to stories. + * You can schedule the time for download, I prefer 4:00 AM so I have all fresh news first thing in the morning. + * "Picks" tab which learns my taste over time and provides stories to match it. + +* What can improve? + * Ability to copy a small section of text from the story. + +## Financisto + +It is an opensource app to manage your budget and track your expenses. It's very comprehensive and one of the best app available on any mobile platform in my opinion. It does require initial set-up and perhaps something I may write about in another post soon but generally I find using it a very easy affair. + +* What I like best? + * Complete Package equivalent to any desktop finance management software. + +* What can improve? + + * App can do with a basic list of category to reduce the burden of creating list of categories from scratch. + * Improved Documentation + +## QuickPic + +It is a photo gallery which have got accustomed to as initially the stock gallery app on Android was not very good. However, recent gallery app has seen some very good enhancements yet I still feel more at home using QuickPic. + +* What I like best? + * Ability to hide folders that have downloaded photos from other apps and are not taken by phone camera. + * Ability to share a photo right from within the app through gmail, email, bluetooth, G+, FB etc. + +* What can improve? + * I don't think there is much to improve. It's a pretty well rounded app in my opinion. + +## Android Assistant + +It's a android system utility for monitoring system tasks, killing apps etc. All these are not what make it interesting though as there are several apps out there doing the same stuff. What I like most is listed below: + +* What I like best? + * With latest version, it prompts to move any newly installed/updated app to SD card if it is possible. + * It shows the total start-up time and allows you to select apps that should be silent at start-up. + * It allows for batch uninstall, which comes quite handy when on a system clean-up spree. + +* What can improve? + * Can do with a more glossy makeover. + +## ES File Explorer File Manager + +The primary function of this app is to allow user to browse the file system but it really has loads of features under the hood. + +* What I like best? + * Simplicity. + * Cloud Connection to support likes of Dropbox, Google Drive, Ubuntu One etc. + * FTP + * Everything really. + +* What can improve? + * This app covers the area of accessing files, network and so on. It has a lots to offer but I don't think it's used to it's full potential by many. I think this app can do with a strong tutorial for each of it's feature. + +## Profile Scheduler + +This is better app than Smart Profile and I have found that it's ability to switch profile based on WiFi saves me a complex set-up that would have been based on time but even so the time based set-up is much easier and straight forward and it does allow priority over rules which makes things super easy. It's not a drain on battery and I am very satisfied with this app. Nothing to improve really. + +## Smart Profile + +This app is a profile management tool that helps in switching to a profile based on user defined time slots. I have FOUR profiles that I switch between Sleep (Completely Silent Mode every day from 23:45), Work (Vibrate mode Monday to Friday from 09:00), Normal (Monday to Friday from 17:00), 0600 Weekends + Mornings (Normal Profile everyday from 06:00). How it works then is Starting Monday morning 06:00 phone goes on normal mode, then at 09:00 turns to vibrate mode, then at 17:00 switches to Normal profile and in night at 23:45 goes to sleep mode. This continues till Saturday morning but as "Work Profile" is scheduled only from Monday to Friday so from Saturday 06:00 onwards phone continues on normal mode whole day till 23:45 in night when it switches to sleep mode, only to get back to normal mode on Sunday at 06:00. Then again remains on normal mode whole of Sunday and in night 23:45 goes back to sleep mode. Then the cycle starts again. + +* What I like best? + * Free yet effective. + +* What can improve? + * As you can see from my explanation above, it is a bit complex to set-up. There was an app called audioguru which stopped working on ICS forcing me to switch but it had a simpler interface. That said in free version of audioguru there was no ability to schedule weekend so this is much better at the lovely price tag of "free". :smile: + +## HulloMail + +It's a visual voicemail app that works with most of the providers in the UK for their pay-monthly customers. + +* What I like best? + * Ability to select the voicemail I want to listen to first. + * Replay the important part of voicemail + * Store VM as mp3 for future refrence. + +* What can improve? + * I don't want much else from this app in it's free version. So it's alright as is. + +## Go SMS Pro + +It is a SMS client which is better than the stock client as it provides many useful additional features + +* What I like best? + * Ability to schedule SMS. + * Ability to send SMS in batches / groups + * Cool skins + * Go Chat is another useful feature as long as your mates are using it too. + +* What can improve? + * They are improving it all the time but I can't think of any complaints at the moment. \ No newline at end of file diff --git a/docs/posts/2012-10-15-flash-samsung-galaxy-s-gt-i9000-with-cyanogenmod-9-on-linux.md b/docs/posts/2012-10-15-flash-samsung-galaxy-s-gt-i9000-with-cyanogenmod-9-on-linux.md new file mode 100644 index 0000000..9371e1c --- /dev/null +++ b/docs/posts/2012-10-15-flash-samsung-galaxy-s-gt-i9000-with-cyanogenmod-9-on-linux.md @@ -0,0 +1,90 @@ +--- +title: Flash Samsung Galaxy S (GT -I9000) with Cyanogenmod 9 on Linux +slug: flash-samsung-galaxy-s-gt-i9000-with-cyanogenmod-9-on-linux +draft: False +description: Flash Samsung Galaxy S (GT -I9000) with Cyanogenmod 9 on Linux +authors: ['ankit'] +date: + created: 2012-10-15 22:20:00 + updated: 2012-10-15 22:20:00 +comments: true +--- + +I had an old Samsung Galaxy S which was still on stock ROM hence it only ever got to gingerbread and then Samsung just decided not to upgrade and I upgraded the phone so this little gadget was till yesterday destined to live with the old gingerbread. +Then yesterday, I just decided to play around with it and started reading so I know what are my options. Now wiki guide on Cyanogenmod site is quite nicely written but there were one or two steps here and there which had me confused for a little while so here is my usual step-by-step guide on how to go about it. + +!!! site-abstract "UPDATE" + Uploaded all the files to mediafire as requested in one of the comments below. These can be downloaded from [this link](http://www.mediafire.com/?ims1bxp6b8yp8). + + + +**Step 1:** + +1. Download Heimdall Suite 1.3.2 Command-line Binary for your OS from here ; for Linux Mint you can use the Ubuntu link and install the downloaded 'heimdall_1.3.2_i386.deb' file. +2. Download hardcore's Kernel with the ClockworkMod Recovery 2.5 here. This will download a file named 'hardcore-speedmod.tar'. I am assuming that it will be saved in 'Downloads' directory but if you have a different location, please replace 'Downloads' with appropriate directory. + +**Step 2:** Just to avoid any confusion, make a new directory in Downloads and name it 'Galaxy_S'. + +**Step 3:** Copy the downloaded file (from 1-b) 'hardcore-speedmod.tar' into the new directory 'Galaxy_S' + +**Step 4:** Now right-click on 'hardcore-speedmod.tar' and select extract here as shown. This will extract the file zImage into the directory Galaxy_S. + +![Fig-1](../assets/images/2016/07/20121012_Fig_1.png) + +**Step 5:** Connect microUSB cable to your computer but not the phone. + +**Step 6:** Power off the Samsung Galaxy S. + +**Step 7:** Connect the microUSB cable to Samsung Galaxy S. + +**Step 8:** Boot the phone in download mode by holding 'HOME+Volume Down+POWER' buttons. + +**Step 9:** Open the terminal and type following commands: + +```bash linenums="1" +cd Downloads/Galaxy_S +sudo heimdall flash --kernel zImage +``` + +A blue transfer bar will appear on the phone showing the kernel being transferred. Once completed, the device will reboot automatically. +**Step 10:** Disconnect the phone from microUSB cable, switch it on and connect to your computer using the microUSB cable as mass storage. + +!!! site-tip "Tip" + You may need to go to phone settings and change USB connection settings to be able to connect the phone as mass storage. + +**Step 11:** Download the latest Cyanogenmod ROM from [here](http://wiki.cyanogenmod.com/wiki/Samsung_Galaxy_S). + +![Fig-2](../assets/images/2016/07/20121012_Fig_2.png) + +**Step 12:** Follow this [link](http://wiki.cyanogenmod.com/wiki/Latest_Version#Google_Apps) to land at above page and then download the latest version of Google Apps. + +![Fig-3](../assets/images/2016/07/20121012_Fig_3.png) + +**Step 13:** You will now have following two zip files in your 'Downloads' directory: + +1. cm-9.1.0-galaxysmtd.zip from Step 11. +2. gapps-ics-20120317-signed.zip from Step 12 + +Copy these two files into the root directory of the Samsung Galaxy S. + +**Step 14:** Now, disconnect the phone from microUSB and switch it off. + +**Step 15:** Boot the phone in Recovery mode by holding 'HOME+Volume Up+POWER' buttons. You will be presented with various recovery options such as reboot phone etc. + +**Step 17:** Now use the Volume Up and Volume Down buttons to navigate options. Use Volume Down button to reach the option to Wipe data/factory reset and press POWER button to select this option. + +**Step 18:** Once done, Use Volume Down button to reach the option to wipe cache partition and press POWER button to select this option. + +**Step 19:** Next select 'Install zip from sdcard' which will present another set of options where you should select 'Choose zip from sdcard' + +**Step 20:** Now you will see the list of files on your SD Cards root directory. Select the file 'cm-9.1.0-galaxysmtd.zip' and on following screen of options select 'Yes'. + +**Step 21:** Once installed, select +++++Go Back+++++ and again select 'Install zip from sdcard' which will present another set of options where you should select 'Choose zip from sdcard' + +**Step 22:** This time select the file 'gapps-ics-20120317-signed.zip' and on following screen of options select 'Yes'. + +**Step 23:** Once installed, select +++++Go Back+++++ to return to main menu. + +**Step 24:** On main menu select 'Reboot System now' option. + +**Step 25:** If all has gone as above, your phone will restart and after a while you will see cyanogenmod flash screen. This screen will be there for a good 1 to 2 minutes. Don't panic and dont mess. Let system do it's work and in some time you would have given a fresh lease of life to your old dieing Samsung Galaxy S. \ No newline at end of file diff --git a/docs/posts/2012-10-17-prepare-linux-mint-13-for-android-development.md b/docs/posts/2012-10-17-prepare-linux-mint-13-for-android-development.md new file mode 100644 index 0000000..b79f6e8 --- /dev/null +++ b/docs/posts/2012-10-17-prepare-linux-mint-13-for-android-development.md @@ -0,0 +1,308 @@ +--- +title: Prepare Linux Mint 13 for Android development +slug: prepare-linux-mint-13-for-android-development +draft: False +description: Prepare Linux Mint 13 for Android development +authors: ['ankit'] +date: + created: 2012-10-17 23:12:00 + updated: 2012-10-17 23:12:00 +comments: true +--- + +## Background + +Few weeks back I updated to the latest Linux Mint offering 'Maya' a.k.a Linux Mint 13. Now this is a LTS (Long Term Support) version and I wanted to be in a position to install everything right just so I can keep it for a longer duration and hence have been taking my time configuring stuff. + +Last time when I had set up system for Android Development I remember messing up a lot and ending up installing too many things here and there and in the process did learn how to do it properly. I did not document that as a blog as it was too fragmented an experience at that time but this time round I did it properly and everything (well, okay, almost everything) was perfect. + + + +There is lot of material on the web but again that is what led to a less than perfect install last time as it is all disjointed, making the sequence go wrong, using one way for one thing another way for second and ending us with a not so nice experience distracting you from what you want to do, start developing something on android platform or perhaps just get the adb set-up to flash your nexus phone. + +So presented below is a guide that will help you prepare your Linux Mint 13 or equivalent distro for you to start android development. +You will notice that these notes do not require downloading 'android sdk' separately and that is to save time and effort, trust me. + +## Step 1: Download required files + +Download following files: + +![Fig-2](../assets/images/2016/07/20121018_Fig_2.png) + +Links to original file locations: +* [Script to Update Java](http://webupd8.googlecode.com/files/update-java-0.5b) (Updated link to the latest version of script as highlighted in screenshot.) +* [Java 7 SDK](http://download.oracle.com/otn-pub/java/jdk/7u7-b10/jdk-7u7-linux-i586.tar.gz) +* [Java 7 Samples and Demo](http://download.oracle.com/otn-pub/java/jdk/7u9-b05-demos/jdk-7u9-linux-i586-demos.tar.gz) +* [Java 7 API Docs](http://download.oracle.com/otn-pub/java/jdk/7u6-b24/jdk-7u6-apidocs.zip) +* [Java 6 Samples and Demo](http://download.oracle.com/otn-pub/java/jdk/6u37-b06-demos/jdk-6u37-linux-i586-demos.tar.gz) +* [Java 6 API Docs](http://download.oracle.com/otn-pub/java/jdk/6u30-b12/jdk-6u30-apidocs.zip) +* [Java 6 SDK](http://download.oracle.com/otn-pub/java/jdk/6u37-b06/jdk-6u37-linux-i586.bin) + +If you don't want to move around different webpages and websites, I have also uploaded all these files on mediafire on [this link](http://www.mediafire.com/?4x3u3if9o7dy4) + +## Step 2: Install Oracle Java + +You might ask, why do we need to do it this way? + +That's because Oracle Java 6 SDK is a pre-requisite for installing Android SDK but it's not available in Ubuntu or Linux Mint repository so it can't be installed using synaptic or apt-get. + +Right then, I am assuming that all the files downloaded above are placed in 'Downloads' directory. If not, please replace 'Downloads' in all commands with whichever directory you have downloaded these file to. + +```bash linenums="1" +#1. Open terminal and type: +cd Downloads +#2. Make the downloaded .bin Java 6 file executable and run +chmod a+x jdk-6u37-linux-i586.bin +./jdk-6u37-linux-i586.bin +###This will create a directory named "jdk1.6.0_37". +#3. Untar the Java 7 SDK +tar -xvf jdk-7u7-linux-i586.tar.gz +###This will create a directory named "jdk1.7.0_07". +#4. Unzip the Java 6 api docs +unzip jdk-6u30-apidocs.zip -d jdk1.6.0_37/ +###This command will unzip the apidocs zip file +###and place the contents in "jdk1.6.0_37" +#5. Unzip the Java 7 api docs +unzip jdk-7u6-apidocs.zip -d jdk1.7.0_07/ +###This command will unzip the apidocs zip file +###and place the contents in "jdk1.7.0_07" +#6. Untar the Java 6 demos and samples +tar -xvf jdk-6u37-linux-i586-demos.tar.gz +###This command will untar the demos and samples file +###and place the contents in "jdk1.6.0_37" +#7. Untar the Java 7 demos and samples +tar -xvf jdk-7u9-linux-i586-demos.tar.gz +###This will create a folder named jdk1.7.0_09. +###Copy the contents of this folder into jdk1.7.0_07. +#8. Move the Java 6 to it's proper location +sudo mv jdk1.6.0_37 /usr/lib/jvm +###You will be asked to provide root password. +#9. Now move the Java 7 to it's proper location +sudo mv jdk1.7.0_07 /usr/lib/jvm +#10. Make the script to update java update-java-0.5b executable +#then execute it by using following commands in terminal. +chmod +x update-java-0.5b +sudo ./update-java-0.5b +``` +You will be presented with following selection box: + +![Fig-3](../assets/images/2016/07/20121018_Fig_3.png) + +Once you click on OK you will be presented with following screen: + +![Fig-4](../assets/images/2016/07/20121018_Fig_4.png) + +Select the radio button and click on OK. + +Once Java 6 SDK is installed repeat step 10 and this time when you reach the selection window select Java 7 as shown below. + +![Fig-5](../assets/images/2016/07/20121018_Fig_5.png) + +Now Oracle Java 6 and Oracle Java 7 will both be installed on your system. To check this you can use the tool 'galternatives'. This can be installed by typing following command on the terminal window: + +```bash linenums="1" +sudo apt-get install galternatives +galternatives +``` + +This will open the 'G Alternatives' window, scroll down to 'Java' in left hand pane and click on it. You should see both versions installed and radio button for highest version selected as shown below: + +![Fig-6](../assets/images/2016/07/20121018_Fig_6.png) + +## Step 3: Install eclipse + + +1. Open Synaptic package manager and type eclipse, click on the check-box next to it and select 'Mark for installation' then click on 'Apply' as shown below. + + ![Fig-7](../assets/images/2016/07/20121018_Fig_7.png) + +2. Once Eclipse is installed, we need to find out whether the necessary SWT (Standard Widget Toolkit) libraries link are set correctly or not. This is to avoid Eclipse throwing a tantrum and not starting because it is unable to find the SWT library. As you can see in the screenshot below it's a pretty quick thing: + + ![Fig-8](../assets/images/2016/07/20121018_Fig_8.png) + + 1. First type the following command to check if whether SWT directory exists or not: + + ```bash + ls ~/.swt/lib/linux/x86/ + ``` + If you see the same message as shown in screenshot above 'ls: cannot access /home//.swt/lib/linux/x86/: No such file or directory', then it means we need to create the SWT directory so continue to sub-step B. + + If this command does not result in this message nor does it show a list of files (blue text in screenshot) then skip directly to sub-step C. + + If it does show the list of files in blue in above screenshot, you don't need to do anything further and for you it's time to move to next step. + + 2. Type the following command in terminal to create the SWT directory: + + ```bash + mkdir -p ~/.swt/lib/linux/x86/ + ``` + + 3. If the swt directory exist, but nothing is listed (no blue text), then run the following command in terminal: + + ```bash + ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86/ + ``` +3. Finally as shown in screenshot, type the command in sub-step 2.1 once again and you should see the list shown in blue on the screenshot. + +Time to move on to install ADT (Android Development Tools Plugin on eclipse. + +## Step 4: Install ADT Plug-in for Eclipse + +OK we have so far installed Java, installed eclipse and now we are all set to install Android. To do so we will follow the screenshots below: + +* When you start eclipse, you will be shown a splash screen, ask you to set workspace which I leave default and finally this window will open. As shown, click on the Workbench in right hand side corner. This will lead to following window. + + ![Fig-9](../assets/images/2016/07/20121018_Fig_9.png) + +* Here Click on Help > Install New Software. This will open following window. + + ![Fig-10](../assets/images/2016/07/20121018_Fig_10.png) + + ![Fig-13](../assets/images/2016/07/20121018_Fig_13.png) + +* Click on 'Add' button in red rectangle above. Following pop-up window will appear. + + ![Fig-11](../assets/images/2016/07/20121018_Fig_11.png) + +* In Name type 'ADT Plugin' or whatever name you want to give. + +* In Location type '[https://dl-ssl.google.com/android/eclipse/](https://dl-ssl.google.com/android/eclipse/)' + +* Then click OK. On following window it will first show pending but eventually it will look as below. + + ![Fig-12](../assets/images/2016/07/20121018_Fig_12.png) + + * Here select the first option "Developer Tools" and click OK. + + ![Fig-14](../assets/images/2016/07/20121018_Fig_14a.png) + +* Click "NEXT". + + ![Fig-14](../assets/images/2016/07/20121018_Fig_14.png) + +* Click "NEXT". + + ![Fig-15](../assets/images/2016/07/20121018_Fig_15.png) + +* Let it run in foreground i.e. don't do anything and just wait. + + ![Fig-16](../assets/images/2016/07/20121018_Fig_16.png) + +* Click "RESTART NOW". You will be presented with following window on restart. + + ![Fig-17](../assets/images/2016/07/20121018_Fig_17.png) + +* Now leave the target location as is and leave everything as default and click "NEXT". + + ![Fig-18](../assets/images/2016/07/20121018_Fig_18.png) + +* As shown above, selected the "ACCEPT ALL" radio button and click "INSTALL". + +* Now the android SDK is installed on the system along with other things. Close all the open windows just to clear any screen clutter. + +* Now open the terminal and type following commands: + + ![Fig-19](../assets/images/2016/07/20121018_Fig_19.png) + + ```bash + cd android-sdks/tools + ./android + ``` + +* It will open the following window: + + ![Fig-20](../assets/images/2016/07/20121018_Fig_20.png) + + !!! note + 1. Select as shown above and optionally you can also select checkbox against Documentation and Samples. Once done click on 'INSTALL x Packages'. + 2. On the next window, for which I did not take a screenshot but which is same as the one before previous screenshot of terminal, select radio button 'ACCEPT ALL' and click on 'INSTALL'. + 3. Now once you are back to this window select 'Google APIs' and click on 'Install 1 package'. + 4. On the package list, click on 'ACCEPT' radio button and click on 'INSTALL'. + +Android Development Tools and SDK is now installed. We just need to configure few things. + +## Step 5: Final Configurations + +**adb Environmental Variables** + +1. Go to home folder + +1. Press ++ctrl+h++ + + ![Fig-21](../assets/images/2016/07/20121018_Fig_21.png) + +1. Locate the .bashrc file, if it does not exist, create one (In home folder, right click and select 'Create New Document > Empty Document'). + +1. Open the file in gedit and add export `PATH=${PATH}:/tools:/platform-tools` at the end, if you created the file yourself just add this line and save. + + ![Fig-22](../assets/images/2016/07/20121018_Fig_22.png) + +**Set the PATH environment** + +1. Go to home folder +1. Press ++ctrl+h++ +1. Locate the .profile file +1. Open the file in gedit and add the following at the end. + + ```bash linenums="1" + ## set PATH so it includes user's Android SDK if it exists + + if [ -d "$HOME/android-sdks" ] ; then + + PATH="$HOME/android-sdks:$HOME/android-sdks/tools:$PATH" + + fi + ``` + + ![Fig-23](../assets/images/2016/07/20121018_Fig_23.png) + +**Set-up udev** + +This step is only required if you want to use your android device for development purpose or if you want to flash a custom ROM. + +1. Open the terminal and type following: + + ```bash + gksudo nautilus /etc/udev/rules.d + ``` + + +2. Create new document like we did above- Right click on empty space and select 'Create New Document' and then 'Empty Document. + +1. Name this document as '51-android.rules' + +1. Open the document with Gedit and add following lines - assuming you are using 'Nexus S' like me, if not see if your phone details are available on this link: [http://wiki.cyanogenmod.com/wiki/Udev](http://wiki.cyanogenmod.com/wiki/Udev) and if not follow the guideline under the heading 'Manually create udev rules' on that link. + + ![Fig-24](../assets/images/2016/07/20121018_Fig_24.png) + +2. Now make this 51-android.rules file executable by typing following command in the terminal window: + +```bash +sudo chmod a+r /etc/udev/rules.d/51-android.rules +``` + +## Step 6: Create Android Virtual Device + +* Open eclipse and follow the screenshots below: + + ![Fig-25](../assets/images/2016/07/20121018_Fig_25.png) + +* Click on Window - AVD Manager to get to next screen except that in your screen there will be no entry. + + ![Fig-26](../assets/images/2016/07/20121018_Fig_26.png) + +* Click on "NEW" to create a new AVD. It will open next window. + + ![Fig-27](../assets/images/2016/07/20121018_Fig_27.png) + +* Fill details as above - You can chose name of your choice and change details as per your requirements. + + ![Fig-28](../assets/images/2016/07/20121018_Fig_28.png) + +* To Start the AVD, click on Start. + +* Finally, you will be able to see the AVD as below: + + ![Fig-29](../assets/images/2016/07/20121018_Fig_29.png) + +This is it. Restart and your system is now all set for developing wonderful Android Applications. diff --git a/docs/posts/2013-01-01-root-nexus-4-on-linux-mint-13-and-access-all-files-on-computer.md b/docs/posts/2013-01-01-root-nexus-4-on-linux-mint-13-and-access-all-files-on-computer.md new file mode 100644 index 0000000..927fd65 --- /dev/null +++ b/docs/posts/2013-01-01-root-nexus-4-on-linux-mint-13-and-access-all-files-on-computer.md @@ -0,0 +1,210 @@ +--- +title: Root Nexus 4 on Linux Mint 13 and access all files on computer +slug: root-nexus-4-on-linux-mint-13-and-access-all-files-on-computer +draft: False +description: Root Nexus 4 on Linux Mint 13 and access all files on computer +authors: ['ankit'] +date: + created: 2013-01-01 12:38:00 + updated: 2013-01-01 12:38:00 +comments: true +--- +## Background + +Having a rooted phone and then going to one that does not have root access is like getting used to driving a luxury car but then being forced to drive a tractor. So with arrival of my shining new nexus 4 once the novelty worn of in 8 hours or so, I sat down and rooted the device. Now there are plenty of guides out there but not many specific to Linux just yet. One reason might just be the fact the Linux Users are really smart and know how to figure it out but what about users who are new ...well at least for them I am sure this post will be useful and while we are at it, I felt I will install the touch version of CWM... + + + +## Pre-requisite + +For purpose of this tutorial, I will assume that adb set-up is in place using steps explained in my last post specifically up to Step It is totally worth doing it before you proceed but if you would prefer a shorter route, please refer some guide on how to install just adb. Though I would not recommend any other approach. (Not because they will not work but because this approach will ensure clean system and something I have tested 4 times already to work and if you will follow this post, it makes sense to do it the way I did) + +1. Clockwork Recovery Mod (Touch Version) +2. Super User App +3. Fastboot + +!!! danger + This process will wipe out all user data and apps. Appropriate back-ups should be taken and restoring those is beyond the scope of this post. + +Items 1 and 2 can be downloaded directly from [http://www.clockworkmod.com/rommanager](http://www.clockworkmod.com/rommanager) and [http://download.chainfire.eu/282/SuperSU/](http://download.chainfire.eu/282/SuperSU/) or as before I have uploaded them in mediafire and can be downloaded from this [link](http://www.mediafire.com/?ylp382ompa4jr). + +I downloaded fastboot few months back from xda using this link and am not sure if it is still there or not so I have uploaded it to mediafire as well. + +![Fig-1](../assets/images/2016/07/20130101_Fig_1.png) + +## Step 1: Prepare Nexus 4 and Linux Mint 13 + +1. Check if fastboot is already there in the the /android-sdks/platform-tools directory. If yes skip the next step. + +2. Extract the fastboot from downloaded zip file and place it in the /android-sdks/platform-tools directory if it is not already there and make it executable (Right Click, Select properties, Go To permissions tab and select the checkbox in front of 'Execute') + +3. Copy the downloaded Clock Work Mod file (recovery-clockwork-touch-6.0.2.3-mako.img) in the /android-sdks/platform-tools directory. + +4. Activate debug mode in nexus 4 - to do this go to settings > About Phone and then click 7 to 8 times on 'Build Number'. This will activate developer mode. + +5. Now click back and got to {} Developer Options and Click the checkbox against USB debugging. + +6. Set up udev on linux mint: + + 1. Assuming that you have followed last post you would already have a `51-android.rules` file created. + + 2. Open the file with Gedit using following command + + ```bash + sudo gedit /etc/udev/rules.d/51-android.rules + ``` + 3. Add following lines: + + ```bash + #LG - Nexus 4 + SUBSYSTEM=='usb', ATTR{idVendor}=='1004', MODE='0666' + SUBSYSTEMS=='usb', ATTRS{idVendor}=='18d1', ATTRS{idProduct}=='4ee1', MODE='0660', OWNER='ankit' #Normal nexus 4 + SUBSYSTEMS=='usb', ATTRS{idVendor}=='18d1', ATTRS{idProduct}=='4ee2', MODE='0660', OWNER='ankit' #Debug & Recovery nexus 4 + SUBSYSTEMS=='usb', ATTRS{idVendor}=='18d1', ATTRS{idProduct}=='4ee0', MODE='0660', OWNER='ankit' #Fastboot nexus 4 + ``` + + I got the Vendor ID and Product ID by connecting the phone in different states (USB debug checked, unchecked and also after the phone was connected and rebooted into bootloader using command 'adb reboot bootloader') as per the guidance given here. + + 4. Now Save the file, then chmod to all read using following command: + + ```bash + sudo chmod +x /etc/udev/rules.d/51-android.rules + ``` + +## Step 2: Unblock bootloader for Nexus 4 + +1. Plug your phone into the computer and type the following command in terminal: + + ```bash + adb reboot bootloader + ``` + +2. Once Nexus 4 has rebooted in recovery mode, type the following command in terminal: + + ```bash + fastboot oem unlock + ``` + + If terminal displays the message 'waiting for device' 51-android.rules file is not set correctly and you might need to check vendor ID and product id using `lsusb` command in different modes and update it with appropriate data. + +1. Phone will display a long message and ask for confirmation to unlock bootloader. Select 'Yes' by using the volume keys and use power to select it. + + Now, using volume keys navigate to 'Recovery Mode' and select it using 'Power' key. + + After a while Android with blue progress bar should appear and phone should reboot but if it does not and instead shows a screen with 'Android' on it's back with an exclamation mark on it's tummy, don't panic. Just press 'Power' and 'Volume Up' till it shows recovery menu and then select 'reboot'. + +The phone is now bootloader unlocked. + +## Step 3: Root Nexus 4 + +OK now when the phone boots, it will be fresh with factory reset, no data or apps whatsoever other than those that are there by default and when the phone boots, it will ask all details like selecting country etc. Just enter quickly without bothering to enter gmail, wifi etc. Once done: + +1. Install mtpfs from synaptics. + +2. Plug the phone to computer. + +3. Type the following commands: + + ```bash linenums="1" + sudo mkdir /media/nexus4 + sudo chmod 755 /media/nexus4 + ``` + +4. Now mount the nexus 4 using following command so we can transfer files: + + ```bash + sudo mtpfs -o allow_other /media/nexus4 + ``` + +5. Copy the downloaded file 'CWM-SuperSU-v0.98.zip' on Nexus + +6. Type the following command to unmount nexus 4: + + ```bash + sudo umount /media/nexus4 + ``` + +7. Reactivate the debug mode using Step 1.4 and Step 1.5 above. + +8. On terminal type the command: + + ```bash linenums="1" + adb reboot bootloader + fastboot flash recovery /android-sdks/platform-tools/recovery-clockwork-touch-6.0.2.3-mako.img + ``` + + !!! site-tip "Tip" + Make sure in above command you replace PATH_TO with the actual path to the file. An easy way can be to right click on "recovery-clockwork-touch-6.0.2.3-mako.img" file and click on properties thene select the path and paste in this command. + + ![Fig-2](../assets/images/2016/07/20130101_Fig_2.png) + +9. Once completed, on the phone navigate to 'Recover Mode' using volume keys and select using power key. + +10. The new recovery menu will be presented. Select 'install zip from sd card' and 'choose zip from sd card.' and select the file we had put in step 3.5 - 'CWM-SuperSU-v0.98.zip'. + +11. Once done, go back to reboot and 'Reboot' the phone. + +At this point your phone is rooted,however, you will get a message suggesting the recovery will not be permanent or something to that effect which is fine if you aren't bothered about it but if you would rather want to keep this CWM we need to move to next step. + +## Step 4: Make Clockwork Mod Permanent + +1. On your phone install ES File Explorer. + +2. Select Settings. + + ![Fig-3](../assets/images/2016/07/20130101_Fig_3.png) + +3. Select 'Root Settings'. + + ![Fig-4](../assets/images/2016/07/20130101_Fig_4.png) + +4. Select all checkboxes. You will be asked for superuser access, say Yes. + + ![Fig-5](../assets/images/2016/07/20130101_Fig_5.png) + +5. Now go back to main screen of ES File Explorer and select the third tab with an icon of Folder with up arrow and text Up. This should bring you to root. + +6. Now using ES File Explorer navigate on your phone to `/system/etc`, find the file named `install-recovery.sh` and rename it to `install-recovery.bak` + +7. Repeat Steps 3.7 to 3.11. + +Now your clockwork mod is permanent. + +## Step 5: Mount and Un-Mount Nexus 4 to access files from Linux Mint + +Now, with the steps 3.1 to 3.6 we have laid the foundation for being able to connect Nexus 4 and transfer files using USB. Something earlier was possible using USB Mass storage mode but is not present jelly bean onwards. +The commands in 3.4 and 3.6 are key to achieve this but rather than remembering these and typing each time, I have made a menu entries for each of these (Mount Nexus 4, Unmount Nexus 4) and after connecting phone via USB, I simply click on these, system asks root password and then connects nexus 4 as mass storage as shown below. + +![Fig-3](../assets/images/2016/07/20130101_Fig_6.png) + +In order to get these you will follow the steps below: + +1. Right Click on Menu and select 'edit Menu'. + +2. Now click on 'New Menu' and Enter a menu entry 'Phone'. + +3. Select the checkbox next to the new menu entry 'Phone' in middle pane. + +4. Select new menu entry 'Phone' in left pane. + +5. Click on 'New Item' in right Pane and in the dialogue box fill the fields as below and save: + + ```yaml + Type: Application in terminal + Name: Mount Nexus 4 + Command: sudo mtpfs -o allow_other /media/nexus4 + ``` + +6. Again click on 'New Item' in right Pane and in the dialogue box fill the fields as below and save: + + ```yaml + Type: Application in terminal + Name: Unmount Nexus 4 + Command: sudo umount /media/nexus4 + ``` + +7. Make sure checkbox next to these new items is ticked. Save and Close. + +That's it !!! All Done. + +Hope some will find this post useful. diff --git a/docs/posts/2013-01-18-conky-on-my-desktop-step-by-step.md b/docs/posts/2013-01-18-conky-on-my-desktop-step-by-step.md new file mode 100644 index 0000000..6b23233 --- /dev/null +++ b/docs/posts/2013-01-18-conky-on-my-desktop-step-by-step.md @@ -0,0 +1,72 @@ +--- +title: Conky on my desktop - step by step +slug: conky-on-my-desktop-step-by-step +draft: False +description: Conky on my desktop - step by step +authors: ['ankit'] +date: + created: 2013-01-18 13:09:00 + updated: 2013-01-18 13:09:00 +comments: true +--- + +![Fig-1](../assets/images/2016/07/20130118_Fig_1.png) + +## Background + +My new friend Damjan recently mentioned that he liked the Conky on my desktop and asked for details as have few others so I figured a post on the topic will be useful. + +Many who have been playing with conky seem to believe it's real easy stuff but I feel there are too many options and very little explanation which means it can be lot of messing around with different options and can take a while to get to a point where you have what you want. + +To make this conky appear exactly the way it is on my screen on your desktop follow below. + + + +## Step 1. Install Conky from Synaptic + +![Fig-2](../assets/images/2016/07/20130118_Fig_2.png) + +Open the synaptic package manager and follow steps as shown in screenshot above. Actually I don't think conky colors is required so if it does not appear in search result don't bother. From memory, that was installed by me as part of experimenting. + +## Step 2. Install the fonts used in this conky + +Download and install the fonts 'pf_tempesta_five_condensed.ttf' and 'ZegoeUI-U.ttf' from web or I have uploaded these to mediafire and can be download from this [link](http://www.mediafire.com/?4ycy1sxxs5trn). + +## Step 3. Change the conky config file + +1. Download my conky configuration in the file named `.conkykrc` from this [mediafire link](http://www.mediafire.com/?nm88my3minnzao5). +2. Open 'Home' directory and press ++Ctrl+h++ to show hidden files. +3. Locate the `.conkykrc` file and delete it. +4. Now paste the `.conkykrc` file downloaded in step 1 to home folder. + +## Step 4. Enable settings to run conky at start-up + +1. Open 'Startup Application' from Menu > Preferences. + + ![Fig-3](../assets/images/2016/07/20130118_Fig_3.png) + +2. Click on 'Add' button and fill the fields as shown above. + + ![Fig-4](../assets/images/2016/07/20130118_Fig_4.png) + +3. Restart the computer and it's all done. + +## Step 5: Configure time-zones on the conky config + +OK, so you have conky running as it is for me but you might want different time-zones than the one I have in which case you will need to modify the .conkykrc file in 'Home' directory. + +1. Open 'Home' directory and press 'Ctrl+h' to show hidden files. +2. Locate the `.conkykrc` file and open it in text editor of your choice. I use gedit. +3. Now Open Terminal and Type 'tzselect' and press enter. +4. A list of continents will be displayed, select the one of your interest by typing the number against it and press enter. - *I selected 'Americas' so I typed '2'* +5. Then you will be presented a list of countries. Again select the one of your interest by typing the number against it and press enter. - *I selected 'North America' so I typed '49'* +6. Finally, it will display time-zones in that country. As above, select the one of your interest by typing the number against it and press enter. - *I selected 'Mountain Time' so I typed '18'* +7. It will confirm selection and then mention TZ being used. - *For my selection it displayed 'Therefore TZ='America/Denver' will be used.'* +8. This text after 'TZ=' is what is important for us. Copy this and go back to `.conkykrc` file. +9. Under 'TIMEZONE' say you want to replace Nashville with Denver then you locate Nashville (Line 83, Col 64) and replace the text with the city of your choice, in this case 'Denver'. +10. Now to reflect the appropriate time-zone, replace the existing time-zone 'America/Chicago' with the one from step above. - *In this example with 'America/Denver''.* + + +That's it. All Done !!! + +Hope you find it useful. Feel free to ask questions on settings here and if it's something I was stuck with I might be able to help. diff --git a/docs/posts/2013-03-01-python-eric-rad-ide-and-qt-designer.md b/docs/posts/2013-03-01-python-eric-rad-ide-and-qt-designer.md new file mode 100644 index 0000000..00cffe7 --- /dev/null +++ b/docs/posts/2013-03-01-python-eric-rad-ide-and-qt-designer.md @@ -0,0 +1,39 @@ +--- +title: Python, ERIC RAD IDE and QT designer +slug: python-eric-rad-ide-and-qt-designer +draft: False +description: Python, ERIC RAD IDE and QT designer +authors: ['ankit'] +date: + created: 2013-03-01 13:30:00 + updated: 2013-03-01 13:30:00 +comments: true +--- + +Right, I have decided to play around a little with the most loved language of open source a. k. a. Python. + + + +How do we do that? By coding? + +Aha and how do I code for Python and be productive given I am a semi-part-time-hobbyist kinda programmer...I am heavily inclined to use an IDE...and an IDE that actually has some GUI editor...so began my search to find out what are my options in the exciting open source world. + +I quickly worked out that IDE and RAD IDE are two different things. RAD IDE is what I am after and well there is nothing straight forward and best bet was to use QT with PySide or PyQT and there is an argument on each side for PyQT vs PySide. + +Anyhoo, PySide is not compatible yet with QT5 and QT4.8.x is not available for download from QT official downloads. Whatever happened to providing an archive. QT itself is a world in itself with lot of modules and plugins etc and I was feeling lost. + +I diverted efforts to find what else and stumbled upon ERIC IDE for Python and from here things started tying up to a point where I could logically assimilate the available information to start preparing my system for my kind of Python Development. + +However, this information isn't as readily available as it should be and most mentioned on trusty old Internet Google search is combination of PySide and the non existent QT4 which had it not been for Linux package managers, might as well be a lost cause. + +All it involves is downloading Eric from repository which satisfied most of the dependencies and then I downloaded qt4 designer and included qt4 creator just for good measure. + +So there now we have the tool and all I need is setting it up and getting started. + +Following links will come handy I suppose. + +[http://eric-ide.python-projects.org/tutorials/MiniBrowser/](http://eric-ide.python-projects.org/tutorials/MiniBrowser/) + +[http://anh.cs.luc.edu/python/hands-on/handsonHtml/handson.html#x1-310001.9.3](http://anh.cs.luc.edu/python/hands-on/handsonHtml/handson.html#x1-310001.9.3) + +Here's to some exciting learning experience. \ No newline at end of file diff --git a/docs/posts/2013-03-17-linux-mint-on-android-through-vnc-and-jump.md b/docs/posts/2013-03-17-linux-mint-on-android-through-vnc-and-jump.md new file mode 100644 index 0000000..db69ff6 --- /dev/null +++ b/docs/posts/2013-03-17-linux-mint-on-android-through-vnc-and-jump.md @@ -0,0 +1,175 @@ +--- +title: Linux Mint on Android through VNC and Jump +slug: linux-mint-on-android-through-vnc-and-jump +date: + created: 2013-03-17 13:37:00 + updated: 2013-03-17 13:37:00 +draft: False +description: Linux Mint on Android through VNC and Jump +authors: ['ankit'] +comments: true +--- + +Today "Jump" was available for free on Amazon as the app of the day and since it's nearly 7 quids on google play store, I grabbed it. For windows and Mac users, they have a pretty straight forward set-up but as usual for Linux it means some work but, in the end, it leaves you with a set-up you can trust and feel secure about. + + + +## Set-up x11vnc and ssh servers + +Linux Mint machine should be set-up for x11vnc and ssh servers + +### Install VNC + +Install X11VNC by typing following command in terminal: + +```bash +sudo apt-get install x11vnc +``` + +### Configure VNC + +Create a password for VNC Using following command in terminal and providing a password and answering yes for the prompt to store password in a file. + +```bash +x11vnc -storepasswd +``` + +Now to ensure that X11VNC starts at boot go to menu and type start, click on startup application as shown in the screenshot below: + +![Fig-1](../assets/images/2016/07/20130317_Fig_1.png) + +Then in the window that this will open click on "Add" and enter a "Name" and in "Command" field paste the command below: + +```bash +x11vnc -forever -xkb -usepw -display :0 +``` + +![Fig-2](../assets/images/2016/07/20130317_Fig_2.png)
+ +VNC set-up on machine is complete. + +### Install openssh + +Install openssh-server using following command on terminal: + +```bash +sudo apt-get install openssh-server +``` + +### Configure openssh + +We will need to change some parameters in ssh configuration for making it secure as by default it allows root login but I dont want that for remote access and would advice most regular users to do so as well. + +* So we will first make a backup of existing configuration file using the command below: + ```bash + sudo cp /etc/ssh/sshd_config ~ + ``` + +* Now, we will edit the actual config file using following command: + ```bash + gksudo gedit /etc/ssh/sshd_config + ``` + +* Once the file is open ==change the parameter "PermitRootLogin" to "no".== *It's on line 27 for me.* + +* Now, the default port for ssh is 22 but I recommend changing it to something else such as 5432. +* To do so change the parameter "Port" from 22 to whatever port you want to put. In this example it will be 5432. *For me "Port" parameter is on line 5.* +* Save the changes and close gedit. + +* Now we will restart the ssh server using following command in terminal + ```bash + sudo restart ssh + ``` + +* For Arch, you can use the command: + ```bash + sudo systemctl start sshd + ``` + followed by + ```bash + sudo systemctl enable sshd.service + ``` + to ensure ssh daemon is enabled at startup. + +* Restart the machine and machine set-up is done. + +## Configure Router firewall + +Router firewall should be configured to allow inbound traffic on specific ports. This may involve different steps from those given below depending on the router in use. Following steps are meant for configuring the sky router. However, principle is same. We will be creating specific service definition and port on router and then create a firewall rule that allows inbound traffic and directs it to Linux machine we configured above. + +* Type following command on terminal: + ```bash + ifconfig + ``` + +* This will list lot of numbers, what we are interested in is the number just after "inet addr:" under wlan0. *It will be something like 192.168.0.10.* + +* Open sky router config through browser using 192.168.0.1 and click on "Security". You will need to enter router username and password. + + ![Fig-3](../assets/images/2016/07/20130317_Fig_3.png) + +* Then click on "Services" and then click on "Add Custom Services". + +* Enter as shown in Figure 4 and Start Port as 5900, Finish Port as 5900 and click on "Apply". + + ![Fig-4](../assets/images/2016/07/20130317_Fig_4.png) + +!!! site-tip "Tip" + `5900` is default port for `display 0` in VNC. If you have changed it like me you will need to enter that port. To change port you will need to use `x11vnc -forever -xkb -usepw -autoport nnnn -display :0` option in third step of VNC config above. This is not required for security but in case you have two different machines then this approach will come handy. + +* Now click on "Add Custom Services" again and this time enter as shown in next screenshot. Start Port and End Port should be same as entered in step 1.8, so for this example it will be 5432. Then click on "Apply". + + ![Fig-5](../assets/images/2016/07/20130317_Fig_5.png) + +* Now we need to set the firewall for these services. To do so, click on "Firewall Rules" then click on "Add" under inbound services. +* Configure fields as shown in next screen-shot below and click on "Apply". + + ![Fig-6](../assets/images/2016/07/20130317_Fig_6.png) + +* Now we will do same for SSH, so again click on "Add" under inbound services and configure fields as shown in screen-shot below and click on "Apply". + + ![Fig-7](../assets/images/2016/07/20130317_Fig_7.png) + +* Click on "Apply" under "Inbound Services". + +* In browser on the router management page, click on "Advanced" > "Remote Management" and on this screen make note of the IP address (number after http:// in red box in next screenshot) shown under "Remote Management Address". + + ![Fig-8](../assets/images/2016/07/20130317_Fig_8.png) + +* Go to [https://www.dlinkddns.com/signin](https://www.dlinkddns.com/signin) and create an account. Refer [this page](http://www.dlinkddns.com/howto) for the how-to and you will need to use the IP from step above as the host. At the end of it you will have a hostname like "yourname.dlinkddns.com", username and password for logging in to dlinkddns site. + +* Once this is done, go to the browser with sky router management and click on "Advanced">"Dynamic DNS" and fill as shown in screen-shot below: + + ![Fig-9](../assets/images/2016/07/20130317_Fig_9.png)
+ + ```bash linenums="1" + Host Name: Hostname from Step above (yourname.dlinkddns.com in this example) + User Name: D-Link site username + Password: D-Link site password + ``` + + ![Fig-10](../assets/images/2016/07/20130317_Fig_10.png) + +* Once above information is filled, click on "Apply" and then click on "Show Status". It should open a separate window and showing the message "request successful". + +Sky Router is now configured. + +## Jump or an equivalent VNC viewer should be configured on the android device. + +1. On the android device open Jump and click on the "+" sign in right hand corner. +2. In the "Address" Field enter the hostname from 2.12 (`yourname.dlinkddns.com` in this example) and select connection type as "VNC" and click save. +3. Change the "Authentication Method" to "VNC Password" +4. Tap on "SSH Tunnel", click on "Enabled" checkbox. +5. In Username enter the username used to log into the machine configured above in Step 1. +6. In Host Name, use the the hostname from 2.12 (yourname.dlinkddns.com in this example) +7. Change the port to one used in 1.8. So in this case 5432. +8. Password can be left empty and when asked during connection provide the one used to log on to the machine with this username. +9. Press back button and click on entry. You will be shown a SSH key notification, say ok. Then you will be asked for a password, provide the password you use to log onto your machine with the username provided in 3.6. +10. Then you will be asked for the VNC password, provide the password from step 1.2. + +You will now be able to view your desktop on your android machine. + +![Fig-11](../assets/images/2016/07/20130317_Fig_11.png) +![Fig-12](../assets/images/2016/07/20130317_Fig_12.png) + +All Done !!! diff --git a/docs/posts/2014-02-19-arch-linux-nearly-a-year-on.md b/docs/posts/2014-02-19-arch-linux-nearly-a-year-on.md new file mode 100644 index 0000000..8f9ab88 --- /dev/null +++ b/docs/posts/2014-02-19-arch-linux-nearly-a-year-on.md @@ -0,0 +1,51 @@ +--- +title: Arch Linux - nearly a year on.... +slug: arch-linux-nearly-a-year-on +date: + created: 2014-02-19 16:00:00 + updated: 2014-02-19 16:00:00 +draft: False +description: Arch Linux - nearly a year on.... +authors: ['ankit'] +comments: true +--- + +I have been dwelling in the world of Arch Linux for just under a year now and must admit the experience is nothing less than liberating. Granted that the barrier to entry was big when I dived in, as a pure Arch install takes some reading and learning but the rewards are worth the pain. + + + +While it may seem easier to stick with dear old .deb files in the end AUR has an equally large collection if not more and the fact that it's a rolling release means that the initial set-up pain is very well negated by another fact that unless like me you are forced to change your hard disk or something that sinister; there is no reason to do a reinstall which is often the case with Debian based distros should you chose to upgrade to their latest offering. + +I have read and heard words such as "Arch is not for faint hearted" or "Arch is for motivated newbie" and so on but in my opinion there are two types of Linux users: + + 1. Those who have an itch to tinker (someone like me) + 2. Those who don't care as long as they can get on with their day to day + business (someone like my wife) + +It's the type 1 who is intended audience of this post because type 2 can't be bothered. Now if you have an itch to tinker there will come a point where you will find that all existing distros have a limit on what you can tinker without messing something to the point where you feel like you have to give another distro a try and before you know it a reinstall is on hand, which ofcourse means type 2 user has to deal with the changes a new distro will bring and this in turn will make them frown and thereby increase the risk of them secretly cursing the day you - the type 1 user - encountered the world of Linux. + +Now Arch is very stable and still gives you the freedom to tinker, learn and do all great things rather than worry about the cosmetics and allow your tinker angel to quench it's thirst by allowing you to focus your learning potential on something that just doesn't scratch the surface so you can feel good about yourself but actually allows you to learn a great deal in the process. The helpful Arch community usually has the answers for nearly every problem I encountered while trying to achieve my goals. + +I do not think that for a Type 1 user - newbie or not - Arch is hard or unfriendly. There is lot more satisfaction once you have your desktop exactly the way you wanted. Getting applications is as easy as using software centre in other distros and now that I have been using it, I find using "yaourt" (Arch equivalent of Synaptics) much better and the fact that repositories are maintained on servers in nearly all locations, it does seem to get new updates to your favourite applications rather quickly too. + +I will substantiate this claim with following examples: + +Getting android sdk configured on debian based distros is a right pain in you know where but with Arch it's what we like to call a doddle in Great Britain. Getting intellij IDE on other distro repositories is not an option but in Arch - you got it, it's a doddle. + +Why is that? It's because Type 1 users when they switch to Arch they soon realise that they now have time on their hands which earlier used to disappear in distro hopping. So what do they do with this time? They search for software they want to use and if it isn't in the repo then with their new found confidence they don't shy away from building it from source and when they have done that they want to showcase their work and they can do so in AUR short for Arch User Repository - though with all that is already there this showcasing will only be possible if you genuinely need a very unique software not used by any Arch user - highly unlike scenario if you were to go by my experience . You will find nearly all software you can think of in AUR and since it's being maintained by someone who needed it, chances are he / she will keep it updated for his / her use thereby ensuring you get the latest and greatest as it happens. What a wonderful model it is indeed. + +Now if you are still not geared up to go all the way to start from scratch on Arch but want to get a flavour, why not start with the new kid on the block - Manjaro Linux? + +Manjaro linux is an Arch based distro, with a rolling release schedule and will still give you the access to AUR. It takes away the pain of setting up your system on command line and does the hard work for you so you can get the benefits of Arch but not the pain. Seems like a win win especially for those who are repelled by the very thought of terminal based system configuration. + +Manjaro Linux offers all leading desktop environments - Gnome, KDE, Openbox but their best offering is with XFCE. XFCE is very good as well what with it being light weight and not making your Type 2 users feel that the system has been rendered useless. The default configuration of Manjaro XFCE flavour does come with a very ready to use set-up yet enough opportunity to make it and configure just the way you like it. In addition a type 1 user will be pleasantly surprised that using XFCE does wonders to satisfy that itch to tinker. + +The login manager used with XFCE is MDM but can be easily replaced to the slick lovely light and beautiful SLiM and by installing slimlock you can also get rid of the ugly default screen lock that comes bundled with XFCE. + +Explore some more and key bindings on this desktop are much more satisfying and easier to manage than on Gnome or KDE - IMHO. + +Manjaro also comes with GUI based synaptics equivalent called "packer" but like I said once you are used to "yaourt" interface everything else GUI based just seems pale in comparison becaue it does not give the same satisfaction of installing stuff. + +The one situation where Manjaro might actually be a better choice than Arch is when you are dealing with a potential convert. Offer them Arch with yaourt and they might be very sceptical but offer Manjaro with packer and they just might convert. Then again for this scenario perhaps Linux Mint or Zorin OS may be even better choice. + +Point is Arch should enter into anyone's life where they make the choice but not when someone else is making that choice on their behalf as they may or may not develop the habit of tinkering. When and if they do, they will need to decide on their own to move to this platform but if you have been calling yourself a linux newbie and have found yourself reviewing new distros or worse distro hopping and by extension forum hopping, tailoring your linux install and generally enthusistic when it comes to all things Linux, I think it is time to get your feets wet and hands dirty. Get Arch experience in it's purest form or by using Manjaro, you will not regret it. \ No newline at end of file diff --git a/docs/posts/2016-02-18-mysql-stored-procedure-to-return-json-for-google-charts.md b/docs/posts/2016-02-18-mysql-stored-procedure-to-return-json-for-google-charts.md new file mode 100644 index 0000000..cb92e31 --- /dev/null +++ b/docs/posts/2016-02-18-mysql-stored-procedure-to-return-json-for-google-charts.md @@ -0,0 +1,416 @@ +--- +title: MySQL Stored Procedure to return JSON for google charts on BIRT +slug: mysql-stored-procedure-to-return-json-for-google-charts +date: + created: 2016-02-18 13:56:00 + updated: 2016-02-18 13:56:00 +draft: False +description: MySQL Stored Procedure to return JSON for google charts on BIRT +authors: ['ankit'] +comments: true +--- + +## Background + +My requirement was to get the data in a format that google chart can use to draw the chart I want. Now gogle chart accepts data in json format where all column names separated with comma are in first square bracket set followed by values in rest of the square bracket sets and each square bracket set is separated by comma as well. + + + +Having searched on good old google, there did not appear to be any quick way of doing it without getting hands dirty with likes of php and as I was to plug this into a BIRT report where a simple html would do the trick, I really just needed the data-set to be returned in format that google-chart understood. + +I figured it can be easily done using a MySQL stored procedure and can be a repeatable process which resulted in creation of stored procedure presented below. + +## The code + +```sql linenums="1" +CREATE DEFINER=`root`@`localhost` PROCEDURE `json_builder_multiple_string`(IN `var1` varchar(10000), IN `tab_name` text, IN `int_col_as_str` int) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + SQL SECURITY DEFINER + COMMENT '' +BEGIN +/* +- This procedure will take columns and tablename as parameter. +- Third parameter is to tell the procedure how many columns are to be returned as string - surrounded by quotes +- Third parameter must always be less than the total columns being requested. +- Rest of the columns must have numerical values as they won't be surrounded with quotes +- Procedure returns 0 for each null value. +​ +SAMPLE PROCEDURE CALL +CALL `json_builder_multiple_string`('Year,Month,Region,Sales,Expenses', 'myjsonexample',4); +​ +SAMPLE QUERY GENERATED: +SELECT + CONCAT('[\'Year\',\'Month\',\'Region\',\'Sales\',\'Expenses\'],', + GROUP_CONCAT('[', + CONCAT_WS(',', + CONCAT('\'', + IFNULL(`Year`, 0), + '\',\'', + IFNULL(`Month`, 0), + '\',\'', + IFNULL(`Region`, 0), + '\',\'', + IFNULL(`Sales`, 0), + '\''), + IFNULL(`Expenses`, 0)) + SEPARATOR '],'), + ']') AS data_set +FROM + myjsonexample +​ +SAMPLE OUTPUT: +['Year','Month','Region','Sales','Expenses'],['2004','JAN','NW','1000',400],['2005','Feb','SW','1170',460],['2006','Mar','NE','2000',1210],['2007','Apr','SE','650',540],['2008','May','EC','0',0] +​ +SAMPLE TABLE USED: +Drop Table if exists `myjsonexample`; +CREATE TABLE `myjsonexample` ( + `Year` int(11) NOT NULL, + `Month` varchar(25), + `Region` varchar(25), + `Sales` int(11) , + `Expenses` int(11) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO `myjsonexample` +(`Year`, +`Month`, +`Region`, +`Sales`, +`Expenses`) +VALUES +(2004,'JAN','NW',1000,400), +(2005,'Feb','SW',1170,460), +(2006,'Mar','NE',2000,1210), +(2007,'Apr','SE',650,540), +(2008,'May','EC',null,null); +*/ +SET SESSION group_concat_max_len = 1000000; +Set @stmt1 = null; +select concat('Select concat(\'',concat('[\\\'',replace(replace(var1,'_',' '),',','\\\',\\\''),'\\\'],'),'\'', +', group_concat(\'[\', +concat_ws(\',\', +CONCAT(\'\\\'\', ifnull(`',replace(substring_index(var1,',',int_col_as_str),',','`,0),\'\\\',\\\'\',ifnull(`'), +'`,0), \'\\\'\'),', +(concat('ifnull(`', +replace( + SUBSTRING(var1,LENGTH(SUBSTRING_INDEX(var1, ',', int_col_as_str)) + 2,LENGTH(var1)), + ',', + '`,0),ifnull(`'), +'`,0)') +) +,') SEPARATOR \'],\'),\']\') as data_set from ', tab_name) into @stmt1; +Prepare stmt2 from @stmt1; +Execute stmt2; +END +``` +## The alternative code + +Another variation of above stored procedure where the output is returned in an output parameter can be created simply by adding two more lines to above code after Execute stmt2 and also including the output parameter in first line. Complete code below: + +```sql linenums="1" +CREATE DEFINER=`root`@`localhost` PROCEDURE `json_builder_outparam`(IN `var1` varchar(10000), IN `tab_name` text, OUT `varout` text) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + SQL SECURITY DEFINER + COMMENT '' +BEGIN +/* +- This procedure will take columns and tablename as parameter. +- Third parameter is to tell the procedure how many columns are to be returned as string - surrounded by quotes +- Third parameter must always be less than the total columns being requested. +- Rest of the columns must have numerical values as they won't be surrounded with quotes +- Procedure returns 0 for each null value. +​ +SAMPLE PROCEDURE CALL +CALL `json_builder_multiple_string`('Year,Month,Region,Sales,Expenses', 'myjsonexample',4); +​ +SAMPLE QUERY GENERATED: +SELECT + CONCAT('[\'Year\',\'Month\',\'Region\',\'Sales\',\'Expenses\'],', + GROUP_CONCAT('[', + CONCAT_WS(',', + CONCAT('\'', + IFNULL(`Year`, 0), + '\',\'', + IFNULL(`Month`, 0), + '\',\'', + IFNULL(`Region`, 0), + '\',\'', + IFNULL(`Sales`, 0), + '\''), + IFNULL(`Expenses`, 0)) + SEPARATOR '],'), + ']') AS data_set +FROM + myjsonexample +​ +SAMPLE OUTPUT: +['Year','Month','Region','Sales','Expenses'],['2004','JAN','NW','1000',400],['2005','Feb','SW','1170',460],['2006','Mar','NE','2000',1210],['2007','Apr','SE','650',540],['2008','May','EC','0',0] +​ +SAMPLE TABLE USED: +Drop Table if exists `myjsonexample`; +CREATE TABLE `myjsonexample` ( + `Year` int(11) NOT NULL, + `Month` varchar(25), + `Region` varchar(25), + `Sales` int(11) , + `Expenses` int(11) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO `myjsonexample` +(`Year`, +`Month`, +`Region`, +`Sales`, +`Expenses`) +VALUES +(2004,'JAN','NW',1000,400), +(2005,'Feb','SW',1170,460), +(2006,'Mar','NE',2000,1210), +(2007,'Apr','SE',650,540), +(2008,'May','EC',null,null); +*/ +SET SESSION group_concat_max_len = 1000000; +Set @stmt1 = null; +select concat('Select concat(\'',concat('[\\\'',replace(replace(var1,'_',' '),',','\\\',\\\''),'\\\'],'),'\'', +', group_concat(\'[\', +concat_ws(\',\', +CONCAT(\'\\\'\', ifnull(`',replace(substring_index(var1,',',int_col_as_str),',','`,0),\'\\\',\\\'\',ifnull(`'), +'`,0), \'\\\'\'),', +(concat('ifnull(`', +replace( + SUBSTRING(var1,LENGTH(SUBSTRING_INDEX(var1, ',', int_col_as_str)) + 2,LENGTH(var1)), + ',', + '`,0),ifnull(`'), +'`,0)') +) +,') SEPARATOR \'],\'),\']\') as data_set from ', tab_name) into @stmt1; +Prepare stmt2 from @stmt1; +Execute stmt2; +Set varout = @varouttemp; +Select varout; +END +``` + +## The BIRT usage explained + +My sample BIRT reports are available for download [HERE](https://www.mediafire.com/folder/n96sq03xvhrjz/BIRT_Examples). Enabling the google chart on BIRT couldn't be simpler. + + +* Create a new report + +* Add a text field, open it and change it to HTML as shown in the image below + + ![Change Text Field](../assets/images/2016/07/20160718_Fig_1.PNG) + +* Copy the html from codeblock below. + ```html linenums="1" + + + + + + + +
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+ + + ``` + +* Modify as required and paste in to the text field. I used jsfiddle for checking the code and making changes, [link here](https://jsfiddle.net/mrmittal/656Lts2e/). + +* Run + +* Once the BIRT preview is working fine, create a dataset by calling the stored-procedure above and bind it to this text field. + +* To bind a dataset, in 'Report Design' perspective, click on the field and then in 'Property Editor' select 'Binding' as shown below: + + ![Report Design](../assets/images/2016/07/20160718_Fig_2.PNG) + +* Then right click on the text field and click on edit and then click on the 'Fx' symbol next to where field was changed to HTML on top of the window. This will open javascript editor. + +* On javascript editor select the static dataset and replace it by selecting the dataset like so: + + ![static dataset](../assets/images/2016/07/20160718_Fig_3.PNG) + +* That should change the HTML to dynamically get the data from json builder. \ No newline at end of file diff --git a/docs/posts/2016-06-06-crossover.md b/docs/posts/2016-06-06-crossover.md new file mode 100644 index 0000000..c915085 --- /dev/null +++ b/docs/posts/2016-06-06-crossover.md @@ -0,0 +1,57 @@ +--- +title: Crossover +slug: crossover +classes: wide +date: + created: 2016-06-06 15:01:00 + updated: 2016-06-06 15:01:00 +draft: False +description: Crossover +authors: ['ankit'] +comments: true +--- +There are technologies that I can use in my personal life, that I am proud of and those that I play around with but reality is that as a Senior Project Manager, there aren't very many times when I get the opportunity to influence the choice of software to be used. + +As a principle, my personal choices are driven by opensource and professional choices are driven by client needs. However, listed below are opensource technologies that crossed over from my personal to professional realm. + +> Three open-source technologies that jumped from my hobbyist curiosity to my professional life + + + +## PlantUML + +### What is it? +[PlantUML](http://www.plantuml.com/) is a great tool to create flow and activity diagrams. It uses plain text to create nice looking flow diagrams which are really quick to prepare. Postioning and all the other stuff is just taken care of by the algorithm. + +### How do I use it? +As such there is no install required. For Chrome, there is an extension which can be installed or from any browser using [PlantText] (http://www.planttext.com). + +I use it directly on the text editor at hand and create the flow I am after while taking notes on the process. It just works. + +## SpagoBI + +### What is it? +[SpagoBI](https://www.spagobi.org/) is a fully working Business Intelligence Suite which just works. + +### How do I use it? +As part of one of my projects. I had the freedom to pick any MI solution that was cost effective, robust and fit for purpose. SpagoBI ticks all the boxes so I took the opportunity to bring in this opensource solution. + +It has very nice GUI and end user experience is great which meant it was an instant hit. It is live and am a user as well. + +## Talend + +### What is it? +[Talend](http://www.talend.com) - does not really need an introduction. It is a well established name and is what techies call ETL - Enterprise Transport Layer. + +To explain with an analogy, if different databases were people speaking different languages, then Talend is the translator who can not only explain what other party is speaking but can also perform some important jobs like getting the groceries, throwing garbage and arranging school pickups. + +### How do I use it? +Again as part of the aforementioned project, Talend is what was used to interact with an obscure offering from intuit called Quickbase as well as with MSSQL and mariaDB (another opensource tech we all love). + +The biggest benefit that I derived apart from the regular data integration came from the fact that it is also able to place the dataset directly into a spreadsheet (Excel or LibreCalc). + +Now, having all charts and formulae already in place as a template on spreadsheet kind of allows for report creation on a technology that these recipients are already working with and so they don't have to learn any new technology. + +Instead of learning and struggling with something new, they are happy to get the information in a format they all accept and are comfortable with and can get on with their day job and make informed decisions based on what the report says. Icing on the cake, the emailing for these spreadsheets, once they were agreed as final versions, is also scheduled so the reports can be delivered in the format end-user likes without any human intervention. + +What more can a project manager ask. :grinning: \ No newline at end of file diff --git a/docs/posts/2016-06-27-seafile-server-behind-nginx-on-fedora-24-security-lab-spin.md b/docs/posts/2016-06-27-seafile-server-behind-nginx-on-fedora-24-security-lab-spin.md new file mode 100644 index 0000000..70abb87 --- /dev/null +++ b/docs/posts/2016-06-27-seafile-server-behind-nginx-on-fedora-24-security-lab-spin.md @@ -0,0 +1,513 @@ +--- +title: Seafile Server behind nginx on Fedora 24 Security Lab Spin +slug: seafile-server-behind-nginx-on-fedora-24-security-lab-spin +date: + created: 2016-06-27 17:54:00 + updated: 2016-06-27 17:54:00 +draft: False +description: Seafile Server behind nginx on Fedora 24 Security Lab Spin +authors: ['ankit'] +comments: true +--- + +I have recently been intrigued by the idea of replacing the likes of “Dropbox” and “Google Drive” with a cloud set-up of my own. I had "Owncloud" set-up for nearly a year but was not happy with it. There were minor niggles aside form speed and thumbnails and then “Owncloud” had a recent split leading to creation of “Nextcloud”. + +While “Nextcloud” is the one that is more aligned to the general principles of community driven software, it is new and is still plagued with owncloud issues as it is essentially same stuff in new packaging at the moment. + +In the meantime, every now and then I was reading all the good stuff people had to say about "Seafile" and so I wanted to give it a try. Now for the past year and a half I have also been using Fedora Security Lab spin on my home server and I just wanted to get the Seafile set-up on it so I did a few “duckduckgo” searches on the net and finally had the steps to achieve the objective. Obviously it all worked and my Seafile server is live and kicking, hence the post. :smile: + +!!! quote "So in nutshell my objective was to:" + **Install seafile-server-5 behind nginx on Fedora 24 Security Lab spin all on a 32 bit 12 year old laptop.** + +The steps I followed are listed below with detailed notes of what I did. I do not claim these to be perfect but this is what worked for me. If you know that something can be done better, please do let me know in the comments. + + + +## Install required software to support seafile with nginx: + +1. python +2. python-imaging +3. MySQL-python +4. python-setuptools +5. nginx +6. mariadb +7. mariadb-server +8. policycoreutils-python +9. setroubleshoot + +All this can be done with one single command: + +```bash linenums="1" +sudo dnf install \ + python \ + python-imaging \ + MySQL-python \ + python-setuptools \ + nginx \ + mariadb \ + mariadb-server \ + policycoreutils-python \ + setroubleshoot +``` + + +## Start mariadb-server and set up basic security settings. + +Now as we need to run all commands with “sudo”, it is actually easier to just go root. In other words, type "su" on the terminal and provide your password so you are logged in as root on the terminal. When you are logged in as root the $ changes to ## at command prompt. All commands below are on root so if you are not logged in as root, you will need to run these with "sudo". + +```bash linenums="1" +#Start mariadb: +[root@localhost /] systemctl start mariadb +#Initiate the mariadb secure installation: +[root@localhost /] mysql_secure_installation +``` + +Above command will trigger a set of questions around port, username, password etc. You can of course change these. If you do so, you must keep note of it and change your specific details for database in subsequent steps but if you leave it default you will basically have a user: root, with a password of your choice (we will use “sqlpasswd” for this example) and a database server running at port 3306. + +## Set up databases and privileges for "seafile' + +Type following: + +```bash +[root@localhost /] mysql -p +``` + +You will be prompted to enter a password. Provide the password you have set-up for maria-db server in step above. + +:info: For our example it will be: ***sqlpasswd*** + +Now on mysql prompt type following commands one after one along with semi-colon: + +```sql linenums="1" +create database `ccnet-db` character set = 'utf8'; +create database `seafile-db` character set = 'utf8'; +create database `seahub-db` character set = 'utf8' +``` + +Now we will create a user named "seafile" for mysql with a password 'seafilepwd'. You must replace this password with one of your own. To do so use the command below and change seafilepwd with a password of your choice. + +```sql +create user 'seafile'@'localhost' identified by 'seafilepwd'; +``` + +Once seafile user is created, we need to grant permissions to this user on the three databases we created above. To do so, use the following one by one on mysql command prompt: + +```sql linenums="1" +GRANT ALL PRIVILEGES ON `ccnet-db`.* to `seafile`@localhost; +GRANT ALL PRIVILEGES ON `seafile-db`.* to `seafile`@localhost; +GRANT ALL PRIVILEGES ON `seahub-db`.* to `seafile`@localhost; +``` + +Finally we will make sure that mariadb-server starts every-time the system is started. To do this simply copy the command below: + +```bash +[root@localhost /] systemctl enable mariadb +``` + +## Create directories to download and extract seafile server: + +```bash linenums="1" +#Create a directory called seafile: +[root@localhost /] mkdir /opt/seafile +Now change directory to the newly created path +[root@localhost /] cd /opt/seafile +``` + +Download the latest seafile-server relevant to your machine architecture (32 bit, 64 bit etc). As I am using a 32 bit laptop, I used the link meant for that. + +!!! site-tip "Tip" + You can get the relevant link by first opening the seafile site in firefox (https://www.seafile.com/en/download/) and scrolling down all the way to "Server" section. Then under linux section you will see link for 64 bit and 32 bit versions. Right click on one you need and click on "Copy Link" Location&quot;. The copied text is what you need to paste after wget in command below. + + +```bash +[root@localhost /] wget https://bintray.com/artifact/download/seafile-org/seafile/seafile-server_5.1.3_i386.tar.gz +``` + +Now to extract the downloaded file, type following command. + +```bash +[root@localhost /] tar -xzf seafile-server_5.1.3_i386.tar.gz +``` + +!!! site-tip "Tip" + If downloaded version is different, the filename "seafile-server\_5.1.3\_i386.tar.gz" will be different in the link you would have got from previous step. Use the file name right at the end of the link you copied. + + +OK, now we will create a directory named “installed” and move the downloaded file in there. + +```bash linenums="1" +[root@localhost /] mkdir installed +[root@localhost /] mv seafile-server_5.1.3_i386.tar.gz installed +``` + +### Checkpoint + +At this point, if you give the tree command, your directory structure would look as shown below + +```bash linenums="1" +[root@localhost seafile] tree -L 2 + +. +|---installed +|----- seafile-server_5.1.3_i386.tar.gz +|---seafile-server-5.1.3 +|----- check_init_admin.py +|----- reset-admin.sh +|----- runtime +|----- seaf-fsck.sh +|----- seaf-fuse.sh +|----- seaf-gc.sh +|----- seafile +|----- seafile.sh +|----- seahub +|----- seahub.sh +|----- setup-seafile-mysql.py +|----- setup-seafile-mysql.sh +|----- setup-seafile.sh +|----- upgrade +``` + +## Configure the seafile-server + +```bash linenums="1" +#Change directory to seafile-server where the execution scripts are residing. +[root@localhost seafile] cd seafile-server-5.1.3 +#Now run the execution script: +[root@localhost seafile-server-5.1.3] ./setup-seafile-mysql.sh +``` + +Running this script will initiate the seafile server set-up for mysql. You will need to provide answers to some questions. I am providing those below where you need to deviate from default or need to provide specifc information: + +1. *Name of the server.* Provide a servername like "my_seafile_cloud" or "cloudy_lemon" ...you get the gist. +2. *IP or Domain of Server:* + !!! site-tip "Tip" + Now let's take a bit of time to understand what should go here. For my usage I wanted to use dyndns so I can access this server from outside of my home network. So I had to configure my dyndns url to a port on my home router such that router understood that incoming traffic to that particular port must be transferred to this machine where the server is hosted. + + Then on this machine, I have forwarded the traffic coming to a specific port again to whichever server I want to access thus having my unique URL for each service I am interested in. I will go into in a bit more detail later but for now, just ensure you are providing 1 the internal IP as well as dyndns IP along with the port you have configured on your router to reach this machine in particular where you are configuring the server. + + So if internal IP of this machine is 192.168.1.24 and my dyndns url is banana.dyndns.com and I have forwarded port 9994 on my router to this machine and on machine incoming traffic to 9994 is forwarded to the port relevant to seahub then I will provide following entries as answer to this question: *192.168.1.24:9994`, banana.dyndns.com* + + + 1. *Choose a way to initiatlise seafile databases:* Now remember we have already done this in step 2. So for this question we will need to give option 2. so just type 2 and press enter. + 2. *Host of mysql server:* Unless you changed this in step 2, leave it as default (localhost) + 3. *Port for mysql server:* as above leave it default (3306) unless you changed in Step 2. + 4. *User for seafile:* seafile + 5. *Password for user "seafile':* Use the password provided in Step 3. "seafilepwd" is what we provided for this example. + 6. *Database name for ccnet:* ccnet-db + 7. *Database name for seafile:* seafile-db + 8. *Database name for seahub:* seahub-db + + Once this wizard has completed configuring, you will get a confirmation that will tell you that seafile is now listening on port 8082 and seahub on port 8000 unless you changed these while providing answers to the wizard. + + +## Add the user and provide right access + +Use following commands to go up one directory, add a user “seafile” and provide right privileges. + +```bash linenums="1" +[root@localhost seafile-server-5.1.3] cd .. +[root@localhost seafile] adduser seafile +[root@localhost seafile] chown -R seafile . +``` + +## Generate SSL Certificate: + +```bash linenums="1" +#Change directory to /etc/ssl +[root@localhost seafile] cd /etc/ssl +#Generate private and public ssl certificates +[root@localhost ssl] openssl genrsa -out seafile_privkey.pem 2048 +[root@localhost ssl] openssl req -new -x509 -key seafile_privkey.pem -out seafile_cacert.pem -days 1095 +``` + +## Create the nginx config file for seafile + +Use following command to create `seafile.conf` file: + +```bash +[root@localhost ssl] nano /etc/nginx/conf.d/seafile.conf +``` + +Copy Paste the following but do make relevant changes where required for servername etc: + +```bash linenums="1" title="/etc/nginx/conf.d/seafile.conf" +######################################################## +server { + listen 80; + server_name *banana.dyndns.com*; --> Must change this as per your set-up. Notice no port 9994 here. + rewrite ^ https://$http_host$request_uri? permanent; ## force redirect http to https. +} +server { + listen 443; + ssl on; + ssl_certificate /etc/ssl/seafile_cacert.pem; + ssl_certificate_key /etc/ssl/seafile_privkey.pem; + server_name *banana.dyndns.com*; -->Must change this as per your set-up. Notice no port 9994 here. + proxy_set_header X-Forwarded-For $remote_addr; + add_header Strict-Transport-Security "max-age=31536000; includeSubdomains&quot;; + server_tokens off; + location / { + fastcgi_pass 127.0.0.1:8000; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_script_name; + fastcgi_param SERVER_PROTOCOL $server_protocol; + fastcgi_param QUERY_STRING $query_string; + fastcgi_param REQUEST_METHOD $request_method; + fastcgi_param CONTENT_TYPE $content_type; + fastcgi_param CONTENT_LENGTH $content_length; + fastcgi_param SERVER_ADDR $server_addr; + fastcgi_param SERVER_PORT $server_port; + fastcgi_param SERVER_NAME $server_name; + fastcgi_param HTTPS on; + fastcgi_param HTTP_SCHEME https; + access_log /var/log/nginx/seahub.access.log; + error_log /var/log/nginx/seahub.error.log; + } + location /seafhttp { + rewrite ^/seafhttp(.*)$ $1 break; + proxy_pass http://127.0.0.1:8082; + client_max_body_size 0; + proxy_connect_timeout 36000s; + proxy_read_timeout 36000s; + proxy_send_timeout 36000s; + } + location /media { + root /opt/seafile/seafile-server-latest/seahub; + } + +######################################################## +``` + +## Apply config changes to seafile + +```bash linenums="1" +#Change to conf directory at /opt/seafile. +[root@localhost ssl] cd /opt/seafile/conf +#Now open the ccnet.conf file: +[root@localhost conf] nano ccnet.conf +``` +Amend the file as per below: + +```bash linenums="1" title="/opt/seafile/conf/ccnet.conf" +######################################################## + +[General] +USER_NAME = my_seafile_cloud +#**Must change this as per your setup.** +ID = +NAME = my_seafile_cloud ####<--------- Must change this as per your setup. +SERVICE_URL = https://192.168.1.24:9994,https://banana.dyndns.com:9994 +#**Must change this as per your setup.** +#**Also note that here we have provided the 9994 port ** +#**- the one we used as port forward on router ** +#**to send traffic to this machine.** + +[Client] +PORT = 13419 + +[Database] +ENGINE = mysql +HOST = 127.0.0.1 +PORT = 3306 +USER = seafile +PASSWD = sqlpasswd +#**This would be same as what was provided in Step 2.** +DB = ccnet-db +CONNECTION_CHARSET = utf8 + +######################################################## +``` + +Open the seahub_settings.py file + +```bash linenums="1" +[root@localhost conf] nano seahub_settings.py +``` + +Add the line `FILE_SERVER_ROOT= 'https://banana.dyndns.com:9994/seafhttp'` replacing *banana.dyndns.com:9994* with url to reach your machine. + +```bash linenums="1" title="seahub_settings.py" +######################################################## + +DATABASES = +{ + 'default': + { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'seahub-db', + 'USER': 'seafile', + 'PASSWORD': 'sqlpasswd', # (1) + 'HOST': '127.0.0.1', + 'PORT': '3306' + } +} + +FILE_SERVER_ROOT= 'https://banana.dyndns.com:9994/seafhttp' # (2) +#**Must change this as per your setup.** +#**Also note that here we have provided the 9994 port ** +#**- the one we used as port forward on router ** +#**to send traffic to this machine.** +``` + +1. This will be same as password created in Step 2. +2. Replace *banana.dyndns.com:9994* with url and port rerquired to reach your machine + +## Create and enable the services to run at system startup + +### Create a seafile.service file: + +```bash +[root@localhost conf] nano /etc/systemd/system/seafile.service +``` + +Paste the below into the file: + +```bash linenums="1" title="/etc/systemd/system/seafile.service" +######################################################## + +[Unit] +Description=Seafile +After=network.target mariadb.service + +[Service] +Type=oneshot +ExecStart=/opt/seafile/seafile-server-latest/seafile.sh start +ExecStop=/opt/seafile/seafile-server-latest/seafile.sh stop +RemainAfterExit=yes +User=seafile +Group=seafile + +[Install] +WantedBy=multi-user.target +######################################################### +``` + +Now reload the systemd and enable seafile service to start at system start-up. + +```bash linenums="1" +[root@localhost conf] systemctl daemon-reload +[root@localhost conf] systemctl enable seafile +``` + +### Create a seahub.service file: + +```bash +[root@localhost conf] nano /etc/systemd/system/seahub.service +``` + +Paste the following in the file and save. + +```bash linenums="1" title="/etc/systemd/system/seahub.service" +########################################################## +[Unit] +Description=Seafile hub +After=network.target seafile.service + +[Service] +ExecStart=/opt/seafile/seafile-server-latest/seahub.sh start-fastcgi +ExecStop=/opt/seafile/seafile-server-latest/seahub.sh stop +User=seafile +Group=seafile +Type=oneshot +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +########################################################## +``` + +Now, enable seahub to start at system start-up and start seafile and seahub services. + +```bash linenums="1" +[root@localhost conf] systemctl enable seahub +[root@localhost conf] systemctl start seafile +[root@localhost conf] systemctl start seahub +``` +### Nginx Service + +Start nginx service and enable to run at system start + +```bash linenums="1" +[root@localhost conf] systemctl enable nginx.service +[root@localhost conf] systemctl start nginx.service +``` + +## Fedora specific steps: + +Now, at this point there were few final things specific to Fedora that needed attention. I was ending up getting error 500 and what not and after a bit of searching on duckduckgo, I tried steps listed in this section that fixed the issue. + +I am not entirely sure what this does but what I understood is selinux was not allowing some access between nginx and seafile which this resolved. How? Well, you tell me :grinning:. + +I had to install policycoreutils-python and setroubleshoot packages for these commands to work, so I have included them in Step 1 anyway. + +```bash linenums="1" +[root@localhost conf] cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx +[root@localhost conf] semodule -i mynginx.pp +[root@localhost conf] setsebool httpd_can_network_connect 1 +``` + +### Re-set admin user and password for seafile: + +```bash linenums="1" +#Change directory to seafile +[root@localhost conf] cd /opt/seafile/seafile-server-5.1.3/ +#Now run the reset-admin +[root@localhost seafile-server-5.1.3] ./reset-admin.sh +``` + + +## Firewall configuration and port forwarding: + +Notes below are relevant to system running Fedora Security Lab spin with XFCE but general principle will be same. + +* Application>Administration>Firewall will open firewall gui. + + ![Firewall GUI](../assets/images/2016/07/Figure-1-1.png) + +* You will be asked for password and upon entering you will be presented with Zones and Services. + + ![Zones and Services](../assets/images/2016/07/Figure-2.png) + +* In Services enable `https` by clicking the checkbox against “https”. + + ![Enable https](../assets/images/2016/07/Figure-3.png) + +* Now click on "Ports" and click on "Add". + + ![Click Add](../assets/images/2016/07/Figure-4.png) + +* Then add port `8082` in "Port / Port Range" and select `TCP` as `Protocol`. +* Then add port `8082` in "Port / Port Range" and select `UDP` as `Protocol`. +* Then add port `8000` in "Port / Port Range" and select `TCP` as `Protocol`. +* Then add port `8000` in "Port / Port Range" and select `UDP` as `Protocol`. +* Then add port `443` in "Port / Port Range" and select `TCP` as `Protocol`. + + ![Protocol](../assets/images/2016/07/Figure-5.png)
+ +* Now click on `Port Forward tab` and click on `Add`. Then fill field as shown below: + + ```bash linenums="1" + Protocol: tcp + Port / Port Range: 9994 + ## This is the port you have used on your router for port forwarding to this machine. + Under Destination section, tick the checkbox for "Local Forwarding" + Port / Port Forwarding field: 443 + ## If you have used above configuration, SSL is enabled at 443. + ## If you have changed it, mention the relevant port. + ``` + + !!! site-tip "Tip" + Once you have made these changes don't forget to save this from run time to permanent or these changes will be lost when you restart the machine. [Options-> Runtime to Permanent] + + +## Finally, restart nginx: + +Use the following command to restart nginx services. + +```bash +[root@localhost seafile-server-5.1.3] systemctl restart nginx.service +``` + +This is it. All Done !!! + +If you now type your URL: (https://*banana.dyndns.com*:9994 from this example) on a browser, you will be presented with login page where you should use the admin login details you have created above. diff --git a/docs/posts/2016-07-01-ghost-on-fedora-24.md b/docs/posts/2016-07-01-ghost-on-fedora-24.md new file mode 100644 index 0000000..8fc6a59 --- /dev/null +++ b/docs/posts/2016-07-01-ghost-on-fedora-24.md @@ -0,0 +1,205 @@ +--- +title: Ghost on Fedora 24 +slug: ghost-on-fedora-24 +date: + created: 2016-07-01 11:37:53 + updated: 2016-07-01 11:37:53 +draft: False +description: Ghost on Fedora 24 +authors: ['ankit'] +comments: true +--- + +To install Ghost as my blogging platform, I had to go through a number of hoops and one of them was to get the nodejs working and what not. I figured this might as well be worth documenting in case I have to do this all over again. It might also be helpful for some other inquisitive minds. :smile: + +The most useful reference I found was the post on rosehosting website specific to CentOS 7. + +It would have all gone well too; had it not been for the nodejs related issues which resulted in me finding the other helpful pointers from various forums. + +Anyway, the steps I took to get this all working are detailed in my notes below - keeping it, where I can, true to the post I have referred above: + + + +## Step 1: Install nodejs and npm + +On Fedora 24 node.js package already includes npm and if you try installing npm separately it will throw an error so just install node.js and npm will be installed along with it. + +```bash linenums="1" +sudo dnf distro-sync +sudo dnf install nodejs +``` +## Step 2: Install dependencies + +```bash linenums="1" +sudo dnf install php php-fpm php-cli php-mysql php-curl php-gd + +#Create a directory for the website: +mkdir /var/www/html/[sitefolder. eg: blog, myblog, banana] + +#Change to the newly created directory: +cd /var/www/html/[sitefolder. eg: blog, myblog, banana] + +#Set access permissions for this directory +chown -R /var/www/html/[sitefolder. eg: blog, myblog, banana] + +#Download latest version of Ghost: +curl -L https://ghost.org/zip/ghost-latest.zip -o ghost.zip + +#Unzip the downloaded file +unzip ghost.zip + +#Finally check the directory structure +tree -L 2 + +#OUTPUT of above command should look like as shown below: +. +├── config.example.js +├── config.js +├── content +│   ├── apps +│   ├── data +│   ├── images +│   └── themes +├── core +│   ├── built +│   ├── index.js +│   ├── server +│   └── shared +├── ghost.zip +├── Gruntfile.js +├── index.js +├── LICENSE +├── npm-shrinkwrap.json +├── package.json +├── PRIVACY.md +└── README.md +``` + +## Step 3: Install npm modules + +While installing/initiating npm modules, there were several errors that system was throwing. They were in two categories: + +* Access Related +* Dependencies Related + +**Access Related** - I was getting EACCES error and solution given on on npmjs.com under Option 2 is what sorted the access issues. + +```bash linenums="1" +mkdir ~/.npm-global +npm config set prefix '~/.npm-global' +nano ~/.profile +``` +Add the line `export PATH=~/.npm-global/bin:$PATH` in the opened file. + +```bash linenums="3" +source ~/.profile +``` +**Dependencies Related** - Some forum hopping later I just followed the advice on Ghost support and installed the dependencies. Steps below: + +```bash linenums="1" +#install required dependencies: +npm install -g node-gyp +sudo dnf install gcc gcc-c++`
+Once above dependencies are installed following code should just work. +
NOTE: +Make sure you are in the directory you created in step2.
+
`#Install PM2 a process manager to control Node.js applications 
+#It will help in keeping specified Node.js applications alive forever:
+npm install pm2 -g
+#Install 
+npm install --production
+#Start Ghost with pm2 and create a name for the pm2
+NODE_ENV=production pm2 start index.js --name "Ghost"
+```
+
+## Step 4: Tell Ghost your blog URL
+
+A very simple change is required to config.js file as shown below:
+
+```bash linenums="1"
+#Copy the sample config file
+cp config.example.js config.js
+nano config.js
+```
+
+File that opens will have following javascript:
+```javascript linenums="1"
+// ## Ghost Configuration
+// Setup your Ghost install for various environments.
+// Ghost runs in `development` mode by default. Full documentation can be found at https://support.ghost.org
+
+var path = require('path'),
+    config;
+
+config = {
+    // #### Production
+    // When running Ghost in the wild, use the production environment.
+    // Configure your URL and mail settings here
+    production: {
+        url: 'http://your.blog.com',
+```
+
+It's the line number 14 in above code block where you need to replace `http://your.blog.com` with actual url of your blog.
+
+## Step 5: Configure Nginx
+
+NGINX install and configuration is something I covered in my post for installing Seafile on Fedora 24. So I already had a running nginx. I just needed to create a reverse proxy for Ghost on the existing nginx server.
+
+Open the hostfile using following command:
+
+```bash
+sudo nano /etc/hosts
+```
+
+Now, in the hosts file add the localhost alias for blog - in this example it is `your.localhost.com`.
+
+```bash
+127.0.0.1  localhost.localdomain localhost your.seafile.com your.blog.com
+```
+Open the file using following command.
+
+!!! note
+    Replace `yourblog.conf` with your actual blog's conf file name.
+
+```bash
+nano /etc/nginx/conf.d/yourblog.conf
+```
+
+On the file that opens copy and paste the following code.
+!!! note
+    Replace `your.blog.com` on line number 6 below with alias for localhost for this blog you added to the host file above.
+
+```bash linenums="1"
+upstream ghost {
+server 127.0.0.1:2368;
+}
+server {
+     listen      80;
+     server_name your.blog.com;
+     access_log  /var/log/nginx/ghost.access.log;
+     error_log   /var/log/nginx/ghost.error.log;
+     proxy_buffers 16 64k;
+     proxy_buffer_size 128k;
+
+        location / {
+         proxy_pass  http://ghost;
+         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
+         proxy_redirect off;
+         proxy_set_header    Host            $host;
+         proxy_set_header    X-Real-IP       $remote_addr;
+         proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
+         proxy_set_header    X-Forwarded-Proto https;
+     }
+  }
+```
+
+## Step 6: Start Ghost and nginx
+After all the above steps are completed issue following commands to restart ghost and nginx.
+
+```bash linenums="1"
+sudo systemctl restart nginx.service
+pm2 restart Ghost
+```
+
+All Done !!!
+
diff --git a/docs/posts/2016-07-17-the-complete-walkthrough-of-my-blogger-to-ghost-migration.md b/docs/posts/2016-07-17-the-complete-walkthrough-of-my-blogger-to-ghost-migration.md
new file mode 100644
index 0000000..c86cedb
--- /dev/null
+++ b/docs/posts/2016-07-17-the-complete-walkthrough-of-my-blogger-to-ghost-migration.md
@@ -0,0 +1,229 @@
+---
+title: The complete walkthrough of my blogger to ghost migration
+slug: the-complete-walkthrough-of-my-blogger-to-ghost-migration
+date: 
+  created: 2016-07-17 22:39:07
+  updated: 2018-03-29 15:37:53
+draft: False
+description: The complete walkthrough of my blogger to ghost migration
+authors: ['ankit']
+comments: true
+---
+
+## The 7 Year Itch
+
+It can't possibly be a coincidence that this is the 7th year since I started blogging on blogger and therefore it is very likely to be a strong case of the 7 year itch syndrome but whichever way you look at it, divorce was inevitable given blogger had just stopped inspiring me.
+
+I have been fiddling with different blogging platforms while getting accused of neglecting my sweet and loving family...😢. Ghost caught my fancy three weeks back. The last post was the beginning of our courtship and this post tells the tale of how a casual fling turned into marital commitment. 😂
+
+To start a fresh blog, choosing any platform is easy and straight forward but to move from one platform to another is - umm... lets just say a very involved process - rewarding but involved.
+
+
+## Love can move mountains!!!
+
+A complete migration from blogger to WordPress would have been way simpler. I know this as I have done it in past and it appeared like moving to Ghost would require migrating to a WordPress instance anyway. There was - I must admit - a temptation to call WordPress the home but that wouldn't have made a great love-story now - would it?
+
+However, the much publicised WordPress route to Ghost migration did not work for me and eventually after a lot of manual copying, pasting, cleaning, pruning, hiding, reading and learning later, the self-hosted blog is all complete.
+
+
+
+### Install Ghost
+This is covered in my last [post](./2016-07-01-ghost-on-fedora-24.md). Once it was installed, I took some time exploring and learning Markdown.
+Last post was my first one using Markdown and it was a very pleasing experience indeed. That nice experience paved way as well as helped me finalise the decision to go the whole nine yards.
+
+### Install a theme
+There are some very beautiful themes available on [Ghost Marketplace](http://marketplace.ghost.org/themes/free/). I have used the theme called [scrawl](http://ktweeden.github.io/scrawl) and then tweaked it a bit.
+
+Once I found the theme I liked, I downloaded the zip file, unzipped it and deleted the zip file like so.
+
+```bash linenums="1"
+#Download
+curl -L https://github.com/ktweeden/scrawl/archive/master.zip -o master.zip
+#unzip
+unzip -o master.zip
+#Delete zip file
+rm master.zip
+#restart Ghost
+pm2 restart Ghost
+```
+
+Theme is now installed.
+
+### Configure the theme
+
+
    +
  1. The first thing I wanted to configure on my new theme was the code block. Prismjs is the way to go and it is already included in the theme I downloaded but the line numbering was not there. After reading a bit on PrismJS website, I understood that core css file from prism did not have this and also I wanted the dark theme so I downloaded the 'okadia' theme css along with line number plugin.
  2. +
+I then replaced the content of `/var/www/html/site-name/content/themes/scrawl-master/assets/css/prism.css` with the content in downloaded CSS. +
    +
  1. Next thing I wanted to change was the header background colour and also the link colour. While it was very close to what I wanted, my actual liking is for the colour #F2C20F and a bit darker link colour #B710EF. To do this I edited the _global_styles.scss like so:
  2. +
+ +```bash linenums="1" +#change directory +cd /var/www/html/site-name/content/themes/scrawl-master/sass/partials +/#Edit _global_styles.scss +nano _global_styles.scss +``` + +Now change the colour of $primary-colour and also add $link-colour. After this your /* Colour */ section will look as shown below: +```css title="_global_styles.scss" +/* Colours */ +$primary-colour: #F2C20F; +$secondary-colour: #254E70; +$tertiary-colour: #FF4B3E; +$font-colour: #011627; +$background-colour: #EFEFEF; +$link-colour: #B710EF; +``` + +Then I changed directory using `cd /var/www/html/site-name/content/themes/scrawl-master/assets/css` and opened `index.css` and `post.css` where I changed the background-color property to #F2C20F as shown below: + +=== index.css + + ```css + /** + MIXINS + **/ + .blog-title-background { + background-color: #F2C20F; + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + ``` +=== post.css + + ```css + /**line 86/434 (19%), col 22/29**/ + .blog-title-background { + background-color: #F2C20F; + width: 100%; } + ``` + +### Enable commenting on the blog with DISQUS + +Using DISQUS to enable comments is extremely simple especially on [scrawl](https://github.com/ktweeden/scrawl) - the theme I have used and is as explained under the DISQUS section of the theme website: + +To enable commenting: + + + +```javascript + // (1) +``` + +1. `thetestchannel` must be replaced with the name of the channel created on DISQUS. + + +### Migrate content from blogger + +Now, this was the most painful of all the things I had to do - ***the moving of mountain if you like*** - because the automated solution using [Blogger2Ghost](http://www.blogger2ghost.com/) just wouldn't work for me. So I, basically, copy pasted most of the content from blogger over to Ghost and placed the various screenshots manually. + +If my posts were in 3 digits, I would have persevered and tried contacting someone for help but as it was relatively less content, I just went ahead and did it manually and am glad I did so because that way I was able to do a bit of clean-up too. + +### Redirect Traffic from old blog + +There are a huge number of posts on www for 301 redirect and what not but I felt, it is only fair to let the redirects land on old blog and users be told there of the new destination so like last step, I manually updated the posts on blogger to just let the reader know that the post they are looking for has moved to new location and link for that post on new site. +Not most elegant and efficient approach but I am happy that way. + +!!! warning + If there are huge entries and one still has to go the manual route, it will save a lot of pain if the permanent link for new posts on Ghost is same as that on old blog and this can be achieved by clicking on clog next to "Save Draft" on the post and changing the "Post URL" + + +### Migrate comments from old blog + +Migrating comments from blogger to DISQUS is very easy. + +* I opened the blogger importing tool which can be accessed using a URL similar to this - `https://thetestchannel.disqus.com/admin/discussions/import/platform/blogger/` + +However, getting them reflected on new ghost instance has three approaches dependent on the route one takes for redirecting from old blog. As I chose no redirection as such, I had to go for a CSV mapping file between my old and new blog URL per post. + +Once again, for the number of posts I have this was not a challenge at all but I can't imagine doing such a thing for a big content transfer and it may be worth paying attention to the note in step above if one has huge content to transfer as it will reduce the pain for comments transfer. + +### Enable Search for your blog + +Ghost recommends Swifttype and the popular site [Ghost for beginners](https://www.ghostforbeginners.com/how-to-add-a-search-box-to-your-ghost-blog/) provides guidance for Google CSE (Custom Search Engine). I did not like the idea of paying for Swifttype for my small site and Google Search Engine was taking it's sweet time to crawl my site - unlike in past now we cant order / request a crawl and there was ofcourse Google Custom Search watermark which I am not all that fond of. + +!!! success + I updated the theme I am using to include search feature. + + + +### Enable Social Links< +This is, much like many other customisations I did, a very theme specific step and for the theme I have chosen it is fortunately very easy to achieve except for linkedin and google+ for which I had to add few lines of code. I achieved this using steps below: + +* Adding already available social icons is very simple and most of the social links are actually available out of the box. So for Tumblr and Instagram all I had to do was open the admin panel of Ghost, click on Code Injection link and paste the following two lines replacing `yourusername` with my username on that platform. + +```javascript linenums="1" + + +``` + +* For LinkedIn and Google+: + * Open the footer.hbs using `nano /var/www/html/site-name/content/themes/scrawl-master/partials/footer.hbs` and pasted the following code under div class footer-container around line 14. + ```html linenums="1" + + + ``` + * Then under scripts I added following code around line number 42 + ```javascript linenums="1" + + + ``` + * Finally under the function revealSocialLinks around line number 69, I pasted the following code: + ```javascript linenums="1" + revealPlatform('Linkedin'); + revealPlatform('Gplus'); + ``` + * Finally I added the following in the header part of the code injection in front end admin panel of Ghost instance; replacing yourusername with my username for the relevant platform. + ```javascript linenums="1" + + + ``` + + +## My Learning Curve + +While there were many insights and learnings, the top 5 I think on the list of learning for me while migrating from blogger to ghost are: + +
    +
  1. +Clarity on using Nginx (refer last post.) - Never before have I played around with nginx but having read so many good things about it, I was keen to try and I can say it is indeed living up to all the praise I have read. It is fast and lightweight. Will I use it for production? Ofcourse I will. Will I favour it over Apache - hmm...Maybe... Maybe not. I think I will weigh my options based on what is it I want to achieve but to know about both nginx as well as Apache Server can't hurt. +
  2. +
  3. +Better Idea of Networking Concepts - With Seafile and Ghost implementation in succession, I actually learnt about quite a few concepts on configuring firewall, DNS, reverse proxy, port forwarding to list a few but more importantly I read a lot about networking and this helped me understand the core concepts involved. +
  4. +
  5. +Deeper understanding of Web Technologies and inner workings of Ghost - While trying to modify my blog's look and feel to my liking, I had to mess around with CSS, HTML. I have used the theme scrawl by ktweeden and modified it a bit. What attracted me most to it was the fact that it used a default colour theme similar to what I had in mind. I modified it but in doing so got a bit more understanding of how it all ties together - the default.hbs, index.hbs, post.hbs and the underlying handlebar scripts. +
  6. +
  7. +Markdown - I had some basic idea before I started using Ghost but if I were to use Ghost full-time, I needed to know all there is to know about markdown and while there isn't a lot - it is damn straight forward and simple - it is a very good tool indeed. I am glad I learnt it. +
  8. +
  9. +CSS plugins - Prismjs comes pre-loaded with scrawl theme but the default skin and plugins were not enough for me so I had to replace these. Now this might be very simple for people in the know. For me, it was new and exciting and end result was so cool with numbers in code box and all that. I am obviously very happy with the end result and it did help me learn yet again how things interact within the Ghost platform. +
  10. +
+ + +## The Beginning !!! 😍😃😂 diff --git a/docs/posts/2016-07-19-mysql-function-to-calculate-elapsed-working-time.md b/docs/posts/2016-07-19-mysql-function-to-calculate-elapsed-working-time.md new file mode 100644 index 0000000..366327e --- /dev/null +++ b/docs/posts/2016-07-19-mysql-function-to-calculate-elapsed-working-time.md @@ -0,0 +1,219 @@ +--- +title: MySQL function to calculate elapsed working time +slug: mysql-function-to-calculate-elapsed-working-time +date: + created: 2016-07-19 16:25:30 + updated: 2018-03-29 15:37:53 +draft: False +description: MySQL function to calculate elapsed working time +authors: ['ankit'] +comments: true +--- + +I wrote this function to cater for a [specific requirement](#problem-statement) and I don't know if there are better ways of doing it but this saved tremendous amount of time and might have real time application elsewhere. + +## Problem Statement: + +Find out the age of an incident in working minutes, given the following: + +1. Time and Date of when an incident was logged +2. Time and date of when the same incident was closed +3. Opening time of the site for which the incident was logged +4. Closing Time of the site for which incident was logged +5. Country of the site for which incident has been logged + +!!! question "Assumption" + It is assumed that opening and closing times are same on all working days and that all the sites are closed on holidays and weekends + +Function should take all the above five "given" as parameter and then calculate age of the incident. + + + +### Example of problem + +Let's say an incident was logged on "Friday 10th June 2016 at 12:00" for a site in the "UK" which opens between 09:00 to 16:00. This incident was then closed on "Tuesday 14th June 2016 at 14:00". + +For the above incident function should calculate the age as 960 minutes = 16 hours = [4 hours on Friday (12:00 to 16:00) + 7 hours on Monday (09:00 to 16:00) + 5 hours on Tuesday (09:00 to 14:00)] + +![home_image](../assets/images/2018/01/Workday-Time-Diff-mono.svg) +/// caption +Flowchart for function +/// + +## Pre-requisites: + +A holiday table for the "Country" of the site for which incident is being provided should already be created on the database with the name `holiday_table`. Created using code below: + +```sql linenums="1" +CREATE TABLE `holiday_table` ( + `holiday_table_id` INT(11) NOT NULL, + `holiday_date` DATETIME NULL DEFAULT NULL, + `week_day` VARCHAR(12) NULL DEFAULT NULL, + `holiday_name` VARCHAR(45) NULL DEFAULT NULL, + `Country_codes` VARCHAR(45) NOT NULL DEFAULT 'ALL', + PRIMARY KEY (`holiday_table_id`) +) +COLLATE='utf8_general_ci' +ENGINE=InnoDB +; +``` + +Sample sql-insert Data for holiday_table: + +```sql linenums="1" +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (2, '2016-03-25 00:00:00', 'Friday', 'Good Friday', 'ALL'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (3, '2016-03-28 00:00:00', 'Monday', 'Easter Monday', 'ALL'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (4, '2016-05-02 00:00:00', 'Monday', 'Early May bank holiday', 'ALL'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (5, '2016-05-30 00:00:00', 'Monday', 'Spring bank holiday', 'ALL'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (6, '2016-08-29 00:00:00', 'Monday', 'Summer bank holiday', 'ALL'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (7, '2016-12-26 00:00:00', 'Monday', 'Boxing Day', 'ALL'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (8, '2016-12-27 00:00:00', 'Tuesday', 'Christmas Day (substitute day)', 'ALL'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (9, '2016-01-01 00:00:00', 'Friday', 'New Year’s Day', 'SG'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (10, '2016-02-08 00:00:00', 'Monday', 'Chinese New Year', 'SG'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (11, '2016-02-09 00:00:00', 'Tuesday', 'Chinese New Year', 'SG'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (12, '2016-05-21 00:00:00', 'Saturday', 'Vesak Day', 'SG'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (13, '2016-07-06 00:00:00', 'Wednesday', 'Hari Raya Puasa', 'SG'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (14, '2016-08-09 00:00:00', 'Tuesday', 'National Day', 'SG'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (15, '2016-09-12 00:00:00', 'Monday', 'Hari Raya Haji', 'SG'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (16, '2016-10-29 00:00:00', 'Saturday', 'Deepavali', 'SG'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (17, '2016-01-01 00:00:00', 'Friday', 'New Year’s Day', 'IN'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (18, '2016-01-26 00:00:00', 'Tuesday', 'Republic Day', 'IN'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (19, '2016-07-06 00:00:00', 'Wednesday', 'Idul Fitr', 'IN'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (20, '2016-08-15 00:00:00', 'Monday', 'Independence Day', 'IN'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (21, '2016-10-11 00:00:00', 'Tuesday', 'Dussehra/Durga Puja', 'IN'); +INSERT INTO `holiday_table` (`holiday_table_id`, `holiday_date`, `week_day`, `holiday_name`, `Country_codes`) VALUES (22, '2016-10-31 00:00:00', 'Monday', 'Diwali Privilege Holiday/Gobardhan Puja', 'IN'); +``` + +## Function code and explanation + +```sql linenums="1" +CREATE DEFINER=`root`@`localhost` FUNCTION `workday_time_diff_holiday_table`( +`param_country` varchar(10), +`assigneddatetime` varchar(20), +`closeddatetime` varchar(20), +`starttime` varchar(20), +`endtime` varchar(20) +) + RETURNS int(11) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + SQL SECURITY DEFINER + COMMENT '' +BEGIN +Set @starttime = starttime; +Set @endtime = endtime; +Select time_to_sec(timediff(@endtime,@starttime))/3600 into @maxhoursaday; +Set @assigneddate = assigneddatetime; +Set @closeddate = closeddatetime; +Set @timecount = 0; +Set @timevar1 = @assigneddate; +Set @nextdate = @assigneddate; +Set @timevar2 = null; +Set @param_country = param_country; +############# +/*Check if the assigned time was before the starttime +or closed time was after the endtime provided*/ +############# +Set @checkstart = null; +Set @checkend = null; +Select CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1), ' ',@starttime), +CONCAT(SUBSTRING_INDEX(@closeddate, ' ', 1), ' ',@endtime) into @checkstart, @checkend; + +if (@assigneddate > @checkstart) then + if (@closeddate<@checkend) then + Set @assigneddate = @assigneddate; + Set @closeddate = @closeddate; + else + Set @assigneddate = @assigneddate; + Set @closeddate = @checkend; + end if; + else + if (@closeddate<@checkend) then + SET @assigneddate = @checkstart; + Set @closeddate = @closeddate; + else + SET @assigneddate = @checkstart; + Set @closeddate = @checkend; + end if; + end if; + +/*After above check, the assigneddate and closeddate +variables will be reset in accordance with the checks.*/ + +SELECT DATEDIFF(@closeddate, @assigneddate) INTO @fixcount; -- check the difference between assigned date and closed date. +Set @count = @fixcount; -- allocate the difference between closed date and assigned date to a counter +If @fixcount > 0 then -- true if line 57 resulted in more than 1 then run the while loop on next line + while @count>=0 do -- run the while loop until the count which is right now difference between closed and assigned becomes zero + select weekday(@nextdate) into @weekday; -- Assign the weekday value to @weekday. Weekday returns 0 for Monday, 2 for Tuesday ...5 for Saturday and 6 for Sunday + +/*Check if the date stored in nextdate +(which is assigneddate on first run of while loop and closeddate on last run) +is a holiday and set the holiday flag*/ + Select sum(if(date_format(holiday_date,'%Y-%m-%d') = substring_index(@nextdate,' ',1),1,0)) + from holiday_table + where Country_codes = 'ALL' or instr(Country_codes,@param_country)>0 + into @holidayflag; + if ( @weekday<5 and @holidayflag=0) then #Proceed if the date in nextdate variable is neither weekend nor a holiday + if (@count = @fixcount) then #Check if it is first run.ie. if nextdate is assigneddate + Set @timevar1 = @assigneddate; #assign assigndate to variable timevar1 + SELECT CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1), ' ',@endtime) INTO @timevar2;#get site closing time on assigned date and store it on to timevar2 + elseif (@count = 0) then #if the date in nextdate variable is closeddate then do the following otherwise proceed + Select concat(substring_index(@closeddate,' ',1),' ',@starttime) into @timevar1; ## + Set @timevar2 = @closeddate; + else + Select concat(@nextdate,' ',@starttime) into @timevar1; + SELECT CONCAT(@nextdate, ' ', @endtime) INTO @timevar2; + end if; + SELECT + LEAST(Greatest(((TIME_TO_SEC(TIMEDIFF(@timevar2, @timevar1))) / 3600),0),@maxhoursaday) + INTO @timecounttemp; + + Set @timecount = @timecounttemp + @timecount; + end if; + Set @timevar1 = @nextdate; + SELECT + ADDDATE(SUBSTRING_INDEX(@timevar1, ' ', 1),1) + INTO @nextdate; + Set @count = @count - 1; + end while; +else + #check if the assigned date / closed date is a holiday or weekend + select weekday(@assigneddate) into @weekday; ## Assign the weekday value to @weekday. Weekday returns o for Monday, 2 for Tuesday ...5 for Saturday and 6 for Sunday + Select sum(if(date_format(holiday_date,'%Y-%m-%d') = substring_index(@assigneddate,' ',1),1,0)) from holiday_table where Country_codes = 'ALL' or instr(Country_codes,@param_country)>0 into @holidayflag; #Check if the date stored in assigneddate is a holiday and set the holiday flag + if ( @weekday<5 and @holidayflag=0) then #Proceed if the date in assigneddate variable is neither weekend nor a holiday + SELECT Least(Greatest(((TIME_TO_SEC(TIMEDIFF(@closeddate, @assigneddate))) / 3600),0),@maxhoursaday) INTO @timecount; + else Set @timecount = 0; + end if; +end if; +RETURN @timecount*60; +END +``` + +## Calling the function + +Function will expect 5 parameters and with specific format as explained below: + +- param_country - This is the country code as specified in holiday table +- assigneddatetime - This must be provided in the format `%Y-%m-%d %H-%i-%s`. So for our example it will be **2016-06-10 12:00:00** +- closeddatetime - This must be provided in the format `%Y-%m-%d %H-%i-%s`. So for our example it will be **2016-06-14 14:00:00** +- starttime - This must be in the format `%H:%i`. So for our example it will be **09:00** +- endtime - This must be in the format `%H:%i`. So for our example it will be **16:00** + +The call for this function will be as below: + +```sql linenums="1" +-- To get number of minutes +Select `WORKDAY_TIME_DIFF_HOLIDAY_TABLE`('UK','2016-06-10 12:00:00','2016-06-14 14:00:00','09:00','16:00'); + +-- To get number of hours +Select `WORKDAY_TIME_DIFF_HOLIDAY_TABLE`('UK','2016-06-10 12:00:00','2016-06-14 14:00:00','09:00','16:00')/60; + +-- To get in number of working days +Select (`WORKDAY_TIME_DIFF_HOLIDAY_TABLE`('UK','2016-06-10 12:00:00','2016-06-14 14:00:00','09:00','16:00')/60)/(substring_index('16:00',':',1)-substring_index('09:00',':',1)); +``` + +## Complete Flowchart +The plantuml code for this can be checked by copying the image link and decoding it on [Plantuml Online Server](http://www.plantuml.com/plantuml) + + \ No newline at end of file diff --git a/docs/posts/2016-07-20-ddclient-on-fedora-2.md b/docs/posts/2016-07-20-ddclient-on-fedora-2.md new file mode 100644 index 0000000..0cdc1e0 --- /dev/null +++ b/docs/posts/2016-07-20-ddclient-on-fedora-2.md @@ -0,0 +1,145 @@ +--- +title: DDCLIENT set-up on Fedora for Namecheap +slug: ddclient-on-fedora-2 +date: + created: 2016-07-20 16:11:45 + updated: 2016-07-20 16:11:45 +draft: False +description: DDCLIENT set-up on Fedora for Namecheap +authors: ['ankit'] +comments: true +--- + +## Configure Namecheap + +Follow the Namecheap guide [here](https://www.namecheap.com/support/knowledgebase/article.aspx/43/11/how-do-i-set-up-a-host-for-dynamic-dns) + +!!! site-tip "Tip" + For a subdomain "oxygen.copper.com", just replace @ with "oxygen" + + + +## Set-up DDCLIENT + +```bash linenums="1" +#Install DDCLIENT on Fedora +sudo dnf install ddclient +#Edit the configuration file to update IP on your Dynamic DNS host +sudo nano /etc/ddclient/ddclient.conf +``` + +Press ++ctrl+w++ and type the name of host for your Dynamic DNS. Mine is with Namecheap and I needed to configure for the subdomain hence following config reflects how to do it for [Namecheap guidance](https://www.namecheap.com/support/knowledgebase/article.aspx/583/11/how-do-i-configure-ddclient/). For other hosts, you will need to refer their documentation. + +```bash linenums="1" +### NameCheap (namecheap.com) +use=web, web=dynamicdns.park-your-domain.com/getip +protocol=namecheap +server=dynamicdns.park-your-domain.com +login=copper.com +password= your ddns password # (1) +oxygen +## myhost.namecheap.com +``` + +1. Copy the password from namecheap advanced DNS section + +--- +![image](../assets/images/2016/07/advanced-dns-3-6-2016-171.png) + +The password to be provided above is what you will find on namecheap dashboard (Ref. Screenshot above). + +* Log in to the namecheap account. +* Go to Advanced DNS +* Scroll down to Dynamic DNS section +* Copy the password +* Paste in ddclient config file + +--- + +## Test DDCLIENT + +Before we schedule ddclient to run at boot, we need to test if it has been configured properly and is able to communicate with Namecheap by `sudo ddclient -daemon=0 -debug -verbose -noquiet`. If it is configured properly, you will see a message similar to this as part of the final output. + +```bash +SUCCESS: updating oxygen: good: IP address set to 92.117.273.56 +``` + +!!! important + If it is not what you see, and more importantly, if you do not see last line as "Success", then there is something wrong with configuration and you must correct it before proceeding. + +If this test worked, we are ready to update the DDCLIENT service. + +## Set up DDCLIENT to run at start-up + +When we install ddclient using `dnf`, a `ddclient.service` file is automatically created in the location `/etc/systemd/system/ddclient.service` with following content. + +```bash linenums="1" title="/etc/systemd/system/ddclient.service" +[Unit] +Description=A Perl Client Used To Update Dynamic DNS +After=syslog.target network.target nss-lookup.target + +[Service] +User=ddclient +Group=ddclient +Type=forking +PIDFile=/var/run/ddclient/ddclient.pid +EnvironmentFile=-/etc/sysconfig/ddclient +ExecStartPre=/bin/touch /var/cache/ddclient/ddclient.cache +ExecStart=/usr/sbin/ddclient $DDCLIENT_OPTIONS + +[Install] +WantedBy=multi-user.target +``` + +We will enable and start this service by issuing following commands: + +```bash linenums="1" +sudo systemctl enable ddclient.service +sudo systemctl start ddclient.service +``` + +One would think that enabling and starting this service is all you need to do but that is not usually the case. I was getting following error: + +!!! failure "Error" + /bin/touch: cannot touch `/var/cache/ddclient/ddclient.cache': Permission denied + +So if `sudo systemctl start ddclient` results in above error, you may need to do the following: + +```bash linenums="1" +#Go Root +su +#Create a directory for ddclient +mkdir /var/run/ddclient +#Chown the various directories for ddclient as user +chown ddclient:ddclient /etc/ddclient.conf +chown ddclient:ddclient /var/run/ddclient/ +#change directory +cd /var/run/ddclient +#delete ddclient.cache if it exists +rm ddclient.cache +#change directory +cd /etc/sysconfig +#delete ddclients.cache +rm ddclients.cache +#create a blank ddclient.cache +nano /var/run/ddclient/ddclient.cache +#chown it for ddclient user +chown ddclient:ddclient /var/run/ddclient/ddclient.cache +#exit root +exit +#enable and start ddclient service +sudo systemctl enable ddclient.service +sudo systemctl start ddclient.service +``` + +Done. :partying_face: + +## Known Issue with DDCLIENT + +There is a known issue and I can confirm that I have seen on my logfile as recently as today. + +!!! failure "Error" + WARNING: cannot connect to dynamicdns.park-your-domain.com:80 socket: IO::Socket::INET: Bad hostname 'dynamicdns.park-your-domain.com' + +It isn't major but it is there and restarting the service by issuing the command `sudo systemctl restart ddclient.service` fixes the problem. + \ No newline at end of file diff --git a/docs/posts/2016-07-25-tomcat-on-fedora-behind-nginx.md b/docs/posts/2016-07-25-tomcat-on-fedora-behind-nginx.md new file mode 100644 index 0000000..7286d6e --- /dev/null +++ b/docs/posts/2016-07-25-tomcat-on-fedora-behind-nginx.md @@ -0,0 +1,185 @@ +--- +title: Tomcat 8.5.4 on Fedora behind Nginx +slug: tomcat-on-fedora-behind-nginx +date: + created: 2016-07-25 17:52:00 + updated: 2016-07-25 17:52:00 +draft: False +description: Tomcat 8.5.4 on Fedora behind Nginx +authors: ['ankit'] +comments: true +--- + +## Install Oracle Java + +```bash linenums="1" +#install jdk +wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u102-b14/jdk-8u102-linux-i586.rpm" +#install jre +wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http://www.oracle.com/ oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u102-b14/jre-8u102-linux-i586.rpm" +#enable firefox plugin +alternatives --install /usr/lib/mozilla/plugins/libjavaplugin.so libjavaplugin.so /usr/java/jdk1.8.0_102/jre/lib/i386/libnpjp2.so 20000 +``` + +!!! site-tip "Tip" + URL for JDK and JRE is best obtained directly from [oracle website](http://www.oracle.com/technetwork/java/javase/downloads/index.html) + + + +## Download Tomcat + +```bash linenums="1" +su +mkdir /opt/tomcat/ && cd /opt/tomcat +wget http://mirror.ox.ac.uk/sites/rsync.apache.org/tomcat/tomcat-8/v8.5.4/bin/apache-tomcat-8.5.4.zip +wget https://www.apache.org/dist/tomcat/tomcat-8/v8.5.4/bin/apache-tomcat-8.5.4.zip.md5 +``` + +## Check MD5 + +```bash linenums="1" +cat apache-tomcat-8.5.4.zip.md5 +md5sum apache-tomcat-8.5.4.zip +unzip apache-tomcat-8.5.4.zip +``` + +## Create a TOMCAT Group and User then grant access + +```bash linenums="1" +groupadd tomcat +useradd -M -s /bin/nologin -g tomcat -d /opt/tomcat tomcat +cd /opt/tomcat +chgrp -R tomcat conf +chmod g+rwx conf +chmod g+r conf/* +chown -R tomcat bin/ webapps/ work/ temp/ logs/ +``` + +## Create Service for Tomcat + +```bash +nano /etc/systemd/system/tomcat.service +``` + +```bash linenums="1" title="/etc/systemd/system/tomcat.service" +## Systemd unit file for tomcat +[Unit] +Description=Apache Tomcat Web Application Container +After=syslog.target network.target + +[Service] +Type=forking + +ExecStart=/opt/tomcat/apache-tomcat-8.5.4/bin/startup.sh +ExecStop=/opt/tomcat/apache-tomcat-8.5.4/bin/shutdown.sh + +User=tomcat +Group=tomcat + +[Install] +WantedBy=multi-user.target + +``` + +```bash linenums="1" +systemctl start tomcat.service +systemctl enable tomcat.service +``` + +## Alternative start and stop + +```bash linenums="1" +cd apache-tomcat-8.5.4/bin +chmod 700 /opt/tomcat/apache-tomcat-8.5.4/bin/*.sh +ln -s /opt/tomcat/apache-tomcat-8.5.4/bin/startup.sh /usr/bin/tomcatup +ln -s /opt/tomcat/apache-tomcat-8.5.4/bin/shutdown.sh /usr/bin/tomcatdown +tomcatup +tomcatdown +``` + +## Change port + +```bash +nano /opt/tomcat/apache-tomcat-8.5.4/conf/server.xml +``` + +Around line 69 is the connector tag where the `port=8080` is specified. For this example lets change it to 8081. After change the connector tag in server.xml will look as below: + +```xml linenums="1" title="/opt/tomcat/apache-tomcat-8.5.4/conf/server.xml" +; +``` + +## Add tomcat Users + +Open tomcat-users.xml and add new users before tag + +```bash +nano /opt/tomcat/apache-tomcat-8.5.4/conf/tomcat-users.xml +``` +sample user: +```xml linenums="1" title="/opt/tomcat/apache-tomcat-8.5.4/conf/tomcat-users.xml" +
+
+
+ +``` + +## Test + +```bash linenums="1" +touch /opt/tomcat/apache-tomcat-8.5.4/webapps/ROOT/testankit.jsp +nano /opt/tomcat/apache-tomcat-8.5.4/webapps/ROOT/testankit.jsp +#restart tomcat +systemctl restart tomcat.service +``` + +Open the browser and enter [http://localhost:8080](http://localhost:8080) (or whatever port you have configured Tomcat on.) + +## Configure Nginx Reverse Proxy for Tomcat + +* Configure the dynamic DNS. Steps will be as per my [previous post](./2016-07-20-ddclient-on-fedora-2.md). For purpose of this step I will be assuming you created a DDNS named `tomcat.yoursite.com` + +* Update `/etc/hosts` to include `tomcat.yoursite.com` + + ```bash linenums="1" title="/etc/hosts" + sudo nano /etc/hosts + #Make an entry in your hosts + 127.0.0.1 localhost.localdomain localhost your.seafile.com your.blog.com tomcat.yoursite.com + ``` + +* Now create nginx conf file using `sudo nano /etc/nginx/conf.d/tomcat.conf` as shown below: + +```bash linenums="1" title="/etc/nginx/conf.d/tomcat.conf" +upstream tomcat { +server 127.0.0.1:8081; +} + +server { + listen 80; + server_name tomcat.yoursite.com; + access_log /var/log/nginx/tomcat.access.log; + error_log /var/log/nginx/tomcat.error.log; + proxy_buffers 16 64k; + proxy_buffer_size 128k; + + location / { + proxy_pass http://tomcat; + proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; + proxy_redirect off; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto https; + } + } +``` + +* Finally reload and restart services + + ```bash linenums="1" + sudo systemctl daemon-reload + sudo systemctl start nginx.service + sudo systemctl start tomcat.service + ``` diff --git a/docs/posts/2016-07-28-update-ghost-on-fedora.md b/docs/posts/2016-07-28-update-ghost-on-fedora.md new file mode 100644 index 0000000..cfe9742 --- /dev/null +++ b/docs/posts/2016-07-28-update-ghost-on-fedora.md @@ -0,0 +1,72 @@ +--- +title: Update Ghost on Fedora +slug: update-ghost-on-fedora +date: + created: 2016-07-28 17:45:00 + updated: 2016-07-28 22:37:53 +draft: False +description: Update Ghost on Fedora +authors: ['ankit'] +comments: true +--- + +While the guidance on [Ghost website](http://support.ghost.org/how-to-upgrade/#command-guide) is very clear, I did get issues that required steps in troubleshooting. Something to do with lodash and npm version 2 stuff (node_modules/knex requires lodash@'^3.7.0') that I read on one of the [forums](https://github.com/tgriesser/bookshelf/issues/1264) specifically the comment from ErisDS on 13/06. + + + +Anyway, reading this I deleted node_modules followed by `npm install` and it worked. All commands in order as I did are listed below. If my previous posts were used to create the blog nothing here will require sudo or root privileges. +As before all this was done on Fedora 24 Linux OS and following commands will need to be changed where it mentions yoursite and username. If the path is different then obviously entire path needs to be replaced. + +```bash linenums="1" +#Copy the entire site as backup. It will be a verbose copy an all access rights will be preserved. +cp -avr /var/www/html/yoursite /home// + +#Now in the site directory create a directory ghostlatest +mkdir /var/www/html/yoursite/ghostlatest + +#change directory to ghostlatest +cd /var/www/html/yoursite/ghostlatest + +#now download the latest ghost zip file +curl -LOk https://ghost.org/zip/ghost-latest.zip + +#unzip the downloaded file +unzip ghost-latest.zip + +#Stop your Ghost instance (assuming Ghost is the alias +#created as per my previous post else replace with +#whatever alias was used with pm2). +pm2 stop Ghost + +#Change directory and delete old folders and files +cd /var/www/html/yoursite +rm -rf core +rm -rf index.js +rm -rf *.md +rm -rf *.json +rm -rf /var/www/html/yoursite/content/themes/casper + +#Remove node_modules because anyway the lodash issue will hit later on. +rm -rf node_modules + +#Copy from ghost latest to site directory new folders +cp -avr /var/www/html/yoursite/ghostlatest/core /var/www/html/yoursite +cp -avr /var/www/html/yoursite/ghostlatest/index.js /var/www/html/yoursite +cp -avr /var/www/html/yoursite/ghostlatest/*.md /var/www/html/yoursite +cp -avr /var/www/html/yoursite/ghostlatest/*.json /var/www/html/yoursite + +#Optional if you haven't made customisation to default theme. +cp -avr /var/www/html/yoursite/ghostlatest/content/themes/casper /var/www/html/yoursite/content/themes + +#Install Latest Version +npm cache clean +npm update +npm install --production + +#Start to update dependencies +npm start --production + +#Once above command is complete, stop the server and restart using pm2 +Ctrl+C +pm2 start Ghost +``` diff --git a/docs/posts/2016-07-31-fix-for-php-issues-after-upgrade-to-ubuntu-16-04-1-xenial.md b/docs/posts/2016-07-31-fix-for-php-issues-after-upgrade-to-ubuntu-16-04-1-xenial.md new file mode 100644 index 0000000..f437a21 --- /dev/null +++ b/docs/posts/2016-07-31-fix-for-php-issues-after-upgrade-to-ubuntu-16-04-1-xenial.md @@ -0,0 +1,55 @@ +--- +title: Fix for PHP Issues after upgrade to Ubuntu 16.04.1 (Xenial) +slug: fix-for-php-issues-after-upgrade-to-ubuntu-16-04-1-xenial +date: + created: 2016-07-31 22:08:35 + updated: 2018-03-29 15:37:53 +draft: False +description: Fix for PHP Issues after upgrade to Ubuntu 16.04.1 (Xenial) +authors: ['ankit'] +comments: true +--- +After updating from Ubuntu 14.04, the php and Apache stopped being friends and one of the WordPress site I maintain went all white and admin page was just showing php code. +This is apparently because of a known issue in 16.04 with upgrade to php7 as shown on the ubuntu forum [here](http://askubuntu.com/questions/756181/installing-php-5-6-on-xenial-16-04). + +Using the guidance from this link and with some more of [duckduckgo](https://duckduckgo.com/) search later, I managed to resolve the problem thus: + + + +```bash linenums="1" +#1. Install aptitude if it is not already installed using +sudo apt-get install aptitude + +#2. Removed php7 and unwanted php using +sudo aptitude purge `dpkg -l | grep php| awk '{print $2}' |tr '\n' ' '` + +#3. Added old repo using +sudo add-apt-repository ppa:ondrej/php + +#4. Updated repo +sudo apt-get update + +#5. Installed php5.6 +sudo apt-get install php5.6 +sudo apt-get install php5.6-mbstring php5.6-mcrypt php5.6-mysql php5.6-xml php5.6-curl php5.6-gd php5.6-zip + +#6. Checked php version +sudo php -v + +#7. Enabled mod_php +sudo a2enmod php5 +Ignored error message + +#8. Opened php5.6 conf +sudo nano /etc/apache2/mods-enabled/php5.6.conf + +#9. Commented following lines + + + php_admin_flag engine Off + + + +#10. Restarted the server +sudo service apache2 restart +``` diff --git a/docs/posts/2016-08-12-ethercalc.md b/docs/posts/2016-08-12-ethercalc.md new file mode 100644 index 0000000..f8a9756 --- /dev/null +++ b/docs/posts/2016-08-12-ethercalc.md @@ -0,0 +1,54 @@ +--- +title: Ethercalc +slug: ethercalc +date: + created: 2016-08-12 13:06:00 + updated: 2016-08-12 15:37:53 +draft: False +description: Ethercalc +authors: ['ankit'] +comments: true +--- + +Ethercalc is good tool which can be selfhosted. It is fairly simple to do so. Though it will be available for anyone who has the URL because there is no inbuilt login mechanism. + + + +I did not dig into making it accessible with a login interface as I lost interest after I made it work on my server and played around a bit with it but it was simply because I got interested in other things and not because the tool isn't fascinating enough. I am fairly certain this will not be overly complicated but for a simple selfhosted spreadsheet solution this is definitely worth playing around with. + +The steps I took are as below: + +```bash linenums="1" +#Ethercalc plays well wth redis as per their documentation. So Install and start 'redis' +sudo dnf install redis +sudo systemctl start redis.service + +#Test if 'redis' is working +redis-cli ping + +#Enable redis to automatically start at the time of system start-up +sudo systemctl enable redis.service + +#check if it runs +ethercalc +#Press Ctrl+C to exit + +#To run it forever use pm2 +pm2 start ethercalc +npm list -g --depth=0 + +#Change port to whichever port you want Ethercalc to run on by opening app.js +#and changing port. +nano /home/<yourusername>/.npm-global/lib/node_modules/ethercalc/app.js +#change port and save + +#run with pm2 and alias as Ecalc +pm2 start ethercalc --name 'Ecalc' + +#check logs using pm2 +pm2 logs Ecalc + +#Reverse proxy Ethercalc using nginx +sudo nano /etc/nginx/conf.d/ecalc.conf +sudo systemctl restart nginx.service +``` diff --git a/docs/posts/2016-09-05-the-pain-of-using-windows.md b/docs/posts/2016-09-05-the-pain-of-using-windows.md new file mode 100644 index 0000000..ed8a2c7 --- /dev/null +++ b/docs/posts/2016-09-05-the-pain-of-using-windows.md @@ -0,0 +1,43 @@ +--- +title: Windows 10 - a bucket load of pain +slug: the-pain-of-using-windows +date: + created: 2016-09-05 10:53:49 + updated: 2016-09-05 15:37:53 +draft: False +description: Windows 10 - a bucket load of pain +authors: ['ankit'] +comments: true +--- + +> As Windows 10 is a commercial offering, one would think it will be working as expected and it does so long as like me one has come to expect pain from Microsoft in general and Windows in particular - because pain is what you get when you use Windows 10. + + + +When we work in office environment we are not as heavily exposed to the pain that accompanies Windows usage, mainly because everything is configured and dealt with through a central desktop provisioning team and there is usually a dedicated IT Help-desk in a big corporate. + +However, using Windows at home is not as smooth a sailing (I am really being liberal with usage of word smooth) and if you don't trust me just try searching for issues that accompany upgrade to windows 10 and look at the range of issues. + +Now I, ofcourse, don't blindly believe these search based opinions and have my own take based on my very own personal trauma. The story goes like so: + + +>Why - one may ask - do I even bother with windows at home if it is so painful? This is because as much as my daughter loves the penguin, the windows is what her teacher uses and so she does need to be aware of the necessary evil. + + +So, there is this laptop I have which is exclusively for Windows and is only ever used by my daughter for her schoolwork. It isn't some cheap stuff but a state of the art touch screen detachable monitor kinda laptop from HP with intel core i5 inside. + +However, as it is a detachable tablet, it has two HDD - 50 GB for monitor and 500 GB on keyboard that acts as extended memory. + +Now, it originally came with Windows 8 and then came Windows 10 followed by Windows 10 anniversary edition. When I upgraded from Windows 8 to Windows 10, I suddenly found that the whole of 50 gig was fully utilised making it impossible to do anything at all. + +Now a quick duckduckgo search later it was as simple as removing the 'previous installs' which windows itself removes after a month or so they say. + +In my case the self-removal-a-month-later thing just did not happen and disk clean did not help either so I was basically left with no choice but to reformat the whole damn thing. + +This as I recollected from my old days with windows is quite a long process with lots of downloads and waits...and boy has that continued to be the same... Microsoft is nothing if not consistent. Finally after several hours of ordeal, the system was refreshed and my storage space reclaimed and a semi-functional laptop was there or thereabouts. + +I say semi-functional because unlike on Linux not all drivers are there and you have to individually download the drivers from HP website, install and then keep your fingers and toes crossed while you hope it works...finally sound was sorted but WiFi is still flaky. + +Now compare this to the seamless upgrade from one major version of Fedora 23 to Fedora 24...it did take a while to download and install but the actual effort involved was typing 4 lines on the terminal - that's it. When I logged into Fedora 24 upgraded machine, everything just worked as before - no driver issues, no WiFi problems, nothing. + +RANT OVER \ No newline at end of file diff --git a/docs/posts/2016-10-04-grav-cms-with-a-difference.md b/docs/posts/2016-10-04-grav-cms-with-a-difference.md new file mode 100644 index 0000000..c908982 --- /dev/null +++ b/docs/posts/2016-10-04-grav-cms-with-a-difference.md @@ -0,0 +1,78 @@ +--- +title: Grav - CMS with a difference +slug: grav-cms-with-a-difference +date: + created: 2016-10-04 12:09:00 + updated: 2018-03-29 15:37:53 +draft: False +description: Grav - CMS with a difference +authors: ['ankit'] +comments: true +--- + +While I love Ghost as a blogging platform, it is not best placed for things other than blogs - after all that is the basic idea behind creation of this wonderful tool. + +As I wanted to host a static website using tools that don't require a database or rely on php, I went searching on interwebs. +I came across a lot of options and the most popular one appears to be Jekyll and it's variants (Nikola and such) but they require a lot of terminal activity which won't go well for regular end user responsible for maintaining content of the static website in question.So I continued looking and came across this wonderful project called [Grav](http://getgrav.org). + +Grav is super fast, very pretty and extremely easy to deploy and maintain. Additionally, it has very good documentation. + +The key features that I absolutely loved are as below: + + + +1. Easy installation - *Easier than Ghost / Wordpress IMHO* +2. Good help and documentation +3. Responsive themes and skeletons +4. Built-in Markdown Support and then some +5. Lot of useful plugins +6. Browser based admin page +7. Active development +8. Easy upgrade and back-up + + +My steps for installation: + +* Download a [skeleton](https://getgrav.org/downloads/skeletons) you fancy +* Unzip the downloaded file into your server root and move it into a folder named grav: + + ```bash linenums="1" + sudo unzip grav-skeleton-appi-1.0.0.zip -d /var/www/html/ + cd /var/www/html/ + sudo mv grav-skeleton-appi-1.0.0/ grav/ + ``` + +* Fix permissions (replace username with your user on the server. This is important to ensure files can be modified both from browser as well as from terminal. So create a bash file by issuing command `nano fixpermissions.sh` and paste the following code in there. + + ```bash linenums="1" + ##!/bin/sh + chown <username>:www-data . + chown -R <username>:www-data * + find . -type f | xargs chmod 664 + find ./bin -type f | xargs chmod 775 + find . -type d | xargs chmod 775 + find . -type d | xargs chmod +s + umask 0002 + ``` + + +* Now make this bash file executable using `chmod a+x fixpermissions.sh` + +* Finally run the bash file from within the grav directory: + + ```bash linenums="1" + cd /var/www/html/grav/ + sudo bash //fixpermissions.sh + ``` + +* Open `<server-ip-address>/grav` from the browser and check your install is working + +* Once it is confirmed to be working, install admin plugin from terminal like so: + + ```bash linenums="1" + /bin/gpm install admin + ``` + +* Open `/grav/admin` from the browser and create your admin login details + +Working on Grav is an absolutely pleasing experience and the swift turnaround for a static website is phenomenal. Suffice to say, I hope that this project goes from strength to strength. \ No newline at end of file diff --git a/docs/posts/2016-11-23-note-7-to-oneplus-3.md b/docs/posts/2016-11-23-note-7-to-oneplus-3.md new file mode 100644 index 0000000..7ba975f --- /dev/null +++ b/docs/posts/2016-11-23-note-7-to-oneplus-3.md @@ -0,0 +1,74 @@ +--- +title: Note 7 to OnePlus 3 +slug: note-7-to-oneplus-3 +date: + created: 2016-11-23 17:25:00 + updated: 2018-03-29 15:37:53 +draft: False +description: Note 7 to OnePlus 3 +authors: ['ankit'] +comments: true +--- + +I was a super excited owner of Note 7 in September this year and then in few +days the happiness started disappearing as the news of exploding Note 7 started +appearing all over the internet. + +Then came the notice to exchange the Note 7 which I dutifully did and assured +that nothing will now go wrong I started enjoying that gem of a device. Alas, it +was not to be and the device was recalled for good. Being a user of Note devices +for so long and yet unable to continue with my old Note 3, I decided to go for +some interim device - you know until Samsung decides to get the act right and +bring the next Note device to the market. + + + +After going through a number of possible options ranging from Note 7's close +cousin Galaxy S7 edge+ all the way to newly released Pixel, I actually settled +for OnePlus 3. It was not a gamble actually as my wife is already using it and +is quite pleased with it's performance and the price is just right for this to +qualify as the interim phone. + +Anyway, so I ordered and waited because there was a good 4 week wait period. The +ordering and delivery all went as planned while in the meantime I was back with +my trusty Note 3. + +OnePlus 3 arrived and I set it up to my taste and my oh my what an experience. +Apart from Stylus it was lacking nothing and is very smooth, very light and +camera quality is very good as well - not as good as Note 7 but definitely +better than Note 3. I have now been with this device for just over a week and +although I miss the S-Pen, I am very happy with the device in general and it's +battery life in particular. + +I have listed below the things that I like and the things I hope it had: + +Features I loved :heart: : + + 1. Battery life + 2. Superfast Charging with Dash Charger + 3. Display and inbuilt Night mode + 4. Ringer Switch + 5. Inbuilt Colour control for LED Notification + 6. Smooth minimal interface + 7. No bloatware + 8. Fingerprint Scanner doubles as Home button + 9. Gesture support for flash light + 10. Ability to swap Capacitive button functionality + 11. Dual Sim Card capability - Allows me to carry one phone for both work and personal numbers. + +Sure all of the above can be pretty similar on all high end handsets but what +makes it unique for OnePlus 3 is the price point of £329. That price is +unbeatable and the phone, in my humble opinion, must be the first choice for +anyone who isn't fussed about a stylus. + +There can be a comparison between camera results where Samsung outperforms in my +experience but only slightly and still the photo quality from OnePlus 3 is +definitely very good second only to Samsung and no other. + +Wishlist :woman_in_santa_hat: : + +1. Functional Stylus (Frankly no other manufacturer is tapping on this market. God knows why?) +2. Note 7 had a good integration of Fingerprint Scanner with browser to login to various sites. I miss that on OnePlus 3. +3. External Memory Card slot. + +Here's hoping that OnePlus 3 team will listen to my wishlist :smile:. \ No newline at end of file diff --git a/docs/posts/2016-12-14-swap-file-to-create-extra-memory.md b/docs/posts/2016-12-14-swap-file-to-create-extra-memory.md new file mode 100644 index 0000000..c2dd11d --- /dev/null +++ b/docs/posts/2016-12-14-swap-file-to-create-extra-memory.md @@ -0,0 +1,57 @@ +--- +title: Swap File to create extra memory +slug: swap-file-to-create-extra-memory +classes: wide +date: + created: 2016-12-14 19:29:54 + updated: 2017-03-02 15:37:53 +draft: False +description: Swap File to create extra memory +authors: ['ankit'] +comments: true +--- + +While renewing my LetsEncrypt certificate, I found myself in a strange situation where the certbot won't run asking me to update pip and then each time I tried updating pip it failed with the error `error: command 'x86_64-linux-gnu-gcc' failed with exit status 4.` + +It turns out that this happens due to low memory and with my digitalocean droplet being the cheapest one this was bound to happen sooner rather than later. Fortunately there is a way around it as explained below. + +Use of following commands will ensure that the swap file is created which in turn will help avoid the 'error: command 'x86_64-linux-gnu-gcc' failed with exit status 4'. + +Following commands will create a swap file: + + + +```bash linenums="1" +sudo dd if=/dev/zero of=/swapfile1 bs=1024 count=524288 +sudo mkswap /swapfile1 +sudo chown root:root /swapfile1 +sudo chmod 0600 /swapfile1 +sudo swapon /swapfile1 +``` +The swap file will now be activated but will be gone after the reboot. It can be reactivated using the last command (I ~~hope so~~ know as I have now tried it). + +Anyway, after creating the swapfile, you will be able to upgrade pip without the aforementioned error. :smile: + +!!! abstract "Update: 02/03/2017" + I ran into memory issues yet again and I thought instead of increasing the memory for swapfile1, what if I can create another swapfile. I tried this and it works. Infact I felt quite nice uncovering a concept of multiple swapfiles purely based on my whim :wink:. All I really had to do was repeat above code replacing swapfile1 with swapfile2 and I had two swapfiles working together increasing available memory for my server. + +```bash linenums="1" +sudo dd if=/dev/zero of=/swapfile2 bs=1024 count=524288 +sudo mkswap /swapfile2 +sudo chown root:root /swapfile2 +sudo chmod 0600 /swapfile2 +sudo swapon /swapfile2 +``` + +Thing is after it worked I was a bit intrigued by the concept and read a bit more on `swapon / swapoff` and few useful commands are listed below: + +```bash linenums="1" +## To enable all swapfiles +swapon -a +## To disable all swapfiles +swapoff -a +## To see all available swapfiles +swapon -s +## To enable a particular swapfile +swapon +``` diff --git a/docs/posts/2017-02-02-dd-wrt-firmware-on-tp-link-tl-wr841n-v11.md b/docs/posts/2017-02-02-dd-wrt-firmware-on-tp-link-tl-wr841n-v11.md new file mode 100644 index 0000000..3cd3261 --- /dev/null +++ b/docs/posts/2017-02-02-dd-wrt-firmware-on-tp-link-tl-wr841n-v11.md @@ -0,0 +1,120 @@ +--- +title: DD-WRT firmware on TP-LINK TL-WR841N v11 +slug: dd-wrt-firmware-on-tp-link-tl-wr841n-v11 +date: + created: 2017-02-02 18:46:00 + updated: 2018-03-29 15:37:53 +draft: False +description: Apply Unlocked stock firmware, download all the three files from... Follow these steps... 1. Connect the power supply to the TP-Link router and switch it on. 2. Connect the ethernet cable in one of the yellow LAN slots of the router. ... +authors: ['ankit'] +comments: true +--- + +## Background + +I have been with PlusNet for over two years now and am a happy camper as far as fiber optic broadband is concerned but as I am no longer on a broadband contract with PlusNet and had no intention of going on one, so the only way I could get a change to my ageing router was by purchasing a new one. + +Hence I started reading about my options and soon enough realised that an old router can be given new lease of life using DD-WRT. Equally soon-ish I also realised that the router from PlusNet - TG582n - is quite rubbish and does not play nice with any of the open source firmwares. + +So I figured that if I have to just play around a bit, I might as well start with something cheaper and cheaper is what I found in the TP-Link router TL-WR841n at just £16.00. You can't get any cheaper than that in my opinion. OK, so now that we have established that I am cheap and my new router is cheap, let's move on to interesting stuff. + +I had read that TP-Link router and specifically TL-WR841n plays nicely with DD-WRT but it was only after I had my new toy did I realise that these things also come in hardware version and while interwebs is filled with instructions on installing DD-WRT for upto v9, when it comes to v11 in Europe, it can be a bit tricky to proceed. There are some instructions in forums[^1] but nothing that walks one end to end hence this post. + +[^1]: https://www.quora.com/Is-the-TP-Link-TL-WR841n-v11-router-supported-by-DD-WRT + + + +## Flash router with DD-WRT firmware + +There are two ways to ensure that the DD-WRT firmware gets flashed on the router: + +1. **Apply Unlocked stock firmware** - This is the one I used and to use this I downloaded the modified firmware from NeDark that he has provided in a post on the OpenWRT forum [here](https://forum.openwrt.org/viewtopic.php?id=67382) + +2. **Using TFTP server** - This is considered to be a safe approach because you do not have to use any modded version of stock firmware to apply it. However, if like me, you are anyway going to flash it with DD-WRT, I feel it's a bit of a pain that can be avoided as it involves setting up TFTP server and making your router to connect to this server can take some time and effort. It is explained [here](http://www.dd-wrt.com/phpBB2/viewtopic.php?t=304830&sid=84c147f63f0876b055b3eb7add2a8d4e) + + +Right, so assuming you want to go with the first and easier approach, first you need to download the modded firmware from NeDark. He has uploaded it on his [dropbox link](https://dl.dropboxusercontent.com/u/5038754/wr841n%28EU%29_v11_150616.bin) and I have also uploaded a copy of this firmware [here](http://www.mediafire.com/file/4ap8bde3m6trcs2/wr841n%28EU%29_v11_150616.bin). + +I recommend that you download all the three files from my folder on Mediafire[^2] using the link below but if you would much rather download directly from DD-WRT, then the links for rest of the two files that I used are also in footnote references[^3][^4]. + +[^2]: https://www.mediafire.com/folder/q56dcdecfh3v1/Router_Firmware +[^3]: http://download1.dd-wrt.com/dd-wrtv2/downloads/betas/2016/12-15-2016-r30949/tplink_tl-wr841ndv11/factory-to-ddwrt.bin +[^4]: http://download1.dd-wrt.com/dd-wrtv2/downloads/betas/2016/12-15-2016-r30949/tplink_tl-wr841ndv11/tl-wr841nd-webflash.bin + +Assuming that now you have all the three files safely downloaded to you computer we just follow the simple steps below: + + +1. Connect the power supply to the TP-Link router and switch it on. +2. Connect the ethernet cable in one of the yellow LAN slots of the router. +3. Switch-off the wifi on your computer and connect the other end of the ethernet cable to the ethernet port of your computer. +4. Once the ethernet connection on your laptop is established, open a browser and type `192.168.0.1` and press enter. +5. You will be presented with TP-LINK admin interface. +6. Login using the credentials username: `admin`; password: `admin`. +7. On left hand navigation locate and click on `System Tools` and then on expanded menu click on `Firmware Upgrade` +8. Now click on `Browse` button and select the file from NeDARK - `wr841n(EU)_v11_150616.bin` from your downloaded folder. +9. Click on `Upgrade` button. It will take roughly 30 to 40 seconds and router will reboot. +10. Refresh the browser screen and you will once again be presented with TP-LINK admin interface. +11. Once again login using the credentials username: `admin`; password: `admin`. +12. On left hand navigation locate and click on `System Tools` and then on expanded menu click on `Firmware Upgrade` +13. Now click on `Browse` button and select the file `factory-to-ddwrt.bin`. +14. Click on `Upgrade` button. It will take roughly 30 to 40 seconds and router will reboot. +15. Disconnect the ethernet cable from Laptop and reboot the laptop - This isn't always required but just to be safe. +16. Reconnect the ethernet cable to the laptop. Make sure that wifi is switched off on the laptop. +17. Once the ethernet connection on your laptop is established, open a browser and type `192.168.1.1` and press enter. <-- ***Notice the different IP than what was used in step 4***. +18. If all has gone well until now you will be greeted with DD-WRT login interface and will actually be asked to change the password. +19. After providing the password, navigate to tab Administration and then sub-tab named Firmware upgrade. +20. Click on `Browse` and this time select `tl-wr841nd-webflash.bin` and Click upgrade. This will take 40 seconds or so and your router has now been liberated. + + +This is it for flashing TP-LINK TL-WR841N v11 router with DD-WRT. I made fiber optic broadband work with no fuss but with NEST there were some issues basically down to auto setting changing to channel 13. + +## Making NEST play nice with DD-WRT +The issue was that NEST would suddenly drop internet connection and then not identify the SSID for my router. The SSID just won't appear in the list of available wireless networks. + +* *NEST apparently does not like channel 13, possibly even Channel 11 and 12. Changing the channel to any of the single digit (1 - 9) works well. +* In addition giving a static IP for NEST MAC seems to have resolved any network drops whatsoever. +* Under Wireless Setting, I also changed the Beacon Interval to 211. +* Under Administration tab > Management > IP Filter Settings, I changed the TCP timeout to 1800 and UDP timeout to 3600. + + +## Configure router for PlusNet Fiber Optic Broadband + +For configuring PlusNet fiber optic broadband, the settings I used are as below: + +### **Setup > Basic Setup** + +![Setup 1](../assets/images/2017/02/SetupBasicSetup_1.PNG) + +![Setup 2](../assets/images/2017/02/SetupBasicSetup_2.PNG) + +### **Setup > DDNS** + +![Setup 3](../assets/images/2017/02/DDNS.PNG) + +### **Wireless > Basic Settings** + +![Wireless-Basic-Settings](../assets/images/2017/02/Wireless-Basic-Settings.PNG) + +### **Wireless > Wireless Security** + +![Wireless-Wireless-Security](../assets/images/2017/02/Wireless-Wireless-Security.PNG) + +### **Administration > Management** + +![Administration-Management](../assets/images/2017/02/Administration-Management.PNG) + +### **Administration > Commands** + +Add the following in the startup commands + +```bash linenums="1" +## Fix lan port communication 841 v7, v9, v11 +swconfig dev eth0 set enable_vlan 1 +swconfig dev eth0 set apply +``` + +as shown below: + +![Administration-Command](../assets/images/2017/02/Administration-Command.PNG) + +Above basic setting ensures that PlusNet fiber optic broadband works perfectly fine. diff --git a/docs/posts/2017-02-13-markdown-and-gantt-charts.md b/docs/posts/2017-02-13-markdown-and-gantt-charts.md new file mode 100644 index 0000000..f793899 --- /dev/null +++ b/docs/posts/2017-02-13-markdown-and-gantt-charts.md @@ -0,0 +1,225 @@ +--- +title: Markdown and Gantt Charts +slug: markdown-and-gantt-charts +classes: wide +date: + created: 2017-02-13 15:55:00 + updated: 2018-03-29 15:37:53 +draft: False +description: Markdown and Gantt Charts +authors: ['ankit'] +comments: true +--- + +For a fairly long time, I have been looking for a simple markdown type of solution to be able to quickly draw Gantt charts but never came across what one would call a quick option. It has always been an involved process. + +To my simplistic mind, a simple solution would just be an option where I can type the action, a start date and an end date for the action line after line and it get's displayed in the Gantt chart. + + + +The latest edition of Linux Format (Issue 221, Page 52) had mermaid as one of the hotpicks and highlighted the availability of Gantt charts which piqued my interest, I tried the solution and it is indeed what I was looking for. There are a few rough edges but it is a working solution and in normal circumstances will save considerable time and hence will become my tool of choice. +There are few ways of using it and because it has been made to work with MarkDown syntax, it can work on a number of tools too. I found CuteMarkEd to be the easiest one to use but the various ways to use it are listed below. + +## Install CuteMarkEd + +CuteMarkEd is not available in debian repositories nor does it have a binary for debian. Although it does have an rpm binary. As I have been playing with Debian / Ubuntu based Elementary OS lately, instead of my regular Fedora install, I figured might as well compile from source code. Steps are as below and are also available on the [github page for CuteMarkEd](https://github.com/cloose/CuteMarkEd/wiki/Build-Instructions#ubuntu-1404) + +```bash linenums="1" +#Prepare the environment for building from source code. +sudo apt-get install build-essential checkinstall git + +#Get the code from github +git clone --recursive https://github.com/cloose/CuteMarkEd.git + +#Install dependencies for CuteMarkEd +sudo apt-get install libqt5webkit5-dev qttools5-dev-tools qt5-default discount libmarkdown2-dev libhunspell-dev + +#Compile and install CuteMarkEd +qmake CuteMarkEd.pro +cd CuteMarkEd/ +qmake CuteMarkEd.pro +make +echo 'A Qt-based Markdown editor with live HTML preview and syntax highlighting of markdown document.' > description-pak +sudo checkinstall --requires 'libqt5webkit5, libmarkdown2, libhunspell-1.3-0, discount' +sudo ln -s /usr/lib/x86_64-linux-gnu/qt5/bin/cutemarked /usr/local/bin/ +sudo mkdir -p /usr/local/share/icons +sudo cp app/icons/scalable/cutemarked.svg /usr/local/share/icons/cutemarked.svg +sudo apt-get install fcitx-libs-qt5 +``` + +Now there is a [bug](https://github.com/cloose/CuteMarkEd/issues/241) in the tool which makes the Gantt charts appear as monochrome but fear not for there is a workaround for it. Once installed, open CuteMarkEd and add a snippet in the tool to ensure Gantt charts display properly. Steps below: + +1. Enable diagram support by clicking `Extras->Options->Diagram Support` + + * ![image](../assets/images/2017/02/CuteMarkEd-2017-02-12-20-02-02.png) + +2. Add the snippet for quick creation by clicking `Extras->Options->Snippets->Add` + +3. Then type `~~~gantt` and in description something to the effect of `Adds the codeblock for mermaid with the necessary javascript` + +4. Now in the snippet box add the following code. + +5. To invoke the snippet simply type in editor `~~~gantt` followed by pressing the ++ctrl+space++ keys. + +```javascript linenums="1" +~~~mermaid +gantt + dateFormat YYYY-MM-DD + title + +%% : crit if critical else empty,done, active or empty, reference name or empty, Start Date or dependency, End Date or Duration + section Phase 1 Name + Activity 1 : done, des1, 2017-01-06, 2017-01-08 + Activity 2 : active, des2, 2017-01-09, 2017-01-12 + Activity 3 : des3, 2017-01-12, 5d + Activity 4 : des4, after des3, 5d + + section Phase 2 Name + Activity 5 : crit, done, 2017-01-06, 24h + Activity 6 : crit, done, after des1, 2d + Activity 7 : crit, active, 3d + Activity 8 : crit, 5d + Activity 9 : 2d + Activity 10 : 1d + + section Phase 3 Name + Activity 11 : active, a1, after des1, 3d + Activity 12 : after a1 , 20h + Activity 13 : doc1, after a1 , 48h + + section Phase 4 Name + Activity 12 : after doc1, 3d + Activity 15 : 20h + Activity 16 : 48h +~~~ + +``` + +This will then show in the preview pane following Gantt Chart and we can edit, add and modify the data as per the requirements: + +![image](../assets/images/2017/02/GanttChartCuteMarkEd-2.PNG) + +!!! site-tip "Tip" + You can make as many snippets as you want and for the simple solution that I mentioned right at the top, I made one snippet called dategantt replacing the code between line 3 to line 29 of the snippet above + + ```javascript linenums="1" + dateFormat DD/MM/YY + title Project Name + + Section Pre-condition + Activity 1 :21/12/16, 22/12/16 + Activity 2 :21/12/16, 22/12/16 + Activity 3 :16/01/17, 02/02/17 + Activity 4 :01/02/17, 02/02/17 + + Section Kick-off + Activity 5 :01/02/17, 03/02/17 + Activity 6 :01/02/17, 03/02/17 + Project Initiated :01/02/17, 03/02/17 + + Section Tech Design + Technical Design :crit, active, T1, 06/02/17, 21/03/17 + + Section Delivery + Activity 7 :06/02/17, 10/02/17 + Activity 8 :10/02/17, 14/02/17 + Order :15/02/17, 14/03/17 + Deployment :crit, 15/03/17, 21/03/17 + Activity 9 :crit,T2, after T1, 23/03/17 + Project Close-Down :after T2, 24/03/17 + ``` + + Once done, just type dategantt followed by ++ctrl+space++ and you will have the framework to enter activities, start dates and end dates. Gantt Chart will be ready. + + +## Install Mermaid CLI + +One of the drawbacks of the CuteMarkEd is that the pdf export there just does not work and you will need to rely on a screenshot. Now if the Gantt chart is really huge a screen shot wont cut it and mermaid does offer the ability to generate svg file for your effort. It is ofcourse a command line tool but is actually fairly easy to use once installed. + +```bash linenums="1" +#check if nodejs is installed. If command below results in nothing then you need to install nodejs +nodejs -v + +## Instal nodejs +sudo apt install nodejs +#On Ubuntu there is some link issue where node is +#referenced as nodejs which results in issues +#while installing npm modules. This can be avoided +#by creating a symlink using following command. +sudo ln -s /usr/bin/nodejs /usr/bin/node + +#Install npm +sudo apt install npm + +#In order to install npm modules without sudo, +#As explained in one of my previous post: +# http://mgw.dumatics.com/ghost-on-fedora-24/#step3installnpmmodules, +#it requires fixing the permissions using following steps. +#This needs to be done only once so if you have +#done this in past, then there is no need to repeat. + +mkdir ~/.npm-global +npm config set prefix '~/.npm-global' +nano ~/.profile +source ~/.profile + +#Install Mermaid and phantomjs on which mermaid depends. + +npm install -g phantomjs +npm install -g mermaid + +#Check if mermaid is installed by issuing the command +mermaid --h + +#Generate a png using following command +mermaid -p path/to/markdown file with .md or .mmd extension. +``` + +## Install Markdown-plus + +MarkdownPlus is a good markdown editor and can be used on their [hosted solution](http://mdp.tylingsoft.com/) or for offline use it can be installed as a local copy and accessed from the browser by pointing the browser to the index.html. The bug from CuteMarkEd is not present here. +To access offline, you can clone it from github using following command. + +```bash +git clone --recursive https://github.com/tylingsoft/markdown-plus.git +``` + +Then open the folder markdown-plus and right click on the index.html file and open it using your browser of choice. Alternatively, in the browser enter `file:///home/path/to/markdown-plus//index.html`. + +## Mermaid Live Editor + +While Markdown Plus is quite a versatile browser based editor, I did not like the fact that there is no easy way to save the file you have created and all I could work out was that you will have to copy paste your text and save it using another text editor. +I felt, for this reason that the [Mermaid Live editor](http://knsv.github.io/mermaid/live_editor/) was better compared to this option and the live editor is quite basic to be honest and can't be used offline. diff --git a/docs/posts/2017-03-03-rstudio-server-setup-with-ssl-behind-apache-proxy-server.md b/docs/posts/2017-03-03-rstudio-server-setup-with-ssl-behind-apache-proxy-server.md new file mode 100644 index 0000000..0d6a680 --- /dev/null +++ b/docs/posts/2017-03-03-rstudio-server-setup-with-ssl-behind-apache-proxy-server.md @@ -0,0 +1,198 @@ +--- +title: Rstudio Server Setup with SSL behind Apache proxy server +slug: rstudio-server-setup-with-ssl-behind-apache-proxy-server +date: + created: 2017-03-03 15:10:00 + updated: 2018-03-29 15:37:54 +draft: False +description: Rstudio Server Setup with SSL behind Apache proxy server +authors: ['ankit'] +comments: true +--- + + +## Install R using following commands: + +```bash linenums="1" +sudo apt-get install r-base libapparmor1 gdebi-core +## Check that R is installed +R +#quit R +q() +``` + + + +## Install Rstudio IDE server + +```bash linenums="1" +cd Downloads/ +wget https://download2.rstudio.org/rstudio-server-1.0.136-amd64.deb +sudo gdebi rstudio-server-1.0.136-amd64.deb +``` + +At this point if all goes well you can check the status of rstudio server by issuing the command: + +```bash +sudo systemctl status rstudio-server.service +``` + +The server is started automatically at port 8787 and can be accessed using <ip_address:8787> in browser of your choice, provided all firewall settings have been taken care of. + +However, when you open the Rstudio server you will be presented with a logon screen and while you can access this using the users for the machine it is hosted on, it will be prudent to create a lower privilege user as explained in next section. + +## Add User to access the RStudio + +```bash +sudo adduser rstudio +``` + +## Set up SSL and reverse proxy for R-Studio Server + +Now important thing to note is that community version of Rstudio server does not come with SSL enabled but just to run it on a secure socket layer you don't necessarily need the pro version. By following the steps below, your communication with the server will be on SSL. + +However to achieve the objective we need to accomplish following steps: + +
    +
  1. Enable modules on Apache to help set up proxy
  2. +
+
    +
  • Configure a proxy to control access to RStudio Server
  • +
  • Use LetsEncrypt to enable SSL
  • +
  • Restrict access to Rstudio server only through proxy
  • +
  • Restart both Rstudio and Apache servers
  • +
+ +### Step 1: Enable modules on Apache to help set up proxy + +There is guidance on how to do this on [Rstudio Support](https://support.rstudio.com/hc/en-us/articles/200552326-Running-RStudio-Server-with-a-Proxy). However, there was a bit of hair pulling and head scratching involved to get all the steps above work together so stick with me but keep that link in back pocket for variations or when you are stuck. + +With head scratching and hair pulling I mean that I encountered errors such as these - `AH01102 error reading status line from remote server`, `Rstudio Proxy redirect changing the URL to localhost` and many others which can be avoided by following steps as explained below. Anyway so we need to enable `mod_proxy` and `mod_proxy_wstunnel` modules. As Apache is already installed and mod_proxy already enabled I did not have to install the module itself, but if it needs to be done the commands are: + +```bash linenums="1" +sudo apt-get install libapache2-mod-proxy-html +sudo apt-get install libxml2-dev +``` + +Issuing the following commands should enable the relevant modules: +```bash linenums="1" +sudo a2enmod proxy +sudo a2enmod proxy_http +sudo a2enmod proxy_wstunnel +``` + +### Step 2: Configure a proxy to control access to RStudio Server + +```bash linenums="1" +## Change directory to sites-available +cd /etc/apache2/sites-available +## create a rstudio conf file +sudo nano rstudio.conf +``` + +Paste the following in the conf file but make sure to change details relevant to your `domain name` for each entry (line numbers 2, 3, 4, 15 and 16 below): + +```html linenums="1" +; + ServerAdmin user@yoursite.com + ServerName yoursite.com + ServerAlias whatever.yoursite.com + +#Specify path for Logs + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + + RewriteEngine on + +#Rewrite the url supplied to ensure https is applied + RewriteCond %{SERVER_NAME} =yoursite.com [OR] + RewriteCond %{SERVER_NAME} =whatever.yoursite.com + RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent] + +## Following lines should open rstudio directly from the url + RewriteCond %{HTTP:Upgrade} =websocket + RewriteRule /(.*) ws://localhost:8787/$1 [P,L] + RewriteCond %{HTTP:Upgrade} !=websocket + RewriteRule /(.*) http://localhost:8787/$1 [P,L] + ProxyPass / http://localhost:8787/ + ProxyPassReverse / http://localhost:8787/ + +; + +## vim: syntax=apache ts=4 sw=4 sts=4 sr noet +``` + +1. :bulb: Change details relevant to your `domain name` +2. :bulb: Change details relevant to your `domain name` +3. :bulb: Change details relevant to your `domain name` +4. :bulb: Change details relevant to your `domain name` +5. :bulb: Change details relevant to your `domain name` +6. :bulb: Change details relevant to your `domain name` + +Press ++ctrl+x++ and save the file. + +!!! site-tip "Tip" + If you just want reverse proxy and no SSL, you can just comment out line 15, 16 and 17 in above conf file and you are all set. If you do want to enable SSL, enabling the site with commands below won't probably work just yet and subsequent steps will need to be completed. + + +Now enable the new site by issuing the commands: + +```bash linenums="1" +sudo a2ensite rstudio.conf +sudo service apache2 restart +``` + +### Step 3: Use LetsEncrypt to enable SSL + +Follow the instructions [here](https://certbot.eff.org/) for specific usecase but one way or the other using Certbot you will be able to obtain the LetsEncrypt SSL certificate and enable it on your server. + +Once certbot has completed doing it's thing you would find an additional conf file in `/etc/apache2/sites-available` named `rstudio-le-ssl.conf`. It will be pretty much same content as in rstudio.conf with very minor changes. The first line will be listening on `443` instead of `80` and the ssl certificates will be included. Normally, you would not need to tweak anything in the resultant file but just for reference the contents of this file will look as below: + +```html linenums="1" + + + + ServerAdmin user@yoursite.com + ServerName yoursite.com + ServerAlias whatever.yoursite.com + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + +RewriteEngine on +## Following lines should open rstudio directly from the url + RewriteCond %{HTTP:Upgrade} =websocket + RewriteRule /(.*) ws://localhost:8787/$1 [P,L] + RewriteCond %{HTTP:Upgrade} !=websocket + RewriteRule /(.*) http://localhost:8787/$1 [P,L] + ProxyPass / http://localhost:8787/ + ProxyPassReverse / http://localhost:8787/ + +SSLCertificateFile /etc/letsencrypt/live/whatever.yoursite.com/fullchain.pem +SSLCertificateKeyFile /etc/letsencrypt/live/whatever.yoursite.com/privkey.pem +Include /etc/letsencrypt/options-ssl-apache.conf + +## vim: syntax=apache ts=4 sw=4 sts=4 sr noet + +``` + +### Step 4: Restrict access to Rstudio server only through proxy + +Finally, we want to ensure that access to the Rstudio server is only through the proxy we configured and to do that we just need to specify this in the rstudio server configuration the attribute that tells it to only serve requests from localhost. + +```bash +sudo nano /etc/rstudio/rserver.conf +``` + +Now on the opened file type `www-address=127.0.0.1` and press ++ctrl+x++ and save the file. + +### Step 5: Restart both Rstudio and Apache servers + +Finally issue the following commands to restart both the servers: + +```bash linenums="1" +sudo systemctl restart rstudio-server.service +sudo service apache2 restart +``` + +This is it. Now your new Rstudio server is ready to be used through secure socket layer. \ No newline at end of file diff --git a/docs/posts/2017-10-05-ghost-v1-0-upgrade-related-quirks-and-fixes.md b/docs/posts/2017-10-05-ghost-v1-0-upgrade-related-quirks-and-fixes.md new file mode 100644 index 0000000..ec1a138 --- /dev/null +++ b/docs/posts/2017-10-05-ghost-v1-0-upgrade-related-quirks-and-fixes.md @@ -0,0 +1,190 @@ +--- +title: Ghost V1.0 Upgrade on Apache stack, related quirks and fixes +slug: ghost-v1-0-upgrade-related-quirks-and-fixes +classes: wide +date: + created: 2017-10-05 17:46:00 + updated: 2018-03-29 15:37:54 +draft: False +description: Ghost V1.0 Upgrade on Apache stack, related quirks and fixes +authors: ['ankit'] +comments: true +--- + +Right then, the Ghost V1.0 was out a while back and they made Ghost 0.11.x an LTS so I was not in any rush to upgrade too. I have not had much time to sort this out for a while and two days back when I finally came around to check how to upgrade, my first moment of concern was that officially supported stack is for NGINX. + +I have moved my blog to the Apache Stack on DigitalOcean and while on my sandbox environment I still have NGINX, that is not a place I want to host my blog from. Anyhoo, I realised soon enough that while not officially supported it s easy to bypass the restrictions so I went ahead. + +The upgrade itself couldn't have been simpler considering the major version bump. The answer to the question 'Was it worth it?' is something we will have to wait and see although I am liking what I see except for the initial hiccups. + +!!! success + EDITED AFTER THE POST: Boy oh boy - just after I finished this post I saw the latest version of Ghost V1.12 is out and it was such a painless process compared to past. Just a simple command 'ghost update' and job done. That itself makes this whole pain kind of worth it. + + +OK so the steps I took are as presented below. + + + +## Backup + +We will take the back-up from front end for all the posts and we will also backup on the server the entire directory where old instance of the blog is residing. To take backup of all the content and download it in a `json` file, open your ghost site on a browser, navidate to `Settings` and then click on `Export`. + +Next create the backup of folder on the server itself. To do this issue the following commands on the terminal. + +```bash linenums="1" +#Updateand upgrade the OS repo +sudo apt-get update +sudo apt-get upgrade +#Stop the ghost server +pm2 stop Ghost 'assuming Ghost is the pm2 id for the site' +## Change directory to web-server root +cd /var/www/html/'path to your ghost directory say 'ghost' ' +## Create a new directory for backup +sudo mkdir old_ghost_bkp +sudo mv ghost old_ghost_bkp +## Recreate the ghost directory +sudo mkdir ghost +cd ghost +## Give right privileges to the new directory +sudo chown -R <your username>:www-data . +``` + +## Download and Install + +As we are already in the right directory lets get on with installing the latest version of Ghost using npm. + +```bash linenums="1" +sudo npm install -g ghost-cli +#Make sure you are in the directory where new ghost is to be installed. +#If you have followed all commands so far, you will already be in +#required the directory +ghost install +``` + +!!! warning + It is at this point that you will have to deviate from official guide if you have Apache instead of NGINX. You will be prompted by the installer that it could not find NGINX and do you still want to continue. Default is 'No' so make sure you enter 'Y' and then press enter. + + ![nginx-not-found](../assets/images/2017/10/nginx-not-found.PNG) + + +For me, rest of the install went smoothly. + +![finish-install-process](../assets/images/2017/10/finish-install-process.PNG) + +## Setup Wizard + +Immediately after the install is complete, you will be presented with following questions: + +!!! info + Please note that if you have configured SSL using LetsEncrypt as explained in previous posts on this blog then even if you are using https, the answer to blog url must be the with http and not https. + + For example: I gave `http://mgw.dumatics.com` and not `https://mgw.dumatics.com` + + +```bash linenums="1" +Enter your blog url: http://your.blog.url +Enter your MySQL Hostname: localhost +Enter your MySQL Username: root +Enter your MySQL Password: 'your mysql root password' +Enter your Ghost database Name: "a relevant name" +## for security reasons you may want to keep it different from your blog name"; +Do you wish to set up Nginx: no # (1) +Do you wish to set uo Ghost MySQL User: yes +Do you wish to set up Systemd: yes +Do you want to start Ghost: yes +``` + +1. Please do note that the response to 'Setup Nginx' must be 'no' + +!!! warning + Please do note that the response on line 6 above to 'Setup Nginx' must be 'no' + + +After the questions are complete you will get a notification `You can access you blog at http://your.blog.url` + +At this point, it is best to see which port is configured by `ghost CLI` for this installation. you can do so by checking the configuration file like so: + +```bash +nano config.production.json +``` + +You can change the port if you like but if it is different than the port you originally had for old version of ghost you can either change it here or you need to change Apache conf file in next step. + +If you do decide to change the port here, then there should be no need to carry out the next step - Configure Apache. + +

Configure Apache

+Assuming that the port in Ghost config file was `1234`, there will be some changes that you will need to make in Apache conf files like so: + +```bash linenums="1" +cd /etc/apache2/sites-available/ +sudo nano ghost.conf +``` + +Now change the port on `ProxyPass` and `ProxyPassReverse` to be same as what is in the `config.production.json` file and save it by pressing `Ctrl+x` and `y`.- so for this example it will be changed to `1234` and change will look as below: + +```html linenums="1" +ProxyRequests off +ProxyPass / http://localhost:1234/ +ProxyPassReverse / http:/localhost:1234/ +``` + +Now open the ssl config file for the site using commands below and make the same changes as above. + +```bash +sudo nano ghost-le-ssl.conf +``` + +!!! site-tip "Tip" + If done using LetsEncrypt, it will be named something like `ghost-le-ssl.conf`. + +Once the changes are saved, disable and enable the configurations using following commands: + +```bash linenums="1" +sudo a2dissite ghost.conf +sudo a2dissite ghost-le-ssl.conf +sudo a2ensite ghost.conf +sudo a2ensite ghost-le-ssl +#Restart the server +sudo service apache2 restart +``` + +Now if you enter you blog url in a browser, you should be presented with vanilla Ghost site. If not, something in server set-up has not worked and you will need to troubleshoot it and fix - luckily for me all worked like a charm. + +## Restore + +Right, so you are now on the browser looking at the Vanilla Ghost install. First thing you need to do now is create the user with same credentials you had on your old version of ghost. To do his you will first need to enter the admin url for ghost and follow the steps to create your user. + +Once you are into the admin interface, navigate to 'Settings' > 'Labs' and click on 'Choose File' button, select the json backup that was exported from your old version of the blog and then click on 'Import' button. + +Now to restore the images from your old blog on the server issue following commands: + +```bash linenums="1" +cd /var/www/html/ghost/content +sudo rm images +sudo cp /var/www/html/old_ghost_bkp/ghost/content/images /var/www/html/ghost/content/ +#### Make the new image directory is writable or image uploads will fail +sudo chown -R ghost:ghost images/ +#### Restart Ghost +cd .. +ghost restart +``` + +!!! warning + 1. The ghost CLI commands like stop, start and restart will require you to be in the directory where ghost is installed. + 2. While start and stop commands of ghost specifically ask for sudo credentials, restart command just keeps rotating and hence it is better to issue a command with sudo before you issue `ghost restart`. + +This is it. Your old blog is now fully restored. + +## Tweak + +This section is a bit of a pain because there are quite a few things that break with this version. So if you have heavily used html, you will painstakingly need to go through posts and add a new line between markdown and html content for it to be parsed properly or else it will display quite wiered outputs on your blog. + +If you have used code blocks with syntax highlighting, another change is with older version you would have given three backticks followed by language-sql but now you just need to give three backticks followed by sql. + +If you have used line numbering using prism.js, it just wont work and you will need to apply changes to your theme the way I did. Without going too much in detail on that, you can get the copy of [prism.js](https://github.com/pubmania/scrawl/blob/master/assets/js/prism.js), [prism-custom-line-number.js](https://github.com/pubmania/scrawl/blob/master/assets/js/prism-custom-line-numbers.js), [prism.css](https://github.com/pubmania/scrawl/blob/master/assets/css/prism.css), [prism-line-number.css](https://github.com/pubmania/scrawl/blob/master/assets/css/prism-line-numbers.css) using the github links for my theme and place them in assets directory of your theme. + +Then make sure you include them in relevant files where your theme calls the javascripts. + +Once done, issue the command `ghost restart` and things should look pretty again. + +Happy Migrating !!! \ No newline at end of file diff --git a/docs/posts/2017-11-19-unprotect-sheets-in-libre-calc-excel.md b/docs/posts/2017-11-19-unprotect-sheets-in-libre-calc-excel.md new file mode 100644 index 0000000..0a2e16d --- /dev/null +++ b/docs/posts/2017-11-19-unprotect-sheets-in-libre-calc-excel.md @@ -0,0 +1,36 @@ +--- +title: Unprotect Sheets in Libre Calc, Excel +slug: unprotect-sheets-in-libre-calc-excel +date: + created: 2017-11-19 01:57:58 + updated: 2018-03-29 15:37:54 +draft: False +description: Unprotect Sheets in Libre Calc, Excel +authors: ['ankit'] +comments: true +--- + +A friend of mine today had an issue. He had created a template for some really complex calculations and to ensure he does not mess up with the forumlae by mistake he had password protected sheets and cells. He had done this back in 2012 and now he wanted change something in there but he had forgotten the password so he asked me if I can help. + +Now, I do not know much about how it could be done on windows or on excel but I knew a small trick on LibreOffice so I asked him to send me that excel file by email. I then took following steps: + + + +1. Opened the excel file `Locked.xls` in LibreCalc. + +2. Saved it as an `Locked.ods` file. + +3. From file browser, right click on newly saved `Locked.ods` file -> Open With -> Archive Manager as shown below. + + * ![Menu_001](../assets/images/2017/11/Menu_001.png) + +4. Now open the `content.xml` + +5. Find `table:protected='true'` and Replace All with `table:protected='false'` + +6. Save the xml file. + +7. Now open the `Locked.ods` in LibreCalc and save it as `Unlocked.xlsx` + + +This should do the trick and unlock all password protected sheets and cells to be freely modified. diff --git a/docs/posts/2018-01-04-ghost-upgrade-errors-and-fixes-1-19-x.md b/docs/posts/2018-01-04-ghost-upgrade-errors-and-fixes-1-19-x.md new file mode 100644 index 0000000..12f0a27 --- /dev/null +++ b/docs/posts/2018-01-04-ghost-upgrade-errors-and-fixes-1-19-x.md @@ -0,0 +1,99 @@ +--- +title: Ghost Upgrade errors and fixes (1.19.x) +slug: ghost-upgrade-errors-and-fixes-1-19-x +date: + created: 2018-01-04 19:36:16 + updated: 2018-01-04 19:36:16 +draft: False +description: Ghost Upgrade errors and fixes (1.19.x) +authors: ['ankit'] +comments: true +--- + +I have found the recent ghost upgrades quite painless but there have been few hiccups for last two times so I kept a record of what helped and it is as listed below: + +General Update should be as simple as: + + + +```bash linenums="1" +cd /var/www/html/ghost/ +ghost update +``` +If after this step, there are any errors or an indication to update ghost-cli, following command should be used. + +```bash +sudo npm install -g ghost-cli +``` +After this if there are issues accessing the blog over internet, we may need to do a bit of checks. Logical sequence is to first check that access for all folders is right and proper. If it needs to be updated, command to be used is: + +```bash linenums="1" +cd ghost +sudo chown -R <your username>:www-data . +cd content/ +sudo chown -R ghost:ghost images/ +``` +If there are any errors when starting ghost, following command is indicated by the ghost-cli and it does help. + +```bash +ghost setup linux-user systemd +``` +If still accessing the blog is an issue following command will list the ghost log file: + +`ghost log` + +If there are database migration errors on log file, following commands may help: + +```bash linenums="1" +sudo npm install -g knex-migrator +ghost setup migrate +``` +!!! site-tip "Tip" + `ghost setup migrate` does work very well and must be remembered. + +If you have digitalocean setup such as mine, memory can be an issue you may want to restart the virtual machine and reload the swap files. + +```bash linenums="1" +sudo reboot now +sudo swapon /swapfile1 +sudo swapon /swapfile2 +``` + +If update if failing with the message not enough memory try running the following: + +```bash +ghost update --no-check-mem +``` + +If there are still issues accessing the blog with error 503, check the apache logs: + +```bash +sudo nano /var/log/apache2/error.log +``` + +If issue is with accessing the upstream ghost server. Try changing the port on ghost config and updating the apache conf files. + +```bash linenums="1" +##Change Directory to ghost install +cd /var/www/html/ghost +##Stop the ghost server +ghost stop +##Change port to another number +nano config.production.json +##Change directory apache2 server +cd /etc/apache2/sites-available/ +##Open the ghost.conf file and change the localhost port to same +##number that was changed in config.production.json +sudo nano ghost.conf +##Open the ghost-le-ssl.conf file and change the localhost port +##to same number that was changed in config.production.json +sudo nano ghost-le-ssl.conf +##Disable and enable the conf files on apache. +sudo a2dissite ghost.conf ghost-le-ssl.conf +sudo a2ensite ghost-le-ssl.conf ghost.conf +sudo service apache2 reload +##Finally change directory to your ghost install +##and start ghost server. +cd /var/www/html/ghost +ghost start +``` \ No newline at end of file diff --git a/docs/posts/2018-02-20-mysql-function-to-calculate-closing-workday-date-given-elapsed-working-time.md b/docs/posts/2018-02-20-mysql-function-to-calculate-closing-workday-date-given-elapsed-working-time.md new file mode 100644 index 0000000..2bab590 --- /dev/null +++ b/docs/posts/2018-02-20-mysql-function-to-calculate-closing-workday-date-given-elapsed-working-time.md @@ -0,0 +1,158 @@ +--- +title: MySQL Function to calculate closing WorkDay date given elapsed working time +slug: mysql-function-to-calculate-closing-workday-date-given-elapsed-working-time +date: + created: 2018-02-20 20:29:30 + updated: 2018-03-29 15:37:54 +draft: False +description: MySQL Function to calculate closing WorkDay date given elapsed working time +authors: ['ankit'] +comments: true +--- + +On my post [MySQL function to calculate elapsed working time](./2016-07-19-mysql-function-to-calculate-elapsed-working-time.md) I was asked in comments if the assumptions can be reversed such that given start date, starting time and closing time of site and the elapsed working hours, function should return the closed date. I was convinced that it will be possible to achieve this with minor tweaks to original logic and so I only concentrated on original code and how to tweak it to achieve the result. It is very likely that there might exist a more elegant solution but ~~frankly I did not have a usecase~~ I did find a [usecase](#example-of-problem) afterall - Clue was in redefining the problem description for this. Presented below is the function that with my minimal testing seems to give correct results. Feel free to try it and as always any feedback is welcome. :smile: + +## Problem Description: + +Find out the WorkDay date by when a ticket must be closed given: + +1. Country of site for which incident was logged. +2. Time and Date when Incident was logged. +3. Elapsed working hours in decimal. (Ten and a half hours as 10.5 and so on) +4. Opening time of the site for which the incident was logged. +5. Closing Time of the site for which incident was logged. +6. SLA Type - Is the output date to be based purely on number of hours or based on SLA in days (eg: Next Business Day). + +!!! question "Assumption" + It is assumed that opening and closing times are same on all working days and that all the sites are closed on holidays and weekends. + + + +### Example of problem + +Let's say an incident was logged on "Friday 23rd Feb 2018 at 15:00" for a site in the "UK" which opens between 08:00 to 16:00. Now if the SLA is purely based on hours i.e. Tickets must be closed withing 16 hours then for the above incident function should calculate the closing date as: + +`2018-02-27 15:00` = 1 hour on Friday, then skip Saturday and Sunday, 8 hours on Monday and 7 hours on Tuesday the 27th of Feb 2018. However, if the SLA is based on number of days, then 16 hours will translate to an SLA of next business day hence in this case function should return `2018-02-26 16:00` which is a Monday end of day and the next business day for this incident. The use case really is in creating a report that shows the target closed date based on SLA. Specifically Next Business Day SLA, which isn't direct hours calculation and is really always the next working day but based on cut-off time when the call is logged. So a call logged on a working day 1 after cut-off will be counted as logged on working day 2 and hence will need to be closed by working day 3 whereas a call logged within cut-off of working day 1 will need to be closed by close of business working day 2. This is turn can allow for a comparison between Target Closed Date from this function and Actual Closed Date to show SLA failures where Actual Closed Date is greater than Target Closed Date. + +## Pre-Requisites: + +Follow from [previous post](2016-07-19-mysql-function-to-calculate-elapsed-working-time.md) + +## Function code and explanation + +```sql linenums="1" +CREATE DEFINER=`ankit`@`%` FUNCTION `get_closed_date_given_start_time`( + `param_country` VARCHAR(20), + `assigneddatetime` VARCHAR(20), + `param_elapsedhours` VARCHAR(10), + `starttime` VARCHAR(20), + `endtime` VARCHAR(20), + `sla_type` VARCHAR(10) + +) +RETURNS TEXT +LANGUAGE SQL +NOT DETERMINISTIC +CONTAINS SQL +SQL SECURITY DEFINER +COMMENT '' +BEGIN +Set @starttime = starttime; +Set @endtime = endtime; +Select time_to_sec(timediff(@endtime,@starttime))/3600 into @maxhoursaday; +Set @assigneddate = assigneddatetime; +Set @timecount = param_elapsedhours; +Set @timevar1 = @assigneddate; +Set @nextdate = @assigneddate; +Set @timevar2 = null; +Set @param_country = param_country; +############ Check if the assigned time was before the starttime or closed time was after the endtime provided ############# +Set @checkstart = null; +Set @checkend = null; +Set @slatype = sla_type; + +Select CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1), ' ',@starttime), +CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1), ' ',@endtime) into @checkstart, @checkend; + +if (@slatype = 'H') then + if (@assigneddate < @checkstart) then + SET @nextdate = @checkstart; + end if; +else + if (@assigneddate < @checkend) then + SET @nextdate = @checkstart; + end if; +end if; + +Set @count = @timecount; +while @count>0 do + select weekday(@nextdate) into @weekday; # Assign the weekday value to @weekday. Weekday returns o for Monday, 2 for Tuesday ...5 for Saturday and 6 for Sunday + Select sum(if(date_format(holiday_date,'%Y-%m-%d') = substring_index(@nextdate,' ',1),1,0)) from holiday_table + where Country_codes = 'ALL' or instr(Country_codes,@param_country)>0 + into @holidayflag; #Check if the date stored in nextdate (which is assigneddate on first run of while loop) is a holiday and set the holiday flag + if ( @weekday<5 and @holidayflag=0) then #Proceed if the date in nextdate variable is neither weekend nor a holiday + if (@count = @timecount) then #Check if it is first run.ie. if nextdate is assigneddate + Set @timevar1 = @nextdate; #assign assigndate to variable timevar1 + SELECT CONCAT(SUBSTRING_INDEX(@nextdate, ' ', 1), ' ',@endtime) INTO @timevar2;#get site closing time on assigned date and store it on to timevar2 + else + Select CONCAT(substring_index(@nextdate,' ',1),' ',@starttime) into @timevar1; + SELECT CONCAT(substring_index(@nextdate,' ',1), ' ', @endtime) INTO @timevar2; + end if; + SELECT LEAST(Greatest(((TIME_TO_SEC(TIMEDIFF(@timevar2, @timevar1))) / 3600),0),@maxhoursaday) INTO @timecounttemp; + Set @count = @count - @timecounttemp; + end if; + + if @count > 0 then + Select adddate(concat(substring_index(@nextdate,' ',1),' ',@starttime),1) INTO @nextdate; + else + Select SUBSTRING_INDEX(@nextdate, ' ', 1) INTO @nextdate; + end if; +end while; +Set @finaldate = null; +Select concat(@nextdate,' ',substring_index(addtime(@endtime,sec_to_time(3600*@count)),':',2)) INTO @finaldate; +RETURN @finaldate; + +END +``` + +## Calling the function + +Function will expect 6 parameters and with specific format as explained below: + + - param_country - This is the country code as specified in holiday table + - assigneddatetime - This must be provided in the format `%Y-%m-%d %H-%i-%s`. So for our example it will be 2018-02-23 15:00:00 + - param_elapsedhours - This must be provided in decimal hours format. + - Bear in mind that if SLA Type is not H, you need to understand the number of working hours in allowed number of days in SLA. So for 8 working hours in a day: + - Same day SLA will have 8 hours + - Next Business Day will have 16 hours(2 times 8) + - A 2 day SLA will have 24 hours + - and so on + - starttime - This must be in the format `%H:%i`. So for our example it will be 08:00 + - endtime - This must be in the format `%H:%i`. So for our example it will be 16:00 + - sla_type - This must be 'H' if the sla is based on hours or anything else (say 'D') if SLA is based on days. + +The call for this function will be as below: + +For Hours SLA: + +```sql +Select get_closed_date_given_start_time('ALL','2018-02-23 15:00:00','16','08:00','16:00','H'); --(1) +``` + +1. This will give an output of `2018-02-27 15:00` + +For Next Business Day SLA: + +```sql +Select get_closed_date_given_start_time('ALL','2018-02-23 15:00:00','16','08:00','16:00','D'); --(1) +``` + +1. This will give an output of `2018-02-26 16:00` + +For just calculating next working day date given number of hours: + +```sql +Select get_closed_date_given_start_time('ALL','2018-02-23 15:00:00','10.5','08:00','16:00','H'); --(1) +``` + +1. This will give an output of `2018-02-27 09:30` diff --git a/docs/posts/2018-05-14-home-networking.md b/docs/posts/2018-05-14-home-networking.md new file mode 100644 index 0000000..625576a --- /dev/null +++ b/docs/posts/2018-05-14-home-networking.md @@ -0,0 +1,99 @@ +--- +title: "Home Networking" +slug: "home-networking" +authors: ['ankit'] +date: + created: 2018-05-14T18:21:00 + updated: 2018-11-10T08:59:05 +draft: false +description: Home Networking +comments: true +--- + +## Network routing + +1. **Router** - Router is the device at home that connects all devices in your house to the internet. + + 1. It does so by assigning IP address to each of your device but this IP address is only relevant for devices connected to this router. What this means is that if you use an IP address allocated by this router from a coffee shop and you are not connected to your home router then you will not be able to reach the device that IP address belonged to. For this reason these IP addresses are called internal IP addresses. + 2. Now what happens is when you try to access a website, your device sends the request to your router, router in turn sends it to the router of your ISP which in turn eventually connects to the server that is hosting the website. The information flows back through same route and your router finally gets the information and then passes it back to your device and it is able to do so because it identifies your device based on the Internal IP address it assigned to your device. + 3. By default pretty much all routers are configured to allocate these Internal IP Addresses using DHCP which is just fancy term for allocating a random number to the device. They do also provide the facility to reserve an IP address for a particular device if we tell it to do so - This is called "assigning a static IP on the router"; in technical speak. This is important when we are trying to host service from home based server and is explained next + 4. Many ISP provided routers are locked in and it will serve you well to get a router and flash it with an open source firmware like [DD-WRT](./2017-02-02-dd-wrt-firmware-on-tp-link-tl-wr841n-v11.md) + +2. **Internal LAN set-up** - Ensure that on your internal LAN network you assign static IP address to device that will be running the server. If your router allows for LAN Domain to be configured then do so and allocate appropriate LAN Hostname as it makes it easier to access the server from within LAN than just by trying to remember the IP address. + +3. **Port Forwarding** - When the request comes from Internet, it will be with http, ftp, smtp and those kind of headers. + + * These headers operate on standard ports. However for security as well as application related issues, the ports on actual server within your home network can be significantly different. + * All this needs to be translated for communication to be completed and application to receive the information it requested. + * Port Forwarding at router level is simply us telling router which IP address to pass on the received request based on the port that request is trying to access. + * For example http requests are on port 80 so if we want to tell the router that any requests coming on port 80 must be forwarded to a laptop in your house with internal ip address of 192.168.1.44, then port forwarding should be the way to do so. + + +## Internet to Home + +Use of Dynamic DNS Services + +1. Ensure that the router is informing your Dynamic DNS provider with latest IP address assigned by your ISP. + + 1. Use of duckdns.org or dtdns.com etc + 2. Use of DNS-O-Matic to dynamically update the External IP address for your home router as soon as it is changed by the ISP. + +2. Allocate the Dynamic DNS to DNS name purchased from Domain Name registrar like Namecheap etc. + + +## Hosting a service from Home Server: + +!!! quote "Question we are first going to answer is:" + **If we want to host on server from home, what do we need to do?** + +### Pre-requisites + +- Ensure you are able to do changes to your router setting that allows you to: + + 1. Create port forwarding rules + 2. Update the DynamicDNS each time your ISP changes External IP address for your router. + +- We need to decide the operating system and web server we want to use? + + * The request from Internet when it reaches the router it is just dealing in numbers and not strings so it does not really know what information to send back unless it gets it back from the device where the information resides. + * In order for the device, that has the requested information, to provide it such that router can send it out, we need to have these web servers, that do the job of translating the information exchange, between router and the device, into a format that the router and eventually the device can understand. + * So as an example, if the request was on http protocol, it would mean it is for a web page and router knows that it is for port 80, and will forward it to the IP address you assigned for port 80 - Router is assuming ofcourse that you know what you are doing. + * In other words it is your (human) responsibility to ensure that when this request lands on said IP address someone is there to receive it - that someone is the `Web Server` we are now talking about. + +## Web Servers + +The two commonly used web-servers are: + +1. Apache +2. Nginx + + +There are other servers too for various other scenarios but the most popular options are the two above. + +!!! question "Can we have both web servers running on same machine?" + Yes, the routing of information will be similar to the flow below: + + *Internet -> Home Router -> Primary Server -> Other servers in home network accessed through reverse proxy and connected to world only through Primary Server.* + + +## Operating System + +Assuming that we decide to go with Apache Server. You will need to install it on your laptop. This brings us to the first controversial topic, that of operating system your laptop is using. It can be anything from Windows, Mac to a range of Linux Distros. As we are talking open source, lets assume it is will be a linux distro but there are so many to chose from, so which one? + +A safe choice is to opt for Debian based distro as it is easy to start with. In that too, Debian 9 (code named: Stretch) at the time of writing is latest stable version and is most recommended. I will assume for the purpose of this article that the reader will use Debian 9 (Stretch). I will also assume that reader is not aware of working on a Linux environment. Advanced users may find some of the information here obvious or boring as I explain few things at length. + +## Prepare the laptop + +* Step 1 - Find out whether the laptop is 32 bit or 64 bit. +* Step 2 - Download a copy of the Debian 9 (Stretch) applicable to the specific version of your laptop (32 bit / 64 bit) +* Step 3 - Create a Live DVD / USB and test drive the OS +* Step 4 - Install it. You will be asked to provide root password, username and user password. Make note of each of these as you will need them later. +* Step 5 - Update, Upgrade and Dist Upgrade + +Open the terminal of the laptop and type following commands: + +```bash linenums="1" +sudo apt update +sudo apt upgrade +sudo apt dist-upgrade +``` \ No newline at end of file diff --git a/docs/posts/2018-06-15-prosody-behind-apache-on-debian-stretch.md b/docs/posts/2018-06-15-prosody-behind-apache-on-debian-stretch.md new file mode 100644 index 0000000..f321205 --- /dev/null +++ b/docs/posts/2018-06-15-prosody-behind-apache-on-debian-stretch.md @@ -0,0 +1,424 @@ +--- +title: "Prosody behind Apache on Debian Stretch with Conversations" +excerpt: "A detailed step by step guide for a self-hosted instant messaging" +slug: "prosody-behind-apache-on-debian-stretch" +authors: [ankit] +date: + created: 2018-06-15T12:36:19 + updated: 2020-05-21 11:56:42 +draft: false +description: Complete walk-through to set-up a self-hosted instant messaging +comments: true +--- + +## Genreal Guidance + +This how-to assumes that: + +- User has access to a registered domain - `domain.name`. Any reference to `domain.name` throughout the tutorial therefore, must be replaced with your own domain name. +- If stuck anywhere, please do get in touch with [prosody support chat](https://chat.prosody.im/) - They are a very helpful lot and are very kind too. + + + +## Network Setup: + +It is not mandatory to follow the flow of this how-to but if you do, please do it till the end before you try and access the IM server from any client to save yourself some pain. + +### Obtain the IP address + +\.... of the machine where your XMPP server will be installed using following command on the terminal `ip -a address` On the result shown, IP address against inet family is the one we are interested in as can be seen in screenshot below: + +![PUTTY\_2018-06-15\_12-49-42](../assets/images/2018/06/PUTTY_2018-06-15_12-49-42.png) + +**Copy this ip address, we will need it in next step.** + +### Port Forwarding on router if hosting from home. + +You have to ensure that following ports are opened and directed to above IP address from your router. `5222, 5269, 5280, 5281` On DD-WRT this can be done as shown in screenshot below. This will, ofcourse, vary based on router you are using. + +![chrome\_2018-06-15\_11-34-57](../assets/images/2018/06/chrome_2018-06-15_11-34-57.png) + +Use the IP address from previous step to fill the IP address field. Basically this set-up is informing your router that if a request comes to you asking for one of the above mentioned ports direct that request to this IP address on the same port. + +### Create a sub-domain record + +!!! danger + Please note that the official Prosody Documentation recommends using Server Record and even the experts on their chat support strongly recommend that approach. + + I did not have that option unfortunately - read I was being lazy / adventurous - anyway the C-Name set-up has worked fine for me and hence the guide follows this route. + + You have been warned !!! + + +This step will vary based on the domain name registrar you use. I use Namecheap for which you could do it as shown in screenshot below: + +![chrome\_2018-06-15\_11-43-31](../assets/images/2018/06/chrome_2018-06-15_11-43-31.png) + +### Ensure you have some sort of Dynamic DNS update set-up in place + +You can create an account here -\> [DNSOMATIC](https://dnsomatic.com/) If you are going to use DNSOMATIC which allows you to update several places like so: + +![chrome\_2018-06-15\_11-53-35](../assets/images/2018/06/chrome_2018-06-15_11-53-35.png) + +For namecheap in order to get the value for password, login to Namecheap dashboard, go to Advanced DNS and scroll down to \"Dynamic DNS\" section and copy the value in front of the field named \"Dynamic DNS Password" as shown below: + +![chrome\_2018-06-15\_17-02-32.png](../assets/images/2018/06/chrome_2018-06-15_17-02-32.png) + +The setting to update DNSOMATIC on DD-WRT are as shown below: + +```yaml +DYDNS Server:`updates.dnsomatic.com` +Hostname: `all.dnsomatic.com` +URL: `https://updates.dnsomatic.com/nic/update?hostname=` +``` +![chrome\_2018-06-15\_11-48-32](../assets/images/2018/06/chrome_2018-06-15_11-48-32.png) + +For all other Dynamic DNS set-ups ensure that your subdomain will always get updated with latest IP address to ensure continuity of service. + +## Server Setup: + +Normally the XMPP clients on phone directly access port 5222 or 5269 for MUC (Multi User Chats aka Group Chats) but to make sure image uploads work and for being able to access IM from web we need to enable reverse proxy using Apache server. As this is fairly straight forward, lets get that out of the way. + +### Apache with reverse Proxy enabled + +Make directory for subdomain: + +`sudo mkdir /var/www/html/im` + +Then create a server conf file and open for editing in nano using following command:\ + +`sudo nano /etc/apache2/sites-available/prosody.conf` + +Paste the following in conf file: + +```javascript linenums="1" + + ServerName im.domain.name + ServerAlias im.domain.name + DocumentRoot /var/www/html/im + + ErrorLog ${APACHE_LOG_DIR}/error_im.log + CustomLog ${APACHE_LOG_DIR}/access_im.log combined + + ProxyPass /http-bind/ http://im.domain.name:5280/http-bind/ + ProxyPassReverse /http-bind/ http://im.domain.name:5280/http-bind/ + + +RewriteEngine on +RewriteCond %{SERVER_NAME} =im.domain.name +RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] + +``` + +Save the file with `Ctrl+x`, `y` and `Enter`. Finally enable site and reload server. + +```bash linenums="1" + sudo a2ensite prosody.conf + sudo systemctl reload apache2 +``` + +### Enable SSL set-up using Let's Encrypt + +It is assumed at this point that certbot is already installed but if not, follow the tutorial [here](https://certbot.eff.org/lets-encrypt/debianstretch-apache) On terminal give the command `sudo certbot` + +![PUTTY\_2018-06-15\_12-08-21](../assets/images/2018/06/PUTTY_2018-06-15_12-08-21.png) + +Then follow the wizard and once completed check that an additional conf file named prosody-le-ssl.conf is created. If not something did not go well so check again and repeat but if yes move to next step. + +#### Ensure certbot is renewing automatically + +Debian stretch gets the service certbot.timer already on it which when enabled will try to autorenew twice a day ensuring a continuous certificate availability. To locate and edit the `certbot.timer`following commands are helpful: + +![PUTTY\_2018-06-15\_12-19-30](../assets/images/2018/06/PUTTY_2018-06-15_12-19-30.png) + +```bash linenums="1" +locate certbot.timer +nano /etc/systemd/system/timers.target.wants/certbot.timer +``` +The certbot.timer entry on my system is as below: +![PUTTY\_2018-06-15\_17-23-18](../assets/images/2018/06/PUTTY_2018-06-15_17-23-18.png) + +Once edited, make sure it is enabled using following commands: + +```bash linenums="1" +sudo systemctl enable certbot.timer +sudo systemctl start certbot.timer +``` + +### Prosody XMPP server + +!!! question "Assumption" + Apache 2.4 web server is already installed and functioning. + +#### Install + +**Option 1** (Not Recommended): + +```bash +sudo nano /etc/apt/sources.list` +``` + +Then add this -> `deb http://packages.prosody.im/debian stretch main`on the last line. + +**Option 2** (Recommended): + +```bash +echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list +``` + +Above command is recommended because it takes the release of your installed version and adds it directly rather than the hard coded "stretch" in Option 1 which must be changes specific to the version of debian. Now add the key, update repository, upgrade for good measure and then install using the following commands: + +```bash linenums="1" +wget https://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add +sudo apt-get update +sudo apt-get upgrade +sudo apt-get install prosody +``` +#### Install plugins / modules + +Latest updated documentation is ofcourse on [project website](https://prosody.im/doc/installing_modules.html) but at the time of writing these are the instructions that were followed: + +```bash linenums="1" +cd /usr/lib/prosody/ +sudo hg clone https://hg.prosody.im/prosody-modules/ prosody-modules +``` + +To update: + +```bash linenums="1" +cd /usr/lib/prosody/prosody-modules/ +sudo hg pull --update +``` + +#### Import SSL using certbot + +Issue following commands to get the SSL activated for Prosody: + +```bash linenums="1" +sudo certbot renew --deploy-hook "prosodyctl --root cert import /etc/letsencrypt/live" +sudo prosodyctl --root cert import /etc/letsencrypt/live +sudo prosodyctl cert generate localhost +``` + +#### Configure + +The configuration file for prosody is very well documented and only needs minor tweaks. However, it is lot of commenting and to keep this readable, I have put my configuration here that can either be directly pasted or can be compared to update the default conf file. Either way, first you would need to open the config file: + +`sudo nano /etc/prosody/prosody.cfg.lua` + +Now the working config file for me is as shown below and can be compared to amend or can be directly copy pasted. + +Bear in mind that all references to `domain.name` must be replaced with your registered domain name. + +```lua linenums="1" +admins = {"admin1@im.domain.name"} -- (1) + +plugin_paths = {"/usr/lib/prosody/prosody-modules" } +consider_bosh_secure = true +cross_domain_bosh = true +modules_enabled = { + + -- Generally required + "roster"; -- Allow users to have a roster. Recommended ;) + "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in. + "tls"; -- Add support for secure TLS on c2s/s2s connections + "dialback"; -- s2s dialback support + "disco"; -- Service discovery + + -- Not essential, but recommended + "carbons"; -- Keep multiple clients in sync + "pep"; -- Enables users to publish the1ir mood, activity, playing music and more + "omemo_all_access"; -- xep-0060 for enabling omemo access to non subscribers + "private"; -- Private XML storage (for room bookmarks, etc.) + "blocklist"; -- Allow users to block communications with other users + "vcard"; -- Allow users to set vCards + + -- Nice to have + "version"; -- Replies to server version requests + "uptime"; -- Report how long server has been running + "time"; -- Let others know the time here on this server + "ping"; -- Replies to XMPP pings with pongs + "register"; -- Allow users to register on this server using a client and change passwords + "mam"; -- Store messages in an archive and allow users to access it + --"mam_muc"; -- store group chat messages + + -- Admin interfaces + "admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands + --"admin_telnet"; -- Opens telnet console interface on localhost port 5582 + + -- HTTP modules + "bosh"; -- Enable BOSH clients, aka "Jabber over HTTP" + "websocket"; -- XMPP over WebSockets + "http_files"; -- Serve static files from a directory over HTTP + "http_upload"; -- module to enable file upload in group chat + + -- Other specific functionality + "groups"; -- Shared roster support + "proxy65"; -- Enables a file transfer proxy service which clients behind NAT can use + "smacks"; + "csi"; + "cloud_notify"; + "conversejs"; +} + +modules_disabled = { + -- "offline"; -- Store offline messages + -- "c2s"; -- Handle client connections + -- "s2s"; -- Handle server-to-server connections + -- "posix"; -- POSIX functionality, sends server to background, enables syslog, etc. +} + +allow_registration = false + +c2s_require_encryption = false + +s2s_require_encryption = true + +s2s_secure_auth = true + +s2s_secure_domains = { "domain.name" } -- (2) + +pidfile = "/var/run/prosody/prosody.pid" + +authentication = "internal_hashed" + +archive_expires_after = "1w" -- Remove archived messages after 1 week + +log = { + info = "/var/log/prosody/prosody.log"; -- Change 'info' to 'debug' for verbose logging + error = "/var/log/prosody/prosody.err"; + -- "*syslog"; -- Uncomment this for logging to syslog + -- "*console"; -- Log to the console, useful for debugging with daemonize=false +} + +certificates = "certs" + +----------- Virtual hosts ----------- +-- You need to add a VirtualHost entry for each domain you wish Prosody to serve. +-- Settings under each VirtualHost entry apply *only* to that host. + +VirtualHost "localhost" + +VirtualHost "im.domain.name" -- (3) + +------ Components ------ +---Set up a MUC (multi-user chat) room server on conference.example.com: + Component "conference.im.domain.name" "muc" -- (4) + restrict_room_creation = "local" +``` + +1. :bulb: Replace with your registered domain name. +2. :bulb: Replace with your registered domain name. +3. :bulb: Replace with your registered domain name. +4. :bulb: Replace with your registered domain name. + +Once completed, save it and proceed to next steps. + +```bash linenums="1" +sudo service prosody start +sudo service prosody stop +sudo service prosody start -v +sudo service prosody stop + +## Enable prosody as a service so it restarts each time after system reboot + +sudo systemctl is-enabled prosody.service +sudo service prosody restart +``` + +#### Add User + +Use `prosodyctl` command to add user like so: + +`sudo prosodyctl adduser admin1@im.domain.name` + +and then provide password for the user. Ofcourse you must add as many users as you need and bear in mind the conf file above has registration switched-off so the users must be manually added using this step. Check the manpage using `man prosodyctl` to see how to update password for an existing user and to delete a user. + +## Clients Setup + +### Conversations on Android + +Conversations is the best client for XMPP on Android and is available on playstore for a small amount or it can be installed from f-droid for free. The free version has some limitations with regards to push but I have been using it with no issues what-so-ever. + +#### OpenPGP using OpenKeyChain + +Install the OpenKeyChain app, create the key pair and trigger Conversations to start from OpenKeyChain. The other person must also have OpenPGP Key pair and you should have the public key of other person added on openkeychain instaled on your phone. Do bear in mind Conversations developer says it is an experimental feature. Although it did work perfectly fine for me while I tested with about 4 or 5 users. + +### Conversejs.org on web + +Go to the web root we defined initially and create an index.html: + +`sudo nano /var/www/html/im/index.html` + +Then add following html code in there: + +Bear in mind that all references to `domain.name` must be replaced with your registered domain name. + +```html linenums="1" + + + + + + Converse + + + + + + +
+
+

Converse

+
+
+ + + +``` + +1. :bulb: Replace with your registered domain name. + +Save the file with ++ctrl+x++, ++Y++ and ++Enter++. Once done restart the webserver as well as prosody for good measure: + +```bash linenums="1" +sudo systemctl restart apache2.service +sudo prosodyctl restart +``` + +### ChatSecure on iOS + +Now I do not have an iphone but a few of my friends do. They were able to use ChatSecure which is also an opensource app. Unfortunately ChatSecure is unable to get the images on group chat from Conversations but I am hoping that developer of ChatSecure will fix this issue sooner rather than later. + +### Desktop Client + +For desktop I found Gajim to be most polished and it can be downloaded for your OS from [here](https://gajim.org) All works great on it except for the http_upload which seems to fail for transferring images with an error "Unsecured". I am not sure what the issue is a search results did not help much - I left it because I dont really need this feature from desktop. However if someone has any ideas on how to fix this, please do leave it in the comments. The plugins on Gajim that I have applied and activated can be seen below: + +![Gajim\_2018-06-15\_17-10-11.png](../assets/images/2018/06/Gajim_2018-06-15_17-10-11.png) + +## Maintenance + +The service does generate a lot of logs and it will serve you well to delete generated logs daily using Cronjob like so + +```bash +sudo crontab -e +``` + +Then add the following on the cronjob: + +```bash linenums="1" +############## DELETE PROSODY LOG FILE ARCHIVES ########################### +MAILTO="your@email.com" +0 0 * * 0-6 rm /var/log/prosody/*.gz +``` \ No newline at end of file diff --git a/docs/posts/2018-12-05-metabase-a-bi-solution-that-just-works.md b/docs/posts/2018-12-05-metabase-a-bi-solution-that-just-works.md new file mode 100644 index 0000000..1936406 --- /dev/null +++ b/docs/posts/2018-12-05-metabase-a-bi-solution-that-just-works.md @@ -0,0 +1,183 @@ +--- +title: "Metabase - A BI solution that just works" +slug: "metabase-a-bi-solution-that-just-works" +authors: [ankit] +date: + created: 2018-12-05 14:35:02 + updated: 2019-04-08 17:36:09 +draft: false +description: Metabase - A BI solution that just works +comments: true +--- + +I like exploring new solutions and anything to do with data always piques my interest. I came across this nice tool through the [list of free self hosted software](https://github.com/Kickball/awesome-selfhosted). + +!!! site-abstract "UPDATE" + I am still getting introduced to the world of docker and while most of it just works few things confuse the hell out of me. + + Anyway what happened is there was an update for Metabase and I wanted to apply it on my container and in doing so I realised that some of this post can be changed to make it a better experience from get go because after update all my config and dashboards were gone and I had to reconfigure everything. + + It could be that my lack of knowledge meant I did something wrong and faced the issue but irrespective doing it as per updated post below will ensure you dont face the issue at all because I have now tested it twice to ensure it works well. + + + +I have also added the steps to update the metabase to latest docker image as it worked for me. + +The overall impression when I opened their site can be summed up with WOW\!\! Now they offer simple docker install supported officially by them and the guide to install docker image is simple enough but the few +simple steps I followed are as below: + +1. Create an A-record for a subdomain for metabase +2. Download the official *metabse* docker image from dockerhub +3. Create an apache server conf file for metabase +4. Run the metabase docker image +5. Access metabase docker image using subdomain URL +6. Configure your database on metabase +7. Run Certbot to make the URL https +8. Done\!\! + +## Create A-record for subdomain + +Using the process for your Domain Name Regsitrar create an A-Record for +a subdomain you would want to use for metabase. For this guide we will +assume that the subdomain being created is called **"metabase"** so if +your domain name is say *yourdomain.com* then the URL to access metabase +will be *metabase .yourdomain .com*. + +!!! note + It is important that if you use a different subdomain name, please replace metabase with the subdomain name you have chosen in all Apache conf file samples in sections below. + +More detailed steps are available on previous post [HERE](./2018-06-15-prosody-behind-apache-on-debian-stretch.md/#create-a-sub-domain-record) + +## Download and Create Apache Conf + +```bash linenums="1" +docker pull metabase/metabase +cd /etc/apache2/sites-available/ +sudo nano metabase.conf +``` +Create a conf file similar to what is shown below: + +```javascript linenums="1" + + ServerName metabase.yourdomain.com + ServerAlias metabase.yourdomain.com + + ErrorLog ${APACHE_LOG_DIR}/error_metabase.log + CustomLog ${APACHE_LOG_DIR}/access_metabase.log combined + + ProxyPreserveHost On + ProxyPass / http://localhost:3000/ + ProxyPassReverse / http:/localhost:3000/ + ProxyPass "/ws2/" "ws://localhost:3000/" + ProxyPass "/wss2/" "wss://localhost:3000/" + +``` +Save this by pressing `Ctrl+X` and issue following commands to enable site and reload the apache server. + +```bash linenums="1" + sudo a2ensite metabase.conf + sudo systemctl reload apache2 +``` + +## Run Metabase docker image + +```bash linenums="1" +docker run -d -p 3000:3000 --name metabase metabase/metabase +``` +If all goes well, you should have metabase already running. If you get an error to the effect saying port 3000 is already in use, you will perhaps have to run it on another port (say 12345) but as metabase container would have been created you will need to issue following commands. + +```bash linenums="1" +docker rm metabase +docker run -d -p 12345:3000 --name metabase metabase/metabase +``` +In addition to avoid running the database through the container we must anyway move it to filesystem. Using commands below: + +```bash linenums="1" +mkdir /var/www/metabase +``` +This command will create metabase directory on the path /var/www/metabase but you can as easily chose another path as you wish. If you do, just remember to update it in next commands. + +```bash linenums="1" +docker ps +``` +This will show you the active docker containers. Copy the container ID in first column for the row where under Names you see "metabase" which is the container name we have given using previosu commands.Now copy the +database from container to local filesystem. + +```bash linenums="1" +cd /var/www/metabase +docker cp :/metabase.db ./ +``` + +Now Stop and rename the container + +```bash linenums="1" +docker stop metabase +docker rename metabase metabase_old +``` + +Finally run Metabase Docker Image while pointing it to your filesystem for database file. + +```bash linenums="1" +docker run -d -p 12345:3000 -v ~/metabase-data:/var/www/metabase -e "MB_DB_FILE=/var/www/metabase/metabase.db" --name metabase metabase/metabase +``` +The above docker command can be explained as below: + +`docker run -d `- This is telling system to start a container in detached mode. By design, containers started in detached mode exit when the root process used to run the container exits. + + ` -p 12345:3000` - This is telling docker to make the container map port 12345 to port 3000 which is the default port on which metabase starts its server. + +`-v ~/metabase-data:/var/www/metabase`- This part is telling docker to map the "metabase-data" directory in the container to "/var/www/metabase" on the filesystem. In other words, mounting the local volume at path "/var/www/metabase" onto the container in "metabase-data" directory. + +`--name metabase metabase/metabase`- Finally this part of command is telling docker to name the container "metabase" and to use the docker image "metabase/metabase" from dockerhub + + +Do bear in mind if you change the port as explained above, you will also need to change the port in apache conf file in previous step. So your apache conf file in this case will look as shown below: +```javascript linenums="1" + + ServerName metabase.yourdomain.com + ServerAlias metabase.yourdomain.com + + ErrorLog ${APACHE_LOG_DIR}/error_metabase.log + CustomLog ${APACHE_LOG_DIR}/access_metabase.log combined + + ProxyPreserveHost On + ProxyPass / http://localhost:12345/ + ProxyPassReverse / http:/localhost:12345/ + ProxyPass "/ws2/" "ws://localhost:12345/" + ProxyPass "/wss2/" "wss://localhost:12345/" + + +``` +## Access and configure on browser + +!!! note + Access your metabase using the subdomain url - *http:// metabase.yourdomain .com* and it should walk you through the initial configuration. If you do not want to add a database and just play with the tool, they have kindly provided a sample database. + + +It might be useful for you to create a "user" in your database that has "read only" access and then use that "user" when you configure metabase. Metabase will only ever need read access as it cannot be used to modify data in your database. + + +## Enable SSL + +Once you are happy with your configuration from step above, just run the certbot to enable https using letsencrypt certificate. On Debian this could be as simple as issuing the command + +```bash linenums="1" +sudo certbot +``` +Once above step is created you will have an additional conf file named **metabase-le-ssl.conf** created in the location `/etc/apache2/sites-available`. Check this and once it is there you are all set to access your new functional metabase instance on https. More detailed steps are available on previous post [HERE](./2018-06-15-prosody-behind-apache-on-debian-stretch.md/#enable-ssl-set-up-using-lets-encrypt) + +## Update version + +Updating on docker image is pretty straight forward and provided you have followed steps above should not result in you loosing all the effort once update has completed. + +```bash linenums="1" +#docker rm metabase_old +docker stop metabase + +#docker rename metabase metabase_old +docker pull metabase/metabase + +docker start metabase +``` + +From my recent messing around, I have come to realise that so long as the first start of the docker image was done using environment variables pointing to correct database directory, there is no need to run the commented lines above and a simple stop, upgrade and start should work just fine. Enjoy!!! \ No newline at end of file diff --git a/docs/posts/2020-05-19-converting-aax-audible-to-mp3.md b/docs/posts/2020-05-19-converting-aax-audible-to-mp3.md new file mode 100644 index 0000000..a0ddbd3 --- /dev/null +++ b/docs/posts/2020-05-19-converting-aax-audible-to-mp3.md @@ -0,0 +1,55 @@ +--- +title: "Converting AAX (Audible) to mp3" +slug: "converting-aax-audible-to-mp3" +authors: [ankit] +date: + created: 2020-05-19 19:36:30 + updated: 2020-05-21 11:48:26 +draft: false +description: Converting AAX (Audible) to mp3 +comments: true +--- + +Lately I have been a bit frustrated because while I subscribe to Audible services, Amazon and Google do not play nice with each other limiting me - *the owner of books with rights to listen my purchase on any device* - in my options on where I can listen. Now I am yet to find a good solution that can get my files playing on google home and not just Alexa, I guess first step was to free my audiobooks from Amazon jail. That as it turns out is rather simple to do.I must at this point mention [OpenAudible](https://openaudible.org/) which is one fine tool. However, their latest version (2.0.7 at the time of writing) added some limitations whereby you can get it to download the AAX files but not convert them to mp3 without purchasing their license. However,converting AAX to mp3 is accomplished using `ffmpeg` and I do not believe a nice GUI wrapper is what I need and hence I do not believe my money is well spent in getting a license just to achieve from a graphical user interface what I can achieve for free from the terminal with a single line.There are 3 steps in the conversion process: + + + +1. Get a copy of the AAX file you own from your audible account: This + can be done in one of two ways as listed below: + + a. Install OpenAudible and follow instructions to download the AAX + files. + b. Copy it from the filesystem of your Android phone. + +2. Obtain the `activation_bytes` for your AAX file: + a. If you installed OpenAudible, you can use the following steps: + ```bash linenums="1" + cd /opt/OpenAudible/bin/linux/ + ffprobe /home/OpenAudible/aax/name_of_the_book.AAX + ``` + b. This should give you a lot of output and a hash code. Let's say + the hashcode you get is `a6ger35cf22u03c9x16743j06f6df50a00b811c3` + ![aax\_hash\_code](../assets/images/2020/05/2020-05-1919-17-07.png) + c. Use this hashcode with following command to get the `activation_bytes`: + ```bash linenums="1" + ./rcrack path /opt/OpenAudible/bin/tables/ -h a6ger35cf22u03c9x16743j06f6df50a00b811c3 + ``` + d. This should then output the `activation_bytes` in last line - something like `hex:abc43opu` as shown below: + ![activation\_byte](../assets/images/2020/05/2020-05-1919-46-13-1.png) + + !!! info + Above steps are required only once. Keep the activation_bytes code that you obtain above safe as it can be used for converting all your audiobooks. + +3. Now use the following commands to convert AAX file to mp3: + ```bash linenums="1" + #change directory to where the AAX files are saved. If using OpenAudible it will be in /home//OpenAudible/aax + cd /home//OpenAudible/aax + ffmpeg -activation_bytes xxxxxxxx -i 'name of the book.AAX' -map_metadata 0 -codec:a libmp3lame -qscale:a 6 /home//OpenAudible/mp3/name\ of\ the\ book.mp3 + ``` + + !!! note + Remember to change xxxxxxxx with the activation_bytes code you obtained in step 2 and the name of book as well as destination path and name of the book. + +Now ofcourse you can accomplish first the Step 2 above without OpenAudible. If you would want to do so, just follow the [guidance on github](https://github.com/inAudible-NG/tables). + +Hope this will be helpful for a few. In the meantime, I am yet to work out the best way to make google home to play my audiobooks when I so desire. If anyone has any tips they will be gratefully received.Have fun !!! \ No newline at end of file diff --git a/docs/posts/2021-02-10-upgrading-php-version-on-linux-for-apache.md b/docs/posts/2021-02-10-upgrading-php-version-on-linux-for-apache.md new file mode 100644 index 0000000..28c806f --- /dev/null +++ b/docs/posts/2021-02-10-upgrading-php-version-on-linux-for-apache.md @@ -0,0 +1,43 @@ +--- +title: "Upgrading PHP version on Linux for Apache" +slug: "upgrading-php-version-on-linux-for-apache" +authors: [ankit] +date: + created: 2021-02-10 00:04:01 + updated: 2021-02-10 00:14:40 +draft: false +description: Upgrading PHP version on Linux for Apache +comments: true +--- + +1. Install the Apache module for specific php version + + ```bash + sudo apt install libapache2-mod-php7.3 + ``` + + +2. Copy the php.ini from previous version to newer version after making + a backup of the original php.ini for new version. + + ```bash linenums="1" + sudo cp /etc/php/7.3/apache2/php.ini php.ini.original + sudo cp /etc/php/7.2/apache2/php.ini /etc/php/7.3/apache2/php.ini + ``` + +3. Install specific php modules for Apache and enable the php modules + on new version of php. + + ```bash linenums="1" + sudo apt install php7.3-curl php7.3-gd php7.3-gmp php7.3-intl php7.3-mbstring php7.3-simplexml php7.3-soap php7.3-wddx php7.3-xmlreader php7.3-xmlrpc php7.3-xmlwriter php7.3-xsl php7.3-zip php7.3-xml php7.3-mysql + sudo phpenmod -v 7.3 pdo_mysql soap wddx xmlreader xmlrpc xsl zip intl gd dom curl mysqlnd gmp simplexml mysqli mbstring + ``` + +4. Disable old php version, enable new version and restart Apache + server. + + ```bash linenums="1" + sudo a2dismod php7.2 + sudo a2enmod php7.3 + sudo systemctl restart apache2 + ``` diff --git a/docs/posts/2021-03-05-tech-for-diabetics.md b/docs/posts/2021-03-05-tech-for-diabetics.md new file mode 100644 index 0000000..067e659 --- /dev/null +++ b/docs/posts/2021-03-05-tech-for-diabetics.md @@ -0,0 +1,169 @@ +--- +title: "Tech for Diabetics" +slug: "tech-for-diabetics" +authors: [ankit] +date: + created: 2021-03-05 17:50:00 + updated: 2021-03-12 13:05:15 +draft: false +description: Tech for Diabetics - As a diabetic there are a number of things we are not able to control but one thing we can do is keep tabs on our data. +comments: true +--- + +## Background + +As a diabetic there are a number of things we are not able to control but one thing we can do is keep tabs on our data and while in past it would have meant meticulously noting down BG readings in a diary, today it is much much easier with all the apps and connected services. In this article, I aim to go through the list of technologies that I am aware of and use to keep on top of my diabetic data right from my phone. + + + +## Blood Glucose Meter + +While there are a number of options available, I settled for [CareSens Dual](https://shop.spirit-health.co.uk/collections/caresens-dual). The biggest advantage with this model is that it plays very nicely with xdrip+ app although lately I am relying more on Diabox so the point is kind of moot. Apart from that, one factor we must bear in mind while chosing the device is not just the cost of the device itself but also that of testing strips as it will be a recurring expense and this device has one of the most reasonably priced testing strips. + +## Freestyle Libre 2 (FSL2) + +FSL2 became available in the UK only from Jan'21 and this or it's previous version allow for a more regular check of the BG trends. FSL1 +in my experience was a bit less accurate than FSL2. However these sensors along with the official app from manufacturer require manual +scan, don't give all datapoints and can not be calibrated which is again where xdrip+ / Diabox apps come into the picture. + +!!! info "Freestyle Libre 1 (FSL1) with Transmitter (Miaomiao / Bubble)" + Before Jan'21, in the UK we only had the option of FSL1 and as this version does not have bluetooth communication; the possibility to calibrate and get automated data points required usage of a transmitter device such as Miaomiao or Bubble. I ordered a Miaomiao transmitter back then and I still can use it with FSL2 albiet with slightly modified approach. I do it because I have the device but with FSL2 a transmitter is not needed as explained later. + + +## Freestyle Libre App + +Now the fact is I dont really use this app for anything other than activating the sensor but it is for this reason alone an app you can not avoid or do without. In order to use the sensors to feed data directly and automatically to Diabox the sensor at the time of activation should not be paired through bluetooth to this app. Now there are several ways to achieve this. One is to install the app on a completely separate phone and turn off Bluetooth on that phone. Another is just do not give this app the "Location" permission which would then not allow app access to Bluetooth. Either scenario should work in theory but I use the safest approach of activating sensor through this app on a compltely different phone (that of my daughter actually :smile:) + +## [Diabox](https://www.bubblan.org) (Especially with FSL2) + +I have been using this app only for 10 days at the time of writing but it works really well with FSL2 and as it gets the data directly from the sensor it removes the additional cost of the transmitter and that makes this a very useful app indeed. The app is available or both iOS as well as Android but from what I gathered at some point Abbot Laboratories (Manufacturers of FSL sensor) complained about he app to Google and so google was obligated to takedown this app from playstore. App therefore is available as an apk file on github and the latest release for it can be downloaded from this [GitHub Link](https://github.com/bubbledevteam/diabox/releases) The developer has a [Diabox Dev website](https://www.bubblan.org/docs/installation-guide-for-bubblan/diabox/understanding-the-ui/) with lot more information on user interface and setup etc. but I will explain my setup below. + +----- + +1. Download the latest version of the app from [GitHub Link](https://github.com/bubbledevteam/diabox/releases) + +2. Install the app - As it is not from playstore, the permission to install from unknown sources[^fn1] should be activated in Android Settings. +[^fn1]: [Reference on how to activate installation from unknown sources](https://developer.android.com/distribute/marketing-tools alternative-distribution#unknown-sources) + +3. Once installed, open the app. It will ask to scan the sensor. Once you scan, the phone will automatically pair the sensor with the Bluetooth of the Libre. + +4. Now to enable calibration tap on the sensor image as shown in screenshot below: + + ![adfd44c4c0cf4e91aeeb8792970dbf67](../assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67.png) + +5. Now tap 5 times on the text "Factory" in the last entry "Calibration Mode" as shown below: + + ![00aec12e25c74fed8e124e788850090e](../assets/images/2021/03/00aec12e25c74fed8e124e788850090e.png) + +6. This will present a dialogbox =="Sensor Magic Code"==. Type =="GODMODE"== in the dialogbox field and press "OK". + +7. This should activate the calibration mode and screen should look as shown below: + + ![4aa44c106c724c16b27129ccc3acfb3a](../assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a.png) + +8. Go back to homepage and you will now see a red coloured circular button with "+" symbol on it as you can see on the first screenshot above. + +9. Tapping on the add button will reveal an icon with a glucometer as shown below: + + ![d417b24684524a05985e737b656b55a9](../assets/images/2021/03/d417b24684524a05985e737b656b55a9.png) + +10. Tapping on the glucometer icon will open a sliding scale to provide the calibration value. + + ![8f671fb4efa542d08bdf60c1ead2756d](../assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d.png) + +11. Add your calibration and click on Save button. + +----- + +Now, the app also allows uploading the data it collects to LibreView and Nighscout. I am not so keen on LibreView web interface so I never tried uploading on that service but have it syncing with Nightscout. For Nightscout sync, you will need to have a Nightscout instance up and running[^fn2] but assuming it is in place, the steps will be simple to follow: + +1. Click on "Settings" +2. Click on "Integration" +3. Enable "Nightscout Share Server Upload" +4. Enter the URL for Nightscout instance, something like `https://your_nightscout.herokuapp.com/api/v1/` +1. Enter the password for your instance. +2. Click on `Connect Test` +3. If the test is a success, click on `Save` button. + +## [Nightscout](https://nightscout.github.io/) + +Nightscout is a fairly detailed open source solution with loads and loads of functionalities but as a type 2 user I merely use it as a +backup of my data. + +!!! danger + One key thing to note is that once you setup this server your BG data is available to anyone with access to your URL as there is no password block or similar which in my eyes is no big deal. What can anyone do with just my blood glucose data and how or why will they get access to an obscure URL anyway but if this makes you worried perhaps you can skip this part. If this is not of concern then I must say that while the setup guide[^fn2] looks very long and complex, it really isn't. They have taken care to make it so very simple that its infact easier than even completing the registration form for some of the online services we have got accustomed to and it will just work. + +To set it up you can follow the [official set-up and installation guide](https://nightscout.github.io/nightscout/new_user/). + +## [Diabetes:M](https://www.diabetes-m.com/) + +Diabetes-M is a very good app and creates some very useful and pretty reports that can be helpful during discussion with Diabetic Nurse / GP. One big advantage of using this app is that it is able to import data from Nightscout directly and keep it in sync every 15 minutes and then that data is also backed-up in Diabetes-M servers. The app also allows for automatic data sync with a number of popular Glucometers but that is a paid feature and I do not use it so I cannot comment on its reliability. For my usecase I anyway calibrate Diabox each time manually when I take the reading from finger prick and that is synched to Nightscout which is synched to Diabetes-M so the data is anyway there when I need it. Steps to sync with Nightscout are as below: + +1. Open your nightscout instance in a browser on a laptop / PC . + +2. Click on the site in sequence as shown below: + + ![2707fa8797d94ed08f1d6c44fc04ef85](../assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85.png) + +3. On resulting screen - Administration panel, check if the role "readable" exists. + + ![cc9cdbfe94474be4b87515de72d9f98c](../assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c.png) + +4. If not create it by clicking on the button `Add new Role` and in "Permissions" type `*.*.read` as shown below. + + ![053fbb025cc74ebc880f729d3dc3b6b2](../assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2.png) + +5. If it exists, go to the section "Subjects - People, Devices, etc" and click on "Add new Subject" and fill the resulting dialogbox like shown below and click `Save`: + + ![64ed999845d644239615c3b0e2aab454](../assets/images/2021/03/64ed999845d644239615c3b0e2aab454.png) + +6. This will generate the Access Token for the app and it will be shown in the table in the section: + + ![8c623ef74cdc41d8a6ba5fd05e30b32d](../assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d.png) + +7. Open the Diabetes:M app and click on the hamburger menu on top left corner of the screen. Then on the panel locate and tap on the Data Sync icon. + + ![5229542f7a364b07bbed0356ec8f3565](../assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565.png){ width="300" } + +8. On resulting screen under section "Link external sources" locate Nightscout and click on setting icon. + + ![4c718c71ade84cb7a2c9eeb3596e32c1](../assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1.png){ width="300" } + +9. Now fill the URL for your nightscout instance, something like `https://your_nightscout.herokuapp.com` + +10. Leave "Secret" empty and in in the field "Access token" type the access token shown generated in step 6 above from the browser and click `Save`. + +Direct links to appstore: + +1. [Google Playstore](https://play.google.com/store/apps/details?id=com.mydiabetes) +2. [Apple Appstore](https://itunes.apple.com/app/id1196733537?mt=8) + +## [XDRIP+](https://jamorham.github.io/#xdrip-plus) + +xdrip+ is an opensource Android app (an iOS variant exists but I havent read much about it so have no knowledge to share) and as it is not available from playstore it can be obtained directly from developer site: To use xdrip, you will also need to order a transmitter called miaomiao - It usually comes within 2 to 3 days - for me atleast it came in 2 days back in October when I started using FSL1. It is a bit of investment at about £162 but it pays for itself in long run. I ordered from their +site[^fn3]. Once you get the transmitter, the process will be like so: + +1. It will come with a USB charging cable so place it on charger. It should start blinking blue but if it does not there is a very small hole and you will need a safety pin to press and reset it. Insert the safety pin and keep it pressed for 10 seconds. Then place it on charge. +2. Once the transmitter is charged it will display green light. +3. Now there is also a strap they provide with the transmitter which you can use to place it over the libre sensor on your arm. +4. Open xdrip app and follow the xdrip+ installation guide[^fn4]. + +Once connected, it will ask you to calibrate the app with readings from two finger prick tests. You can do one and provide twice or you can do twice. I usually do it twice for each new sensor. + +## [Tidepool](https://www.tidepool.org/) + +This is a not-for-profit site which xdrip+ can directly communicate with and push the readings to every 15 minutes thus creating a backup for your data in the cloud. As I still use the miaomiao transmitter paired with xdrip+ I have created a sync from xdrip+ to tidepool. Now the good thing with tidepool is that it shows glucometer readings in a separate table and while for Diabox I have to manually enter the finger prick test data, Caresens Dual is paired perfectly with xdrip and every single time I take a finger prick test, xdrip+ automatically fetches the reading from meter via Bluetooth and then that reading is fed into Tidepool which allows me to see my BG data at one place like so: + +![tidepool](../assets/images/2021/03/tidepool.png) + +## Eufy Smartscales + +Eufy smartscale is very reasonably priced and I ordered it from Amazon. The scale is reliable, uses standard 3x "AAA" battery which last for years not months. The app interface is good too. One drawback perhaps is that data is only accessible through app on the phone and not through any website. It does sync weight with google fit so that can be accessed and shared across other services if one is so inclined but rest of it will need to be manually captured for any statistical fun. However, if I knew before what I know now I would have perhaps opted for a device from [this list](https://github.com/oliexdev/openScale/wiki/Supported-scales-in-openScale) as then I could have had my data collected through the open source app [openScale](https://play.google.com/store/apps/details?id=com.health.openscale.pro) and would have had better freedom on how to move it around. Hope this list is useful. If there are any questions, please do not hesitate to ask. :smile: + +----------- + +[^fn2]: [Guide to setup Nightscout Instance](https://nightscout.github.io/nightscout/new_user/) + +[^fn3]: [Site to order MiaoMiao](https://miaomiao.eu/) + +[^fn4]: [XDRIP+ installation guide](https://androidaps.readthedocs.io/e...p.html#connect-libre-transmitter-start-sensor) \ No newline at end of file diff --git a/docs/posts/2023-01-25-jupyterlite- on-github-enterprise-with-panel-enabled.md b/docs/posts/2023-01-25-jupyterlite- on-github-enterprise-with-panel-enabled.md new file mode 100644 index 0000000..6f3e66e --- /dev/null +++ b/docs/posts/2023-01-25-jupyterlite- on-github-enterprise-with-panel-enabled.md @@ -0,0 +1,125 @@ +--- +title: "JupyterLite on Github Enterprise with Panel enabled" +slug: "jupyterlite-on-github-enterprise-with-panel-enabled" +authors: [ankit] +date: + created: 2023-01-25 17:50:00 + updated: 2023-01-25 17:50:00 +draft: false +description: JupyterLite on Github Enterprise with Panel enabled - Steps to build JupyterLite on windows powershell with Panel and local file access and to host it on restricted Github Enterprise. +comments: true +--- + +# JupyterLite on Github Enterprise with Panel enabled + +Recently I found myself in a scenario where I had access to Github Enterprise but was limited to a windows machine. Now I wanted to host JupyterLite on Github Enterprise so it can be used by some other people on my team. Challenge was the "Actions" on this instance of Github enterprise were disabled and so I had to build Jupyterlite locally and push it on Github. I figured while at it, I might as well enable the "Panel" and few other dependencies. The steps that worked for me are documented here. This is ofcourse assuming that Python is already installed on the device. + +The final hosted JupyterLite can be seen in action [here](https://mgw.dumatics.com/jupyterlite_panel_dist/lab/index.html). + +The steps below created a Jupyterlite instance that allows use of Panel using the `%pip install panel` magic command, and if used on Chrome or its derivatives it also allows exploring local file system. + + + +## Create and activate Jupyterlite Environment + +```bash linenums="1" +mkdir panel_lite +cd .\panel_lite\ +py -m venv panel_v +.\panel_v\Scripts\activate +pip install --upgrade pip +``` + +## Install jupyterlite and other extensions + +```bash linenums="1" +pip install --pre jupyterlite +pip install jupyter-bokeh ipython ipywidgets jupyterlab-drawio jupyterlab-markup jupyterlab-myst jupyterlab-pygments jupyterlite-p5-kernel jupyterlite-xeus-sqlite libarchive-c matplotlib matplotlib-inline matplotlib-venn myst-nb myst-parser nbconvert numpy openpyxl pandas pandocfilters pkginfo pyopenssl python-dateutil python-dotenv pyviz-comms pyxlsb scipy sql SQLAlchemy sqlparse tornado widgetsnbextension xlrd XlsxWriter zipp jupyterlab-filesystem-access +``` + +## Prepare build directory + +```bash linenums="1" +mkdir jupyterlite_panel +cd .\jupyterlite_panel\ +mkdir pypi +cd .\pypi\ +wget "https://cdn.holoviz.org/panel/0.14.2/dist/wheels/bokeh-2.4.3-py3-none-any.whl" -outfile "bokeh-2.4.3-py3-none-any.whl" +wget "https://cdn.holoviz.org/panel/0.14.2/dist/wheels/panel-0.14.2-py3-none-any.whl" -outfile "panel-0.14.2-py3-none-any.whl" +``` + +## Make a record of all that you have installed. + +```bash linenums="1" +pip freeze > requirements.txt +``` + +## Including any existing notebooks + +If you have some existing notebooks or files you would want to include on the hosted version of Jupyterlite, you must create a directory and name it `files` + +## Build Jupyterlite and serve locally to test + +```bash linenums="1" +jupyter lite build --output-dir ./dist +cd .\dist\ +py -m http.server 8000 +deactivate +``` + +The folder structure after build should look somewhat like below: + +```bash linenums="1" +panel_lite:. +├───.cache +├───dist +│ ├───api +│ ├───build +│ ├───doc +│ ├───extensions +│ ├───files +│ ├───kernelspecs +│ ├───lab +│ ├───pypi +│ ├───repl +│ ├───retro +│ └───tree +├───files +│ ├───data +│ └───sample.ipynb +├───pypi +└───panel_v +``` + +![Directory Structure Overall](../assets/images/2023/01/3.png) +![Directory Structure of built dist folder](../assets/images/2023/01/4.png) + +## Push it to Github Enterprise + +Github Desktop is the easiest way to do it. + +Open Github desktop and create new reporsitory: + +![Create New Repository](../assets/images/2023/01/1.png) + +On Github desktop point the Local Path field to `\panel_lite\jupyterlite_panel\dist` and do the initial commit and push to origin. + +![Provide Local Path](../assets/images/2023/01/2.png) + +## Host Jupyterlite as Github pages + +* Click on button `View on Github` on Github Desktop. + +![Open Github Enterprise](../assets/images/2023/01/5.png) + +* Github Enterprise will open in browser to the created repository + +![Enable Pages on Github Enterprise](../assets/images/2023/01/6.png) + +* Click on Settings > Pages +* select Branch: master (or main) and root as source. +* Click Save and the message should be displayed in green box with the URL to access Jupyterlite. + +## Finally open the URL to access JupyterLite + +![JupyterLite hosted on Github Enterprise](../assets/images/2023/01/7.png) \ No newline at end of file diff --git a/docs/posts/2023-02-26-git-basics.md b/docs/posts/2023-02-26-git-basics.md new file mode 100644 index 0000000..67a71d2 --- /dev/null +++ b/docs/posts/2023-02-26-git-basics.md @@ -0,0 +1,164 @@ +--- +title: "Git Basics" +slug: "git-basics" +authors: [ankit] +date: + created: 2023-02-26 17:50:00 + updated: 2023-02-26 17:50:00 +draft: false +description: Basic overview of what GIT is and how to use it +comments: true +--- + +## Basics of Git + +Recently, I was asked to help people understand what is this whole business with GIT and I ran a few sessions on the topic specifically keeping in mind that my audience consisted of tech enthusiasts with minimal tech background. The content below is how I explained and as it went down well, I figured it may be helpful to someone else too; hence this post. :smile: + + + +### Version Control System + +To understand the tool git lets first start by understanding what problem does it actually solve. At the most basic level git is a version control system. What this means is that it allows automated control of maintaining different versions of a digital asset such as a text file, CV, or indeed code files for a software. Now for simpler things like CV or text file one may not need something as sophisticated and complex as git but when it comes to maintaining assets for a software it is indeed a very useful tool. + +To understand how significant this is, lets put it in perspective of a typical business operations scenario completely unrelated to software development: + +* Say there was an RFP response on which multiple people from Sales, Marketing, Pursuit and Technical team were helping prepare a response. +* Each team will complete one section of the response document relevant to their area. +* This will then all need to be integrated into the final response and reviewed by the Sales Lead. +* Any changes that Sales Lead identifies will need further changes which will then again need to be amended on the document. + +Even with change tracking enabled in MS Word, we all know how painful this entire exercise is. So much so that at times we try doing it together so all changes can be done once or we opt for the approach of making changes sequentially where one section is completed by one team before another can be started by another team. This when we have one document!!! + +Now imagine if we had 1000s of such documents - that is a real scenario for software developers as each software has multiple files that may need input from multiple people. So having an automated version control helps save time because it, at the most basic level, saves time on integrating changes carried out by different people or teams that were carried out in parallel. + +Now when it comes to version control there are two main ways in which it can be achieved: + +* **Centralised Version Control System**: In our RFP example, the approach where everyone gathers together to carry out change on the main version will be a good simulation of centralised version control. What this means is that the changes to digital asset are done at one central location which is tightly controlled. This might as well be right approach for a smaller undertaking such as our RFP example but when it comes to software development it is not considered to be the best. + +* **Distributed Version Control System**: This is loosely what would have been the approach in our RFP example if people were to carry out changes on their copy of document which will then be merged by Sales Lead to prepare the final response. Basically a distributed version control system works on the principle that each contributor to the change of digital asset will make change on their local copy and then submit the change for version maintenance to the version controller. Git as a system shines in this approach of distributed version control. + +### Working Directory + +Directory is technically correct name for what are called folders in Windows Operating System and **Working Directory** is the directory in which the user is currently working. For example, let's say I create a folder called "Project_1" in windows on path "C:/Documents" and save a python script in that folder, then the working directory will be "Project_1" and working directory path will be "C:/Documents/Project_1". + +In order to version control this file, one can use git but this will include understanding the steps of how to go about it as explained in following sections. + +### Initiatlise + +Now when let's say the script file script.py is created by developer. It is not being tracked by git at this time. Now if we want it tracked by git, we need to first initiate git on the working directory. This is done using the command: `git init` but before typing this on command line, one needs to first get into the working directory on command line or terminal. + +In our example this will be done like so: + +```bash +cd C:/Documents/Project_1 +git init +``` + +This will create a `.git` directory (folder) inside the working directory. + +This is equivalent of git software saying it is now ready to start tracking but it will still need to know what exactly we want it to track. This is what `git add` does. + +### Add + +To tell git what we want it to track, we have to use the command `git add `. However, if there are 100 script files in directory it will be very cumbersome to type every single filename and as a shortcut one can use dot notation for current working directory which is dot(.) and the command can be issued as: + +```bash +## To add all content of the working directory +git add . + +## To add specific file say script.py +git add script.py +``` + +This tells git that we want all files and directories (folders) in the current working directory to be tracked. + +At this point, git is basically aware that it has to monitor changes on these files but it will not assume that every change we have made needs to be applied to maintained version so when we have added these files, we have basically also just said prepare these files for finalising their version - In other words we have asked git to **stage**. + +In order to finalise the versioning, we have to now tell this specifically to git which is done using `commit`. This will also be reflected in the tracking status which can be checked using `status` + +### Status + +One can check current tracking status of various files and directories on the git initialised working directory by using the command: + +```bash +git status +``` + +### Commit + +So we have got git to stage the files and now we want it to label the latest changes as a new version and this is achieved using the command: + +```bash +git commit -m +``` +This command ensures that git now makes the latest changes baseline and still keep record of previous changes. This is especially useful if in case we want to revert to a previous version for some reason - say we found that in latest version there were quite a few mistakes which will need to be rewworked and until then previous version is what we want to keep as baseline for anyone who wants to refer and make changes to. This reverting can be achieved using `revert` + +### Revert + +Now reverting to a previous version requires that we know the commit id that git applied to previous commits and then identify the exact commit id to which we want git to revert to. This can be achieved by checking git logs, so the sequence to git revert will be like so: + +```bash +## Find the commit id to revert to +git log + +## Copy the commit id of the version to revert to and issue following command +git revert +``` + +Now at this point, all changes are being tracked on the local machine of the user, so how can this help with collboration. This is achieved by synchronising the latest version on local machine to a central server. This could be a server hosted by an organisation or it can be something public like Github, Gitlab and such. As GitHub is most frequently used in enterprise environment, lets see how that works. + +Github basically is a web based utility which acts as a remote location where we can push our finalised version to be saved in what is called a **github repository** for other collborators to then download (clone) as their local copy and work on. Once each poarty has made changes, the can each push their changes to the github with help of git and the version control will be applied automagically or in some instance with minimal manual intervention from the maintaining or one pushing the changes. + +```plantuml +@startuml +!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml +!define DEVICONS https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons +!define FONTAWESOME https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/font-awesome-5 +!include FONTAWESOME/users.puml +!include FONTAWESOME/server.puml +!include DEVICONS/git.puml +!include FONTAWESOME/laptop_code.puml +!include FONTAWESOME/folder.puml +!include FONTAWESOME/file_alt.puml +!include DEVICONS/git_commit.puml +!include DEVICONS/github.puml +!include DEVICONS/git_branch.puml +''https://github.com/tupadr3/plantuml-icon-font-sprites/blob/master/font-awesome-5/index.md +HIDE_STEREOTYPE() + +AddElementTag(wip, $bgColor=red) + +Person(dev,"User") +System(laptop,"Local Device",$sprite="laptop_code") +System(git,"Git on local device",$sprite="git") +System(github,"GitHub (Remote)",$sprite="github") +Rel_R(dev,laptop,"Make changes") +Rel_R(laptop,git,"Tracked by Git") +Rel_R(git,github,"Push commits") + +System_Boundary(OnDevice, "On Device"){ + Component(folder, "Working Directory",$sprite="folder"){ + System(file, "Working File",$sprite="file_alt") + Component(git_tracker, "GIT Tracker",$sprite="git"){ + System(a_file, "Add File",$sprite="file_alt", $tags = "wip") + System(c_file, "Commit File",$sprite="git_commit", $tags = "wip") + Rel_D(a_file,c_file,"git commit -m ") + } + Rel_R(file,a_file,"git add ./") + } +} + +System_Boundary(Remote_Repository, "Github"){ + System(repo, "main repo",$sprite="git_branch") +} +Rel_R(c_file,repo,"git push origin main") +Lay_D(git, repo) +Lay_R(a_file,c_file) +Lay_D(laptop,file) +Lay_D(git,a_file) +Lay_D(laptop,folder) + +@enduml +``` + +There is lots going on in this last bit so lets break it down to digestable chunks of information in next session. \ No newline at end of file diff --git a/docs/posts/2023-02-28-git-jargon.md b/docs/posts/2023-02-28-git-jargon.md new file mode 100644 index 0000000..b3a54de --- /dev/null +++ b/docs/posts/2023-02-28-git-jargon.md @@ -0,0 +1,75 @@ +--- +title: "Git Jargon Explained" +slug: "git-jargon" +date: + created: 2023-02-28 17:50:00 + updated: 2023-02-28 17:50:00 +authors: [ankit] +draft: false +description: Recap on Git basics and explanation of some git jargon +comments: true +--- + +## Git Jargon + +Before we delve into the topic of how collaboration happens using git, lets get some terminology out of the way. + + + +### `repo` + +When talking to techy chaps, one will encounter the word `repo` very often. However, `repo` is just a shortform for the complete word `repository`. + +### `repository` + +Now `repository` in git speak is basically specific to a project and is nothing but a fancy alias for the **working directory** where all the digital assets being tracked for the project are placed. + +### `root` + +The term `root` when used with reference to a folder, directory, repo or repository is basically the directory in which all the digital assets of your project are stored. This directory may or may not contain other sub directories. + +### `remote` + +`remote` is a way to refer to server. So if a techy were to say "I have updated File X on remote" - it will basically translate in plain English to something like this - "I updated the File X on my laptop and have then also taken required actions to get those updates reflected on the copy saved on the server." + +### `push` + +This refers to sending updates carried out (commited) on a local machine to the server (remote). Fairly frequently one may come across statements when checking for status updates on the lines of "I have pushed my changes to remote" which in normal English means "I made required changes on my local machine, committed them and then sent (pushed) them to the server (remote)" + +### `pull` + +This refers to getting updates from the server (remote) on to the local machine. This is an activity typically carried out before one is planning to make any changes or updates to last known version. So if say a task is assigned to an individual for updating file , a reply can be "Alright, I will pull the latest from remote and make changes and will let you know once I have pushed my changes back." which will translate to "Alright, I will get the latest copy from server, make the changes you have asked for and then commit those changes and send it back as updated version on the server" + +### `main` + +This refers to the final / published version of project's repository. + +### `branch` + +This term is more of a concept really. You see `branch` is a mechanism to carry out changes without impacting the main version and therefore a `branch` is basically just a new or separate version of the main repository where one can make changes to their heart's content without worrying about messing up with the last known final version. + +### `merge` + +Once the experimental changes in a `branch` are completed and proven not be breaking any other digital assets, it is desirable indeed to get these changes reflected on the main version and this action of bringing digital assets in `main` to reflect same changes as that on the `branch` is called `merge`. + +### `modified` + +In git speak, any changes (updates, additions, deletions) to a digital asset (including deletion of entire digital asset) then that digital asset will be identified as `modified` + +### `staged` + +The `modified` digital assets are not automatically assumed to contribute a version change and that is only done when those changes are added explicity by issuing the command `git add ` and at this point the changes are said to be staged. + + +## Recap + +With this in mind, the flow of GIT can now be explained as below: + +1. To work with Git, you first initialise it on a directory which will make it a `Repository` +2. Once initialised, Git creates a hidden firectory called `.git` which is used to keep track of changes in the initialised directory. +3. At this point, we need to make Git aware of the files in this repository which we want Git to track and in doing so we `stage` those digital assets. +4. From this point on, any changes made to digital assets in project folder can be tracked. +5. If a digital asset which is being tracked is changed, it gets the status of `modified`. +6. Any digital asset with status must be `staged` before it can be passed on for version control. +7. Once `staged` files must be `committed` so that the changes can be treated as the latest version snapshot. +8. As each commit is tracked by Git, it is possible to revert to a previous version by first identifying the commit id one wants to revert to using `git log` and then providing that commit id through `git revert ` \ No newline at end of file diff --git a/docs/posts/2023-03-29-read-excel-csv-recursive.md b/docs/posts/2023-03-29-read-excel-csv-recursive.md new file mode 100644 index 0000000..1d2f589 --- /dev/null +++ b/docs/posts/2023-03-29-read-excel-csv-recursive.md @@ -0,0 +1,204 @@ +--- +title: "Python Function read excel / csv files from a given directory and its subdirectories" +slug: "read-excel-csv-recursive" +authors: [ankit] +date: + created: 2023-03-29 17:16:00 + updated: 2023-04-18 20:26:00 +draft: false +description: A function written in Python that allows user to provide parameters and then checks all excel and csv files to extract data where conditions are met. +comments: true +--- + +## Code + +The code for the function is as shown below: + + + +```python linenums="1" +import os +import pandas as pd +import numpy as np +from datetime import datetime + +def extract_data(directory_path, columns_to_extract, date_columns=[], rows_to_skip=0, output_filename='output.csv'): + """ + Extracts data from all Excel and CSV files in the specified directory and its subdirectories that contain all the + specified columns. + + :param directory_path: The path to the directory to search for Excel and CSV files. + :param columns_to_extract: A list of column names to extract from each file. + :param date_columns: A list of column names to parse as dates using pd.to_datetime(). + :param output_filename: The path and filename to save the extracted data in a csv + :return: A DataFrame containing the extracted data from all Excel and CSV files that contain the specified columns, + or None if no files contain the specified columns. + """ + start_time = datetime.now() + extracted_data = pd.DataFrame() + files_with_no_columns = [] + sheet_read = '' + extracted_columns = columns_to_extract.copy() + extracted_columns.extend(['File Name','SubDir','CreatedDate','LastModifiedDate']) + + for root, dirs, files in os.walk(directory_path): + for file in files: + print('Started reading ' + file + ' at: {}'.format(datetime.now()) + ' ...') + if file.endswith('.xlsx') or file.endswith('.xls') or file.endswith('.csv'): + file_path = os.path.join(root, file) + columns_found_outer = False + if file.endswith('.csv'): + df = pd.read_csv(file_path,skiprows=rows_to_skip) + for col in columns_to_extract: + if col in df.columns: + columns_found_outer = True + #print(col + 'in csv true loop') + else: + columns_found_outer = False + #print(col + 'in false loop') + break + else: + dfs = pd.read_excel(file_path, sheet_name=None,skiprows=rows_to_skip) + for key in dfs.keys(): + columns_found = False + for col in columns_to_extract: + if col in dfs[key].columns: + columns_found = True + #print(col + 'in true loop') + else: + columns_found = False + #print(col + 'in false loop') + break + if columns_found: + columns_found_outer = True + df = dfs[key] + sheet_read = key + break + if columns_found_outer: + if len(date_columns) > 0: + for col in date_columns: + if col in df.columns: + df[col] = pd.to_datetime(df[col]) + df['File Name'] = file + df['SubDir'] = os.path.basename(root) + + createx = modx = os.path.getctime(file_path) + xcreate = datetime.fromtimestamp(modx) + df['CreatedDate'] = xcreate + + modx = os.path.getmtime(file_path) + xmod = datetime.fromtimestamp(modx) + df['LastModifiedDate'] = xmod + extracted_data = pd.concat([extracted_data, df[extracted_columns]], ignore_index=True) + #print(xmod) + if file.endswith('.csv'): + print(file + ' has been read') + else: + print(file + ' has been read and it was last modified on ' + xmod.strftime('%Y-%m-%d') + '. The name of the sheet that was read is: ' + sheet_read) + else: + files_with_no_columns.append(file_path) + if len(files_with_no_columns) > 0: + print("The following files do not contain the specified columns:") + for file_path in files_with_no_columns: + print(file_path) + if not extracted_data.empty: + extracted_data = extracted_data.applymap(lambda s: s.upper() if type(s) == str else s).fillna('') + extracted_data.to_csv(output_filename) + print('Started at: {}'.format(start_time) + '. \nEnded at: {}'.format(datetime.now()) + '. \nTime elapsed (hh:mm:ss.ms) {}'.format(datetime.now() - start_time)) + return extracted_data + else: + print("Specified columns do not exist in any file in the provided directory.") + print('Started at: {}'.format(start_time) + '. \nEnded at: {}'.format(datetime.now()) + '. \nTime elapsed (hh:mm:ss.ms) {}'.format(datetime.now() - start_time)) + return None +``` + +## Explanation + +1. The function `extract_data` takes in the following parameters: + + * *directory_path*: the path to the directory to search for Excel and CSV files + * *columns_to_extract*: a list of column names to extract from each file + * *date_columns*: a list of column names to parse as dates using pd.to_datetime() + * *rows_to_skip*: the number of rows to skip when reading each file + * *output_filename*: the path and filename to save the extracted data in a CSV file + +2. The function starts by creating an empty DataFrame called `extracted_data`. + +3. It also initializes variables `files_with_no_columns` and `sheet_read` to track files that do not contain the specified columns and to keep track of the current sheet being read when extracting data from Excel files. + +4. The list `extracted_columns` is created by copying the input `columns_to_extract` list and adding additional columns for the `filename`, `subdirectory name`, `file creation date`, and `last modified date`. + +5. The function then loops through all the files in the specified directory and its subdirectories using os.walk(). + +6. For each file, it checks if it has a ".xlsx", ".xls", or ".csv" extension. + +7. If the file is a CSV file, the function reads it into a DataFrame using `pd.read_csv()`, skipping the number of rows specified by `rows_to_skip`. + +8. It then checks if all the columns in `columns_to_extract` are present in the DataFrame. If so, it sets `columns_found_outer` to `True` and proceeds to the next step. If not, it sets `columns_found_outer` to `False` and moves on to the next file. + +9. If the file is an Excel file, the function reads all sheets in the file into a dictionary of DataFrames using `pd.read_excel()` and `sheet_name=None`. It then loops through all the sheets and all the columns in `columns_to_extract`, checking if each column is present in each sheet's DataFrame. If all the columns are present in a sheet, it sets `columns_found` to `True` and proceeds to the next step. If not, it sets `columns_found` to `False` and moves on to the next sheet in the same Excel file. If at least one sheet contains all the specified columns, the function combines the DataFrames of all sheets into one using `pd.concat()`. + +10. If `columns_found_outer` is `True`, it extracts the `filename`, `subdirectory name`, `file creation date`, and `last modified date` using `os.path.basename()`, `os.path.getctime()`, and `os.path.getmtime()`, and adds them as new columns to the DataFrame. It then appends the DataFrame to the `extracted_data` DataFrame. + +11. If `columns_found_outer` is `False`, it increments the `files_with_no_columns` counter and prints a warning message. + +12. Finally, the function checks if any files contained the specified columns. If not, it returns None. Otherwise, it sorts the `extracted_data` DataFrame by filename and saves it to a CSV file using `to_csv()`. It then prints the number of files processed, the number of files that did not contain the specified columns, and the path to the output file. + +## Sample Usage + +The function can be called in python as shown below: + +```python +# set directory path +directory_path = './Work' # Path for the directory where all the files containing data for extraction are to be searched + +# set the columns you want to extract +columns_to_extract = ['Region','Country', 'Product Number','Quantity','Date of Sale'] +date_col = ['Date of Sale'] + +# set the rows to skip +skiprows = 0 #this basically will be number of rows in begining of the files which must be skipped to reach the header row of the data +output_filename = 'Regional Sales Data.csv' + +#Call function +df = extract_data(directory_path,columns_to_extract,date_col,skiprows,output_filename) +``` + +Now, assuming there were 12 separate files for past 12 months inside the folder then so long as all those files, irrespective of whether they are csv or excel, have the columns `Region`,`Country`, `Product Number`,`Quantity`,`Date of Sale`; the function will read the files and extract the data and return it to the dataframe `df`. + +## GUI Implementation + +A very basic GUI implementation of above function using PySimpleGUI with all code is available [here](https://github.com/pubmania/extract_excel_csv_data_recursively) + +### Usage +The script can directly be copied to a Jupyter cell or can be run from terminal. Following command should ensure all dependencies are installed: + +```python +py -m pip install pandas, numpy, pysimplegui +``` + +Some things the GUI takes care of are: + +* Allows selection of columns to be extracted from a sample `.csv` file +* Allows user to specify which of the selected columns should be parsed as `date` +* Gives a date based filename to `output` +* Shows colour coded log for which files were read in green and which were ignored in red background. + +### Screenshots + +Some screenshots of the resulting app are as shown below: + +#### Empty Form +![image](../assets/images/2024/232877297-2d3a2914-8a7f-4f20-bba1-af8d0e92c039.png) + +#### Filled Form +![image](../assets/images/2024/232879216-22e3b81c-10d0-449f-80d1-30725c24b5ff.png) + +#### Displays extracted output +![image](../assets/images/2024/232881326-f2ecdd14-8bf6-4f7b-bcd4-3e5de4f361a2.png) + +#### Displays filename of the output and location where it is saved +![image](../assets/images/2024/232881685-6a0eafd9-a5be-464b-ae0c-5814b101fc02.png) + +#### Colour coded log +![image](../assets/images/2024/232882657-dd1e4e69-26a3-4849-8e94-9811cedab6d7.png) \ No newline at end of file diff --git a/docs/posts/2024-08-13-logseq-customisation-for-project-management-teamplate.md b/docs/posts/2024-08-13-logseq-customisation-for-project-management-teamplate.md new file mode 100644 index 0000000..c47a74f --- /dev/null +++ b/docs/posts/2024-08-13-logseq-customisation-for-project-management-teamplate.md @@ -0,0 +1,1026 @@ +--- +title: "Logseq Customisations for Project Management Template" +slug: "logseq-customisation-for-project-management-teamplate" +authors: [ankit] +date: + created: 2024-08-13 07:15:00 + updated: 2024-08-13 08:15:00 +draft: false +description: Notes to create a functional project logs template for Logseq graphs. +comments: true +--- + +## Background + +While the overall planning of project timeline gets lot of attention in the world of software, the most important aspect of project management in my experience is maintaining and tracking Issues and Actions. This in normal project management practice is carried out through the use of an `Actions Log` and an `Issues Log`. In addition any medium complexity project invariably will have internal and external dependencies / constraints, risks which I tend to track on `Constraints Log` and `Risks Log`. Finally, every project has decisions that I track on a `Decisions Log`. + +Additionally, any opportunities that I identify during the course of project that are not in the scope of my project I capture those too in an `Opportunities Log` + +Now all these logs have fairly standard fields so I created and started using an excel template and began calling it `CARDIO Log` short for log of **C**onstraints, **A**ctions, **R**isks, **D**ecisions, **I**ssues, **O**pportunities for a given project. This has worked well for me over the past 15 years or so but there are times where in order to maintain it meant cross linking an action to an issue or a risk and so on and more often than not it would become easier to just track actions in one of the other logs and that would make it a bit chaotic. + +That problem, however, is what I thought, can be resolved using Logseq especially after starting with the template by the Logseq community user Luhman and starting with his template and explanation provided [here](https://luhmann-logseq.notion.site/A-new-approach-to-project-management-in-Logseq-8b36dd5eb25d4b9e9882742b5ee4368e). + + + +## Using logseq from browser when binary install is not possible + +When binary install is not possible, one can still use logseq from browser by navigating to the [web app demo page](https://demo.logseq.com/) from Chrome browser and then selecting a local directory where notes will be saved. It works perfectly fine except there is no option to install plugins. So inorder for issues table etc to work from broswer following steps will suffice: + +### Option 1 +* Select the directory where your notes (or graphs in logseq speak) will be saved. +* Grant permission for local file access when asked by the browser. +* Now if you will press ++ctrl+k++ it will open search box but the cusrsor goes to the omnibox (where you type the url for the page) and then you will have to either manually click into the logseq search or press `esc` key three times to be able to get the cursor back in the search box. It may be easier to just click on `Search` icon in left hand navigation at top of the screen (next to the hamburger menu). + * Alternatively configure the keyboard shortcut to `Alt+k` as that does not conflict with any other keyboard shortcut. + * To add custom shortcuts, you can navigate to the shortcuts page with g s. Press the blue button corresponding to a given shortcut and a modal should pop up. Press the keybinding you want and then press Save. +* Now search for `logseq/custom.css` and add the whole css from this [gist](https://gist.github.com/pubmania/a1a84430ab0b6ef48b0760cd128550e0). +* Then search for `logseq/config.edn` and add the whole edn from this [gist](https://gist.github.com/pubmania/200b6da0e3c5eaf4505c559b7f99e555) + +!!! site-tip "Tip" + If you were installing the binary, you can still copy the entire `css` and `edn` from above. If you do that, you can directly skip to the section - [Create Templates](#create-templates). + +### Option 2 +* Download the archive from [my github repository here](https://github.com/pubmania/logseq_project_management_logs_template/archive/refs/heads/main.zip) +* Unzip the downlaoded repository and delete the `README.md` file. +* Navigate to `journals` directory where there will be three files. Delete all these files. +* Navigate back and open the `pages` directory which will have 7 files. Except for `content.md` and `templates.md`, delete all other files. +* Now copy the `logseq` and `pages` directories into the directory where you want your notes saved. +* Open logseq from chrome and add the directory from step above where you copied the two folders. + +!!! site-tip "Tip" + If you were installing the binary, you can follow option 2 and then there will be no need to read rest of this article :smile:. + +## Customisations + +### Sample Project Log +![Screenshot_13-8-2024_15949_](../assets/images/2024/357450387-8c9a7f4c-21a4-42a7-8951-1f4b301fa269.jpeg) + +### Preparation + +- First we will ensure our actions log which will be generated using the Logseq's inbuilt feature for `To Do Lists` displays fields that we want it to display. + + - Press ++ctrl+k++ and search for `logseq/config.edn` + - In the code block search for following lines: + + ```clj linenums="1" + ;; Advanced queries `:result-transform` function. + ;; Transform the query result before displaying it. + :query/result-transforms + {:sort-by-priority + (fn [result] (sort-by (fn [h] (get h :block/priority "Z")) result)) + } + ``` + +- Now replace these with following which is slightly reduced compared to the [Source](https://discuss.logseq.com/t/add-query-input-or-function-day-of-week/18361/12) as I only needed "Deadline" for my purposes and I don't use the "Scheduled" part of the Logseq task management feature: + + ``` clj linenums="1" + ;; Advanced queries `:result-transform` function. + ;; Transform the query result before displaying it. + :query/result-transforms + {:sort-by-priority + (fn [result] (sort-by (fn [h] (get h :block/priority "Z")) result)) + :add-task-attrs (fn [result] + (def months {1 "January" 2 "February" 3 "March" 4 "April" 5 "May" 6 "June" 7 "July" 8 "August" 9 "September" 10 "October" 11 "November" 12 "December"}) + (def monthName (fn [dd] + (get months (int dd)) + )) + + ;; source: https://discuss.logseq.com/t/add-query-input-or-function-day-of-week/18361/12 + (def days {0 "Saturday" 1 "Sunday" 2 "Monday" 3 "Tuesday" 4 "Wednesday" 5 "Thursday" 6 "Friday"}) + (def weekDay (fn [date] + (def month (quot (mod date 10000) 100)) + (def month6 (quot (- month 8) 6)) + (def year6 (+ (quot date 10000) month6)) + (def yearnum (mod year6 100)) + (def century (quot year6 100)) + (def d (mod (+ (mod date 100) (quot (* 13 (inc (- month (* month6 12)))) 5) yearnum (quot yearnum 4) + (quot century 4) (* 5 century)) 7)) + (get days d) + )) + + (def suffixes {0 "th" 1 "st" 2 "nd" 3 "rd" 4 "th" 5 "th" 6 "th" 7 "th" 8 "th" 9 "th"}) + (def positionalSuffix (fn [dd] + (if (or (= dd "11") (= dd "12") (= dd "13")) + (get suffixes 0) + (get suffixes (int (subs dd (count dd) 1))) ) + )) + + (def token (fn [s] (str "⟨" s "⟩"))) + (def format + (-> (get (js->clj (call-api "get_user_configs")) "preferredDateFormat") + (clojure.string/replace "do" (token "1")) + (clojure.string/replace "dd" (token "2")) + (clojure.string/replace "d" (token "3")) + (clojure.string/replace "EEEE" (token "4")) + (clojure.string/replace "EEE" (token "5")) + (clojure.string/replace "EE" (token "6")) + (clojure.string/replace "E" (token "7")) + (clojure.string/replace "MMMM" (token "8")) + (clojure.string/replace "MMM" (token "9")) + (clojure.string/replace "MM" (token "10")) + (clojure.string/replace "M" (token "11")) + (clojure.string/replace "yyyy" (token "12")) + (clojure.string/replace "yy" (token "13")) + )) + + (def parseDate (fn [date] + (if-not date nil + (let [ + regex (re-pattern "(\\d{4})(\\d{2})(\\d{2})") + [_ yyyy mm dd] (re-matches regex (str date)) + yy (subs yyyy 2 4) + d (str (int dd)) + do (str d (positionalSuffix dd)) + mmmm (monthName mm) + mmm (subs mmmm 0 3) + m (str (int mm)) + eeee (weekDay date) + eee (subs eeee 0 3) + ee (subs eeee 0 2) + e eee + ] + (-> format + (clojure.string/replace (token "1") do) + (clojure.string/replace (token "2") dd) + (clojure.string/replace (token "3") d) + (clojure.string/replace (token "4") eeee) + (clojure.string/replace (token "5") eee) + (clojure.string/replace (token "6") ee) + (clojure.string/replace (token "7") e) + (clojure.string/replace (token "8") mmmm) + (clojure.string/replace (token "9") mmm) + (clojure.string/replace (token "10") mm) + (clojure.string/replace (token "11") m) + (clojure.string/replace (token "12") yyyy) + (clojure.string/replace (token "13") yy) + ) + ) + ) + )) + + + (map (fn [x] + (update x :block/properties (fn [u] + (-> u + (assoc :marker (str (get x :block/marker)) ) + (assoc :priority (str (get x :block/priority)) ) + (assoc :deadline (parseDate (get x :block/deadline)) ) + (assoc :repeated? (str (get x :block/repeated?)) ) + ) + )) + ) + result) + ) + } + ``` + +### Plugins + +- Click on `Three Dots` in top right corner of the screen and click on menu entry `Plugins` and then click on `Marketplace` +- Now install the following plugins: + - logseq-agenda + - logseq-automatic-linker + - logseq-datenlp-plugin + - logseq-diagrams-as-code + - logseq-doc + - logseq-emoji-picker-fork + - logseq-emoji-shortcodes + - logseq-luckysheet + - logseq-markdown-table + - logseq-paste-more + - logseq-plugin-automatic-url-title + - logseq-plugin-show-weekday-and-week-number + - logseq13-full-house + - logseq13-missing-commands + +### Look and Feel +- Now, I quite like the [Mia Quattro Theme](https://playerofgames.github.io/logseq-mia-theme/) that can either be installed as a theme from marketplace or just by including the following line in `logseq/custom.css` just under the comment `/*Theme*/` right at the top of the file like so: + +``` css linenums="1" +/*Theme*/ +@import url('https://playerofgames.github.io/logseq-mia-theme/mia_quattro.css'); +``` + +- However this theme had some quirks which can be refined by adding following `css` overrides: + +``` css linenums="1" +/* Override tag and note color scheme for tags from mia_quattro theme */ +a.tag{ + font-size: 100%; + color: var(--lx-accent-11,var(--ls-tag-text-color,hsl(var(--primary)))); +} + +svg.note { + color: var(--lx-accent-11, var(--rx-yellow-08)) +} + +svg.tip { + color: var(--lx-accent-11,var(--rx-blue-08)) +} + +/* Selection lists (search, tag complete, etc.) */ + +#ui__ac .chosen, +.chosen { + --ls-primary-text-color: #ee0606; + --ls-link-ref-text-color: #eaeaea; + --ls-link-ref-text-hover-color: #fafafa; + --ls-quaternary-background-color: var(--accent-dark-color); + --ls-icon-color: var(--ls-primary-text-color); +} + +#ui__ac .chosen { + background-color: var(--accent-dark-color); +} + +.menu-link.chosen { + color: var(--ls-primary-text-color) !important; +} + +/* to make todo checkbox visible */ +.form-checkbox { + --ls-page-checkbox-border-color: var(--accent-color); + + border: 1px solid var(--ls-page-checkbox-border-color); + border-radius: 5px; + opacity: 1; +} +/* blockquote tweaks (reduce margin & padding and add custom colours) */ + +blockquote { + padding: 8px 12px; + border-left: 5px solid; + border-left-color: var(--ls-page-blockquote-border-color, #7cfc00); + margin: 0.3rem 0 !important; +} + +blockquote.yellow { + border-left-color: #ffe85580; +} + +blockquote.blue { + border-left-color: #84b5ff80; +} + +blockquote.red { + border-left-color: #ff558280; +} + +.ls-block[data-refs-self^=".blue"] .blockquote{ + border-left-color: #84b5ff80; +} + +/* ==mark== tweaks */ + +mark { + background: var(--ls-page-mark-bg-color); + color: var(--ls-page-mark-color); + padding: 1px 2px; + margin: 0 2px; + border-radius: 3px; +} + +mark.yellow { + background: var(--ls-page-mark-bg-color); + color: var(--ls-page-mark-color); +} + +mark.pink { + background-color: #ff89be80; + color: white; +} + +mark.blue { + background-color: #84b5ff80; + color:white; +} + +mark.green { + background-color: #97ff9780; + color: yellow; +} + +mark.red { + background-color: #ff558280; + color: white; +} + +mark.grey { + background-color: #80808080; + color: white; +} + +mark.gray { + background-color: #80808080; + color: white; +} + +mark.orange { + background-color: #ffb86c80; + color: white; +} + +mark.purple { + background-color: #c097ff80; + color: white; +} + +/* add traffic lights to prioritized tasks */ + +.priority[href="#/page/A" i]::before { + content: "🔴"; + margin-right: 2px; +} + +.priority[href="#/page/B" i]::before { + content: "🟡"; + margin-right: 2px; +} + +.priority[href="#/page/C" i]::before { + content: "🟢"; + margin-right: 2px; +} + +.opacity-50 { + opacity: 1; +} +``` + +- As our templates later will depend on v-kanban plugin but I did not want to include the whole `css` and also wanted to modify the icons it shows with `Pros and Cons`, I include the following `css` on `logseq/custom.css`: + +``` css linenums="1" +/* -- like dislike ----------------------------------------- */ + +.ls-block[data-refs-self*="pros"] .block-children .bullet-container .bullet { + display: none; +} + +.ls-block[data-refs-self*="pros"] .block-children .bullet-container:after { + content: "+"; + font-size: 20px; + color: #1cd41c; +} + +.ls-block[data-refs-self*="cons"] .block-children .bullet-container:after { + content: "-"; + color: red; +} + +a.tag[data-ref*="pros"] { + font-size: .8rem; + background: #014935e0; + color: rgb(202, 247, 118); + padding: 0 6px 3px; + border-radius: var(--ls-border-radius-low); + border: 1px solid rgba(137, 207, 96, 0.925); +} + +a.tag[data-ref*="cons"] { + font-size: 13px; + background: #4b033bda; + color: rgb(255, 116, 128); + padding: 0 6px 3px; + border-radius: var(--ls-border-radius-low); + border: 1px solid rgba(182, 13, 41, 0.925); +} + +a.tag[data-ref*="pros"]:hover { + filter: contrast(2) brightness(10); +} + +a.tag[data-ref*="pros"]:before { + content: "✅ "; + font-size: 13px +} + +a.tag[data-ref*="cons"]:before { + content: "❌ "; + font-size: 13px +} + + +a.tag[data-ref*="red"]:before { + content: "🔴"; + margin-right: 2px; +} + +a.tag[data-ref*="amber"]:before { + content: "🟠"; + margin-right: 2px; +} + +a.tag[data-ref*="green"]:before { + content: "🟢"; + margin-right: 2px; +} + +a.tag[data-ref*="on-hold"]:before { + content: "🟣"; + margin-right: 2px; +} + +a.tag[data-ref*="yellow"]:before { + content: "🟡"; + margin-right: 2px; +} + +a.tag[data-ref*="closed"]:before { + content: "🔵"; + margin-right: 2px; +} + +a.tag[data-ref*="no-go"]:before { + content: "🚫"; + margin-right: 2px; +} + +a.tag[data-ref*="merged"]:before { + content: "⚪"; + margin-right: 2px; +} + +/* -------------------------------- like dislike end ------ */ + +/*===========================================================*/ +/* css columns view / kanban v20220510--------------------- */ +/* use: inline tag #kanban, #kanban-small or #kanban-wXXX */ +/* try: #kanban-w200,#kanban-w300, #kanban-w400 */ + +div[data-refs-self*="kanban"]>.block-children-container.flex { + width: 100%; +} + +div[data-refs-self*="kanban"]>.block-children-container.flex>.block-children.w-full { + display: inline-flex; + position: relative; + overflow-x: auto !important; + overflow-y: hidden; + margin: 0 10px; +} + +div[data-refs-self*="kanban"]>.block-children-container.flex>.block-children.w-full>div.ls-block { + display: inline-block; + padding: 0; + width: inherit; + min-width: 200px; + margin-right: 10px; +} + +/* wide */ + +div[data-refs-self*="kanban-small"]>.block-children-container.flex>.block-children, +div[data-refs-self*="kanban-wide"]>.block-children-container.flex>.block-children { + min-width: 90vw; + left: 50%; + transform: translate(-50%); + background-color: var(--ls-primary-background-color); + overflow-x: scroll !important; + overflow-y: hidden; + margin: 10px 30px; +} + +div[data-refs-self*="kanban-wide"]>.block-children-container.flex>.block-children>div.ls-block { + display: inline-block; + min-width: 350px; + padding: 8px 0px !important; + font-size: 0.85rem; + margin: 5px 0px; + background-color: var(--ls-secondary-background-color); + box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2); + border-radius: var(--ls-border-radius-medium); +} + + +/* #kanbansmall : smaller font with hover zoom */ + +div[data-refs-self*="kanban-small"]>.block-children-container.flex>.block-children>div.ls-block { + display: inline-block; + min-width: 350px; +} + +div[data-refs-self*="kanban-small"]>.block-children-container.flex>.block-children .block-content { + font-size: 10px; + font-weight: 300; +} + +div[data-refs-self*="kanban-small"]>.block-children-container.flex>.block-children .block-content:hover { + font-size: 14px !important; + min-width: 100px; +} + + +/* #kanban-w[100-300] : force width of the columns */ + +div[data-refs-self*="kanban-w100"]>.block-children-container.flex>.block-children.w-full>div.ls-block { + min-width: 100px; +} + +div[data-refs-self*="kanban-w150"]>.block-children-container.flex>.block-children.w-full>div.ls-block { + min-width: 150px; +} + +div[data-refs-self*="kanban-w200"]>.block-children-container.flex>.block-children.w-full>div.ls-block { + min-width: 200px; +} +div[data-refs-self*="kanban-w300"]>.block-children-container.flex>.block-children.w-full>div.ls-block { + min-width: 300px; +} +div[data-refs-self*="kanban-w400"]>.block-children-container.flex>.block-children.w-full>div.ls-block { + min-width: 400px; +} +div[data-refs-self*="kanban-fit"]>.block-children-container.flex>.block-children.w-full>div.ls-block { + min-width: 400px; + width: max-content; +} + +/* remove left border for kanbanized */ +[data-refs-self*="kanban"] .block-children-left-border { + opacity: 0; +} + +/* fix modal list not appearing*/ +.block-children { + overflow: visible !important; +} + +.ls-block[data-refs-self*="kanban"] .absolute-modal, +.ls-block[data-refs-self*="kanban"] #ui__ac { + min-height: 80px; +} + +/*--------------------------------------------- kanban end-- */ + +/*------------------expreimetal for better table view START-------------------*/ +.table-wrapper { + width: 100% !important; + max-width: 100% !important; +} + +table td { + min-width:100px; + word-wrap:break-word; +} + + +table th { + word-break: keep-all; +} +/*------------------expreimetal for better table view END-------------------*/ +``` + +* In order to invoke some of the above tweaks, we will also create keyboard shortcuts and shortcodes to have a simpler way to change colour of the blockquote side border and highlights. So open `logseq/config.edn` and do the following: + +a) Search for: + ``` clj linenums="1" + ;; Macros replace texts and will make you more productive. + ;; Example usage: + ;; Change the :macros value below to: + ;; {"poem" "Rose is $1, violet's $2. Life's ordered: Org assists you."} + {% raw %};; input "{{poem red,blue}}"{% endraw %} + ;; becomes + ;; Rose is red, violet's blue. Life's ordered: Org assists you. + :macros {} + ``` + +b) and replace above with: + ``` clj linenums="1" + ;; Macros replace texts and will make you more productive. + ;; Example usage: + ;; Change the :macros value below to: + ;; {"poem" "Rose is $1, violet's $2. Life's ordered: Org assists you."} + {% raw %};; input "{{poem red,blue}}"{% endraw %} + ;; becomes + ;; Rose is red, violet's blue. Life's ordered: Org assists you. + :macros { + ">" "
$2
" ;;usage {% raw %}{{ > orange,Text to be presented in the blockquote }}{% endraw %} + "==" "$2" ;;usage {% raw %}{{ == red,Text to be highlighted without linebreak }}{% endraw %} + } + ``` + +c) search for: + ``` clj linenums="1" + ;; Add custom commands to the command palette + ;; Example usage: + ;; :commands + ;; [ + ;; ["js" "Javascript"] + ;; ["md" "Markdown"] + ;; ] + :commands [] + ``` + +d) and replace above with: + ``` clj linenums="1" + ;; Add custom commands to the command palette + ;; To quickly call these commands, just type / (backslash) followed by characters in square bracket + :commands [ + ["bookmark [.b]" [[:editor/input "{% raw %}{{ renderer :template, Bookmark}}{% endraw %}" ]]], + ["date_today [dt]" [[:editor/input "{% raw %}{{renderer :template, Date Today}}{% endraw %}" ]]], + ["issue_table [.it]" [[:editor/input "{% raw %}{{renderer :template, Issue_table}}{% endraw %}" ]]], + ["issue [.is]" [[:editor/input "{% raw %}{{renderer :template, Issue}}{% endraw %}" ]]], + ["circle [.c]" [[:editor/input "{% raw %}{{renderer :template-view, circle-template, :color orange}}{% endraw %}" ]]], + ["Blue Highlighter [=b]" [[:editor/input "" {:backward-pos 7}]]], + ["Green Highlighter [=g]" [[:editor/input "" {:backward-pos 7}]]], + ["Gray Highlighter [=gra]" [[:edior/input "" {:backward-pos 7}]]], + ["Grey Highlighter [=gre]" [[:editor/input "" {:backward-pos 7}]]], + ["Orange Highlighter [=o]" [[:editor/input "" {:backward-pos 7}]]], + ["Pink Highlighter [=p]" [[:editor/input "" {:backward-pos 7}]]], + ["Red Highlighter [=r]" [[:editor/input "" {:backward-pos 7}]]], + ["Yellow Highlighter [=y]" [[:editor/input "" {:backward-pos 7}]]], + ["Purple Highlighter [=pu]" [[:editor/input "" {:backward-pos 7}]]], + ["Red Blockquote [>r]" [[:editor/input "
" {:backward-pos 13}]]], + ["Yellow Blockquote [>y]" [[:editor/input "
" {:backward-pos 13}]]], + ["Blue Blockquote [>b]" [[:editor/input "
" {:backward-pos 13}]]], + ] + ``` + +!!! warning + Now, some of the short-codes above such as `/.is, /.it, /dt and /.c` will not work just yet because we have not created their associated template. We will get to that in next section. + +### Create Templates + +- Create a new page named `templates`. +- Press ++ctrl+k++ and search for `templates` and open the page. +- Once on the page, click on `Three dots` in top right corner of the screen and from the drop down menu select `Open in default app` +- Here paste the following then save and close the default app: + +``` clj linenums="1" + title:: templates + visibility:: false + icon:: 🧾 + + - # Circle + id:: 66b0d360-cde5-4e95-87b3-4e97a1e23bb5 + template:: circle-template + template-including-parent:: false + arg-color:: red + - + - # People Page + template:: people page + template-including-parent:: false + - tags:: people + icon:: 👨‍💼 + - ## Tasks + - query-table:: true + query-properties:: [:priority :deadline :block] + #+BEGIN_QUERY + {:title [:h3 "Owned"] + :query [:find (pull ?b [*]) + :in $ ?tag + :where + [?b :block/marker ?marker] + [(contains? #{"TODO" "DOING" "NOW" "LATER" "WAITING"} ?marker)] + (page-ref ?b ?tag) + [?ref :block/name "project"] + (not [?b :block/refs ?ref])] + :inputs [:query-page] + :result-transform :add-task-attrs + :breadcrumb-show? true + :group-by-page? false + :collapsed? false + } + #+END_QUERY + - query-table:: true + collapsed:: true + query-properties:: [:marker :deadline :block] + #+BEGIN_QUERY + {:title [:h3 "Closed or Cancelled"] + :query [:find (pull ?b [*]) + :in $ ?tag + :where + [?b :block/marker ?marker] + [(contains? #{"DONE" "CANCELLED" "CANCELED" } ?marker)] + (page-ref ?b ?tag) + [?ref :block/name "project"] + (not [?b :block/refs ?ref])] + :inputs [:query-page] + :result-transform :add-task-attrs + :breadcrumb-show? true + :group-by-page? false + :collapsed? true + } + #+END_QUERY + - + - # Issue Table + template:: Issue_table + template-including-parent:: false + - #.tabular + - ## 01 ``{|}``Issue Title``{|}`` + + owner:: + status:: #Red + #Issues #.v-kanban + - ### **Issue Description** + - + - ### **Updates** + - <% Today %> : + - ## 02 Issue Title + owner:: + status:: #Amber + #Issues #.v-kanban + - ### **Issue Description** + - + - ### **Updates** + - <% Today %> : + - ## 03 Issue Title + owner:: + status:: #Yellow + #Issues #.v-kanban + - ### **Issue Description** + - + - ### **Updates** + - <% Today %> : + - ## 04 Issue Title + owner:: + status:: #Green + #Issues #.v-kanban + - ### **Issue Description** + - + - ### **Updates** + - <% Today %> : + - ## 05 Issue Title + owner:: + status:: #on-hold + #Issues #.v-kanban + - ### **Issue Description** + - + - ### **Updates** + - <% Today %> : + - ## 06 Issue Title + owner:: + status:: #no-go + #Issues #.v-kanban + - ### **Issue Description** + - + - ### **Updates** + - <% Today %> : + - ## 07 Issue Title + owner:: + status:: #closed + #Issues #.v-kanban + - ### **Issue Description** + - + - ### **Updates** + - <% Today %> : + - # Issue + template:: Issue + template-including-parent:: false + - ## ``{|}``01 Issue Title``{|}`` + + owner:: + status:: #Red + #Issues #.v-kanban + - ### **Issue Description** + - + - ### **Updates** + - <% Today %> : + - # Date Today + template:: Date Today + template-including-parent:: false + - **``today``** ``{|}`` + - # [[Bookmarks]] + template:: Bookmark + template-including-parent:: false + - url:: ``{|}`` + + topic:: + - # [[Project page]] + template:: project page + template-including-parent:: false + - tags:: project page + icon:: 📂 + - ## Project Meta + collapsed:: true + - DOING [#B] #project <% current page %> + - ## Actions Log + - query-properties:: [:deadline :priority :block] + #+BEGIN_QUERY + {:title [:h4 "On ToDo List"] + :query [:find (pull ?b [*]) + :in $ ?tag + :where + [?b :block/marker ?marker] + [(contains? #{"TODO"} ?marker)] + (page-ref ?b ?tag) + [?ref :block/name "project"] + (not [?b :block/refs ?ref])] + :inputs [:query-page] + :result-transform :add-task-attrs + :breadcrumb-show? true + } + #+END_QUERY + - query-table:: false + query-properties:: [:page :block] + #+BEGIN_QUERY + {:title [:h4 "Ongoing Tasks"] + :query [:find (pull ?b [*]) + :in $ ?tag + :where + [?b :block/marker ?marker] + [(contains? #{"DOING" "NOW" "LATER" "WAITING"} ?marker)] + (page-ref ?b ?tag) + [?ref :block/name "project"] + (not [?b :block/refs ?ref])] + :inputs [:query-page] + :result-transform :add-task-attrs + :breadcrumb-show? true + :group-by-page? false + :collapsed? false + } + #+END_QUERY + - query-properties:: [:deadline :priority :block] + collapsed:: true + #+BEGIN_QUERY + {:title [:h4 "Completed Tasks"] + :query [:find (pull ?b [*]) + :in $ ?tag + :where + [?b :block/marker ?marker] + [(contains? #{"DONE"} ?marker)] + (page-ref ?b ?tag) + [?ref :block/name "project"] + (not [?b :block/refs ?ref])] + :inputs [:query-page] + :result-transform :add-task-attrs + :breadcrumb-show? true + :table-view? false + :collapsed? true + } + #+END_QUERY + - ## Issues Log + - query-sort-by:: status + query-table:: true + query-sort-desc:: true + query-properties:: [:block :owner :status] + #+BEGIN_QUERY + {:title [:h4 "Open Issues"] + :query [:find (pull ?b [*]) + :in $ ?query-page + :where + [?p :block/name ?query-page] + [?tag2 :block/name "issues"] + [?b :block/refs ?tag2] + [?tag1 :block/name "closed"] + (not [?b :block/refs ?tag1]) + [?b :block/refs ?p] + [?ref :block/name "project"] + (not [?b :block/refs ?ref]) + ] + :inputs [:query-page] + :breadcrumb-show? false + :table-view? true + :group-by-page? false + :collapsed? false + } + #+END_QUERY + - query-properties:: [:block :owner :status] + collapsed:: true + #+BEGIN_QUERY + {:title [:h4 "Closed Issues"] + :query [:find (pull ?b [*]) + :in $ ?query-page + :where + [?p :block/name ?query-page] + [?tag2 :block/name "issues"] + [?b :block/refs ?tag2] + [?tag1 :block/name "closed"] + [?b :block/refs ?tag1] + [?b :block/refs ?p] + [?ref :block/name "project"] + (not [?b :block/refs ?ref]) + ] + :inputs [:query-page] + :breadcrumb-show? false + :table-view? true + :group-by-page? false + :collapsed? true + } + #+END_QUERY + - #+BEGIN_QUERY + {:title [:h2 "Project Notes"] + :query [:find (pull ?b [*]) + :in $ ?query-page + :where + [?p :block/name ?query-page] + [?b :block/refs ?p] + [?tag2 :block/name "issues"] + (not [?b :block/refs ?tag2]) + [?ref :block/name "project"] + (not [?b :block/refs ?ref]) + (not [?b :block/marker _]) + ] + :inputs [:query-page] + :result-transform (fn [result] + (sort-by (fn [b] + (get b :block/created-at "A")) result)) + :breadcrumb-show? false + :group-by-page? true + :collapsed? false + } + #+END_QUERY + - +``` + +### Contents page + +- Press ++ctrl+k++ and search for `contents` and open the page. +- Once on the page, click on `Three dots` in top right corner of the screen and from the drop down menu select `Open in default app` +- Here paste the following then save and close the default app: + +``` clj linenums="1" + - query-properties:: [:icon :page :updated-at] + #+BEGIN_QUERY + {:title [:h1 "⏳ Ongoing Projects"] + :query [:find (pull ?page [*]) + :where + [?block :block/page ?page] + [?page :block/name ?pagename] + [?block :block/marker ?marker] + [(contains? #{"DOING"} ?marker)] + (page-ref ?block "project") + (not [?page :block/name "templates"]) + ] + :breadcrumb-show? false + :collapsed? false} + #+END_QUERY + + - query-properties:: [:icon :page :updated-at] + #+BEGIN_QUERY + { + :title [:h1 "👨‍💼People"] + ;; ---- Get every block into variable ?block + :query [:find (pull ?block [*]) + ;; ---- filter command + :where + ;; ---- get page name (lowercase) from the special page block into variable ?pagename + [?block :block/name ?pagename] + ;; ---- Select if block is a special page block and has a single property (arg1) with value arg2 + (page-property ?block :tags "people") + ] + } +#+END_QUERY +``` + +### Sample Content Page +![screenshot_20240813-152544](../assets/images/2024/357452627-5a295ec2-ab6c-447f-b485-d70166997eba.png) + +## Usage + +### Sample Day to Day Capture +![Screenshot_13-8-2024_151147_](../assets/images/2024/357452219-097dab9f-33a0-4f4a-a807-15923b754e65.jpeg) + +### Create Project +- To create a CARDIO Log for a project, first create a new page and give it name of the Project. +- Next, open the newly created `project page`. +- Once opened, press `Ctrl+t` and select `project page` template and press `enter`. +- This will create all relevant sections for the Project. + +### Create User Page +- Create a new page with the user / resource name. +- Open the newly created page. +- Once opened, press `Ctrl+t` and select `people page` template and press enter. +- This will create all relevant sections to track actions for this resource. + +### Create New Issues +- Now for everyday usage, each time there is a new issue or a number of issues they can simply be recorded by typing `/.is` for single issue and `/.it` for a table of issues. +- Once the issue or issues table is created, all usual fields can be filled but most importantly the issue title must include hashtag for the project that the issue belongs to. + - So an issue for project called `North Star` must have `#[[North Star]]` in the title. + - As an example say the issue is to do with `lack of resources` then the title should be `#[[North Star]]: Lack of Resources` + - The issue `status` or any topic to be highlighted with RAG status can be tagged with following tags: + + |Tag| Circle Appended| + |---|---| + |#red|🔴| + |#amber|🟠| + |#green|🟢| + |#on-hold|🟣| + |#yellow|🟡| + |#Closed|🔵| + |#no-go|🚫| + +- Circles with additional colours can be created using the template. To do so, press `/.c` and press `enter`. This should then put following text on the editor: `{% raw %} {{renderer :template-view, circle-template, :color orange}} {% endraw %}` + +- Now just replace `orange` in above with the colour desired. + +### Maintain Issues Log +- Reviewing the logs is as simple as opening the Contents page, clicking the project name and scrolling down to the `Issues Log` section. +- Now if there are actions identified during the review of an issue, they can be simply added in the `updates` section under the date of review `which can be quickly added by pressing Ctrl+Shift+D` and then noting down the action as a sub bullet `TODO [#A] Do Something /deadline` +- I usually log decisions against a logged issue or if they resulted from a general discussion, just as `# #decision`. + +### Day to day notes +- All the project relevant notes will be automatically collected on the project's page so long as they have been tagged with the project name so for the day to day notes all that is required is add entires in the `Journal`. + +#### Blockquotes +- As we added css for different coloured borders of blockquotes and also created shortcode and keyboard shortcut we can do this in multiple ways: + - Type `/>b`and press enter. This will place `
` and the quote can be written between the tags. + - Type the following, replacing yellow with one of the predefined colours: yellow, pink, blue, green, red, grey, gray, orange or purple. + {% raw %} {{> yellow,Some yellow quote}} {% endraw %} + + ![image](../assets/images/2024/358212031-4caa35b9-9c71-4862-9dc1-a0c0c111fe23.png) + +#### Coloured Highlight +- Type `/=y`, select `Yellow Highlighter` from pop-up menu and press enter. This will place `` and text to be highlighted can be written between the tags. It will be presented as Yellow Highlight +- Type the following and it will be presented as This text is highlighted. + {% raw %} {{== pink,pink highlight}} {% endraw %} + + ![image](../assets/images/2024/358212180-a00cb3b5-497a-4401-810b-1276e7012641.png) \ No newline at end of file diff --git a/.gitignore b/jekyll_archive/.gitignore similarity index 100% rename from .gitignore rename to jekyll_archive/.gitignore diff --git a/.travis.yml b/jekyll_archive/.travis.yml similarity index 100% rename from .travis.yml rename to jekyll_archive/.travis.yml diff --git a/CNAME b/jekyll_archive/CNAME similarity index 100% rename from CNAME rename to jekyll_archive/CNAME diff --git a/Gemfile b/jekyll_archive/Gemfile similarity index 100% rename from Gemfile rename to jekyll_archive/Gemfile diff --git a/LICENSE b/jekyll_archive/LICENSE similarity index 100% rename from LICENSE rename to jekyll_archive/LICENSE diff --git a/README.md b/jekyll_archive/README.md similarity index 100% rename from README.md rename to jekyll_archive/README.md diff --git a/Rakefile b/jekyll_archive/Rakefile similarity index 100% rename from Rakefile rename to jekyll_archive/Rakefile diff --git a/_config.yml b/jekyll_archive/_config.yml similarity index 100% rename from _config.yml rename to jekyll_archive/_config.yml diff --git a/_data/navigation.yml b/jekyll_archive/_data/navigation.yml similarity index 100% rename from _data/navigation.yml rename to jekyll_archive/_data/navigation.yml diff --git a/_data/ui-text.yml b/jekyll_archive/_data/ui-text.yml similarity index 100% rename from _data/ui-text.yml rename to jekyll_archive/_data/ui-text.yml diff --git a/_includes/analytics-providers/custom.html b/jekyll_archive/_includes/analytics-providers/custom.html similarity index 100% rename from _includes/analytics-providers/custom.html rename to jekyll_archive/_includes/analytics-providers/custom.html diff --git a/_includes/analytics-providers/google-gtag.html b/jekyll_archive/_includes/analytics-providers/google-gtag.html similarity index 100% rename from _includes/analytics-providers/google-gtag.html rename to jekyll_archive/_includes/analytics-providers/google-gtag.html diff --git a/_includes/analytics-providers/google-universal.html b/jekyll_archive/_includes/analytics-providers/google-universal.html similarity index 100% rename from _includes/analytics-providers/google-universal.html rename to jekyll_archive/_includes/analytics-providers/google-universal.html diff --git a/_includes/analytics-providers/google.html b/jekyll_archive/_includes/analytics-providers/google.html similarity index 100% rename from _includes/analytics-providers/google.html rename to jekyll_archive/_includes/analytics-providers/google.html diff --git a/_includes/analytics.html b/jekyll_archive/_includes/analytics.html similarity index 100% rename from _includes/analytics.html rename to jekyll_archive/_includes/analytics.html diff --git a/_includes/archive-single.html b/jekyll_archive/_includes/archive-single.html similarity index 100% rename from _includes/archive-single.html rename to jekyll_archive/_includes/archive-single.html diff --git a/_includes/author-profile-custom-links.html b/jekyll_archive/_includes/author-profile-custom-links.html similarity index 100% rename from _includes/author-profile-custom-links.html rename to jekyll_archive/_includes/author-profile-custom-links.html diff --git a/_includes/author-profile.html b/jekyll_archive/_includes/author-profile.html similarity index 100% rename from _includes/author-profile.html rename to jekyll_archive/_includes/author-profile.html diff --git a/_includes/breadcrumbs.html b/jekyll_archive/_includes/breadcrumbs.html similarity index 100% rename from _includes/breadcrumbs.html rename to jekyll_archive/_includes/breadcrumbs.html diff --git a/_includes/browser-upgrade.html b/jekyll_archive/_includes/browser-upgrade.html similarity index 100% rename from _includes/browser-upgrade.html rename to jekyll_archive/_includes/browser-upgrade.html diff --git a/_includes/category-list.html b/jekyll_archive/_includes/category-list.html similarity index 100% rename from _includes/category-list.html rename to jekyll_archive/_includes/category-list.html diff --git a/_includes/comment.html b/jekyll_archive/_includes/comment.html similarity index 100% rename from _includes/comment.html rename to jekyll_archive/_includes/comment.html diff --git a/_includes/comments-providers/custom.html b/jekyll_archive/_includes/comments-providers/custom.html similarity index 100% rename from _includes/comments-providers/custom.html rename to jekyll_archive/_includes/comments-providers/custom.html diff --git a/_includes/comments-providers/custom_scripts.html b/jekyll_archive/_includes/comments-providers/custom_scripts.html similarity index 100% rename from _includes/comments-providers/custom_scripts.html rename to jekyll_archive/_includes/comments-providers/custom_scripts.html diff --git a/_includes/comments-providers/discourse.html b/jekyll_archive/_includes/comments-providers/discourse.html similarity index 100% rename from _includes/comments-providers/discourse.html rename to jekyll_archive/_includes/comments-providers/discourse.html diff --git a/_includes/comments-providers/disqus.html b/jekyll_archive/_includes/comments-providers/disqus.html similarity index 100% rename from _includes/comments-providers/disqus.html rename to jekyll_archive/_includes/comments-providers/disqus.html diff --git a/_includes/comments-providers/facebook.html b/jekyll_archive/_includes/comments-providers/facebook.html similarity index 100% rename from _includes/comments-providers/facebook.html rename to jekyll_archive/_includes/comments-providers/facebook.html diff --git a/_includes/comments-providers/scripts.html b/jekyll_archive/_includes/comments-providers/scripts.html similarity index 100% rename from _includes/comments-providers/scripts.html rename to jekyll_archive/_includes/comments-providers/scripts.html diff --git a/_includes/comments-providers/staticman.html b/jekyll_archive/_includes/comments-providers/staticman.html similarity index 100% rename from _includes/comments-providers/staticman.html rename to jekyll_archive/_includes/comments-providers/staticman.html diff --git a/_includes/comments-providers/staticman_v2.html b/jekyll_archive/_includes/comments-providers/staticman_v2.html similarity index 100% rename from _includes/comments-providers/staticman_v2.html rename to jekyll_archive/_includes/comments-providers/staticman_v2.html diff --git a/_includes/comments-providers/utterances.html b/jekyll_archive/_includes/comments-providers/utterances.html similarity index 100% rename from _includes/comments-providers/utterances.html rename to jekyll_archive/_includes/comments-providers/utterances.html diff --git a/_includes/comments.html b/jekyll_archive/_includes/comments.html similarity index 100% rename from _includes/comments.html rename to jekyll_archive/_includes/comments.html diff --git a/_includes/documents-collection.html b/jekyll_archive/_includes/documents-collection.html similarity index 100% rename from _includes/documents-collection.html rename to jekyll_archive/_includes/documents-collection.html diff --git a/_includes/feature_row b/jekyll_archive/_includes/feature_row similarity index 100% rename from _includes/feature_row rename to jekyll_archive/_includes/feature_row diff --git a/_includes/figure b/jekyll_archive/_includes/figure similarity index 100% rename from _includes/figure rename to jekyll_archive/_includes/figure diff --git a/_includes/footer.html b/jekyll_archive/_includes/footer.html similarity index 100% rename from _includes/footer.html rename to jekyll_archive/_includes/footer.html diff --git a/_includes/footer/custom.html b/jekyll_archive/_includes/footer/custom.html similarity index 100% rename from _includes/footer/custom.html rename to jekyll_archive/_includes/footer/custom.html diff --git a/_includes/gallery b/jekyll_archive/_includes/gallery similarity index 100% rename from _includes/gallery rename to jekyll_archive/_includes/gallery diff --git a/_includes/group-by-array b/jekyll_archive/_includes/group-by-array similarity index 100% rename from _includes/group-by-array rename to jekyll_archive/_includes/group-by-array diff --git a/_includes/head.html b/jekyll_archive/_includes/head.html similarity index 100% rename from _includes/head.html rename to jekyll_archive/_includes/head.html diff --git a/_includes/head/custom.html b/jekyll_archive/_includes/head/custom.html similarity index 100% rename from _includes/head/custom.html rename to jekyll_archive/_includes/head/custom.html diff --git a/_includes/masthead.html b/jekyll_archive/_includes/masthead.html similarity index 100% rename from _includes/masthead.html rename to jekyll_archive/_includes/masthead.html diff --git a/_includes/nav_list b/jekyll_archive/_includes/nav_list similarity index 100% rename from _includes/nav_list rename to jekyll_archive/_includes/nav_list diff --git a/_includes/page__date.html b/jekyll_archive/_includes/page__date.html similarity index 100% rename from _includes/page__date.html rename to jekyll_archive/_includes/page__date.html diff --git a/_includes/page__hero.html b/jekyll_archive/_includes/page__hero.html similarity index 100% rename from _includes/page__hero.html rename to jekyll_archive/_includes/page__hero.html diff --git a/_includes/page__hero_video.html b/jekyll_archive/_includes/page__hero_video.html similarity index 100% rename from _includes/page__hero_video.html rename to jekyll_archive/_includes/page__hero_video.html diff --git a/_includes/page__meta.html b/jekyll_archive/_includes/page__meta.html similarity index 100% rename from _includes/page__meta.html rename to jekyll_archive/_includes/page__meta.html diff --git a/_includes/page__taxonomy.html b/jekyll_archive/_includes/page__taxonomy.html similarity index 100% rename from _includes/page__taxonomy.html rename to jekyll_archive/_includes/page__taxonomy.html diff --git a/_includes/paginator.html b/jekyll_archive/_includes/paginator.html similarity index 100% rename from _includes/paginator.html rename to jekyll_archive/_includes/paginator.html diff --git a/_includes/post_pagination.html b/jekyll_archive/_includes/post_pagination.html similarity index 100% rename from _includes/post_pagination.html rename to jekyll_archive/_includes/post_pagination.html diff --git a/_includes/posts-category.html b/jekyll_archive/_includes/posts-category.html similarity index 100% rename from _includes/posts-category.html rename to jekyll_archive/_includes/posts-category.html diff --git a/_includes/posts-tag.html b/jekyll_archive/_includes/posts-tag.html similarity index 100% rename from _includes/posts-tag.html rename to jekyll_archive/_includes/posts-tag.html diff --git a/_includes/scripts.html b/jekyll_archive/_includes/scripts.html similarity index 100% rename from _includes/scripts.html rename to jekyll_archive/_includes/scripts.html diff --git a/_includes/search/algolia-search-scripts.html b/jekyll_archive/_includes/search/algolia-search-scripts.html similarity index 100% rename from _includes/search/algolia-search-scripts.html rename to jekyll_archive/_includes/search/algolia-search-scripts.html diff --git a/_includes/search/google-search-scripts.html b/jekyll_archive/_includes/search/google-search-scripts.html similarity index 100% rename from _includes/search/google-search-scripts.html rename to jekyll_archive/_includes/search/google-search-scripts.html diff --git a/_includes/search/lunr-search-scripts.html b/jekyll_archive/_includes/search/lunr-search-scripts.html similarity index 100% rename from _includes/search/lunr-search-scripts.html rename to jekyll_archive/_includes/search/lunr-search-scripts.html diff --git a/_includes/search/search_form.html b/jekyll_archive/_includes/search/search_form.html similarity index 100% rename from _includes/search/search_form.html rename to jekyll_archive/_includes/search/search_form.html diff --git a/_includes/seo.html b/jekyll_archive/_includes/seo.html similarity index 100% rename from _includes/seo.html rename to jekyll_archive/_includes/seo.html diff --git a/_includes/sidebar.html b/jekyll_archive/_includes/sidebar.html similarity index 100% rename from _includes/sidebar.html rename to jekyll_archive/_includes/sidebar.html diff --git a/_includes/skip-links.html b/jekyll_archive/_includes/skip-links.html similarity index 100% rename from _includes/skip-links.html rename to jekyll_archive/_includes/skip-links.html diff --git a/_includes/social-share.html b/jekyll_archive/_includes/social-share.html similarity index 100% rename from _includes/social-share.html rename to jekyll_archive/_includes/social-share.html diff --git a/_includes/tag-list.html b/jekyll_archive/_includes/tag-list.html similarity index 100% rename from _includes/tag-list.html rename to jekyll_archive/_includes/tag-list.html diff --git a/_includes/toc b/jekyll_archive/_includes/toc similarity index 100% rename from _includes/toc rename to jekyll_archive/_includes/toc diff --git a/_includes/toc.html b/jekyll_archive/_includes/toc.html similarity index 100% rename from _includes/toc.html rename to jekyll_archive/_includes/toc.html diff --git a/_includes/video b/jekyll_archive/_includes/video similarity index 100% rename from _includes/video rename to jekyll_archive/_includes/video diff --git a/_layouts/archive-taxonomy.html b/jekyll_archive/_layouts/archive-taxonomy.html similarity index 100% rename from _layouts/archive-taxonomy.html rename to jekyll_archive/_layouts/archive-taxonomy.html diff --git a/_layouts/archive.html b/jekyll_archive/_layouts/archive.html similarity index 100% rename from _layouts/archive.html rename to jekyll_archive/_layouts/archive.html diff --git a/_layouts/categories.html b/jekyll_archive/_layouts/categories.html similarity index 100% rename from _layouts/categories.html rename to jekyll_archive/_layouts/categories.html diff --git a/_layouts/category.html b/jekyll_archive/_layouts/category.html similarity index 100% rename from _layouts/category.html rename to jekyll_archive/_layouts/category.html diff --git a/_layouts/collection.html b/jekyll_archive/_layouts/collection.html similarity index 100% rename from _layouts/collection.html rename to jekyll_archive/_layouts/collection.html diff --git a/_layouts/compress.html b/jekyll_archive/_layouts/compress.html similarity index 100% rename from _layouts/compress.html rename to jekyll_archive/_layouts/compress.html diff --git a/_layouts/default.html b/jekyll_archive/_layouts/default.html similarity index 100% rename from _layouts/default.html rename to jekyll_archive/_layouts/default.html diff --git a/_layouts/home.html b/jekyll_archive/_layouts/home.html similarity index 100% rename from _layouts/home.html rename to jekyll_archive/_layouts/home.html diff --git a/_layouts/posts.html b/jekyll_archive/_layouts/posts.html similarity index 100% rename from _layouts/posts.html rename to jekyll_archive/_layouts/posts.html diff --git a/_layouts/search.html b/jekyll_archive/_layouts/search.html similarity index 100% rename from _layouts/search.html rename to jekyll_archive/_layouts/search.html diff --git a/_layouts/single.html b/jekyll_archive/_layouts/single.html similarity index 100% rename from _layouts/single.html rename to jekyll_archive/_layouts/single.html diff --git a/_layouts/splash.html b/jekyll_archive/_layouts/splash.html similarity index 100% rename from _layouts/splash.html rename to jekyll_archive/_layouts/splash.html diff --git a/_layouts/tag.html b/jekyll_archive/_layouts/tag.html similarity index 100% rename from _layouts/tag.html rename to jekyll_archive/_layouts/tag.html diff --git a/_layouts/tags.html b/jekyll_archive/_layouts/tags.html similarity index 100% rename from _layouts/tags.html rename to jekyll_archive/_layouts/tags.html diff --git a/_pages/404.md b/jekyll_archive/_pages/404.md similarity index 100% rename from _pages/404.md rename to jekyll_archive/_pages/404.md diff --git a/_pages/about.md b/jekyll_archive/_pages/about.md similarity index 100% rename from _pages/about.md rename to jekyll_archive/_pages/about.md diff --git a/_pages/category-archive.md b/jekyll_archive/_pages/category-archive.md similarity index 100% rename from _pages/category-archive.md rename to jekyll_archive/_pages/category-archive.md diff --git a/_pages/sitemap.md b/jekyll_archive/_pages/sitemap.md similarity index 100% rename from _pages/sitemap.md rename to jekyll_archive/_pages/sitemap.md diff --git a/_pages/year-archive.md b/jekyll_archive/_pages/year-archive.md similarity index 100% rename from _pages/year-archive.md rename to jekyll_archive/_pages/year-archive.md diff --git a/_posts/2009-08-11-aao-a150l-step-by-step-installation-process-for-linux4one.md b/jekyll_archive/_posts/2009-08-11-aao-a150l-step-by-step-installation-process-for-linux4one.md similarity index 100% rename from _posts/2009-08-11-aao-a150l-step-by-step-installation-process-for-linux4one.md rename to jekyll_archive/_posts/2009-08-11-aao-a150l-step-by-step-installation-process-for-linux4one.md diff --git a/_posts/2009-08-13-get-gmail-as-push-email-on-sony-p990i.md b/jekyll_archive/_posts/2009-08-13-get-gmail-as-push-email-on-sony-p990i.md similarity index 100% rename from _posts/2009-08-13-get-gmail-as-push-email-on-sony-p990i.md rename to jekyll_archive/_posts/2009-08-13-get-gmail-as-push-email-on-sony-p990i.md diff --git a/_posts/2009-09-15-sony-vaio-fe21h-webcam-on-skype.md b/jekyll_archive/_posts/2009-09-15-sony-vaio-fe21h-webcam-on-skype.md similarity index 100% rename from _posts/2009-09-15-sony-vaio-fe21h-webcam-on-skype.md rename to jekyll_archive/_posts/2009-09-15-sony-vaio-fe21h-webcam-on-skype.md diff --git a/_posts/2009-09-16-sony-vaio-n-vidia-setup-to-make-s-video-work.md b/jekyll_archive/_posts/2009-09-16-sony-vaio-n-vidia-setup-to-make-s-video-work.md similarity index 100% rename from _posts/2009-09-16-sony-vaio-n-vidia-setup-to-make-s-video-work.md rename to jekyll_archive/_posts/2009-09-16-sony-vaio-n-vidia-setup-to-make-s-video-work.md diff --git a/_posts/2009-10-07-o2-xda-serra-official-htc-upgrade-with-tf3d-of-touch-pro-2.md b/jekyll_archive/_posts/2009-10-07-o2-xda-serra-official-htc-upgrade-with-tf3d-of-touch-pro-2.md similarity index 100% rename from _posts/2009-10-07-o2-xda-serra-official-htc-upgrade-with-tf3d-of-touch-pro-2.md rename to jekyll_archive/_posts/2009-10-07-o2-xda-serra-official-htc-upgrade-with-tf3d-of-touch-pro-2.md diff --git a/_posts/2010-03-07-kubuntu-blog-entry.md b/jekyll_archive/_posts/2010-03-07-kubuntu-blog-entry.md similarity index 100% rename from _posts/2010-03-07-kubuntu-blog-entry.md rename to jekyll_archive/_posts/2010-03-07-kubuntu-blog-entry.md diff --git a/_posts/2010-03-15-configure-blogtk-1-0-for-blogger.md b/jekyll_archive/_posts/2010-03-15-configure-blogtk-1-0-for-blogger.md similarity index 100% rename from _posts/2010-03-15-configure-blogtk-1-0-for-blogger.md rename to jekyll_archive/_posts/2010-03-15-configure-blogtk-1-0-for-blogger.md diff --git a/_posts/2010-03-19-audio-problem-in-wine-under-kde-4-4-1-solved.md b/jekyll_archive/_posts/2010-03-19-audio-problem-in-wine-under-kde-4-4-1-solved.md similarity index 100% rename from _posts/2010-03-19-audio-problem-in-wine-under-kde-4-4-1-solved.md rename to jekyll_archive/_posts/2010-03-19-audio-problem-in-wine-under-kde-4-4-1-solved.md diff --git a/_posts/2010-03-22-install-maitreya-vedic-astrology-software-on-ubuntu-kbuntu.md b/jekyll_archive/_posts/2010-03-22-install-maitreya-vedic-astrology-software-on-ubuntu-kbuntu.md similarity index 100% rename from _posts/2010-03-22-install-maitreya-vedic-astrology-software-on-ubuntu-kbuntu.md rename to jekyll_archive/_posts/2010-03-22-install-maitreya-vedic-astrology-software-on-ubuntu-kbuntu.md diff --git a/_posts/2010-05-03-jagannath-hora-on-linux-play-on-linux-magic.md b/jekyll_archive/_posts/2010-05-03-jagannath-hora-on-linux-play-on-linux-magic.md similarity index 100% rename from _posts/2010-05-03-jagannath-hora-on-linux-play-on-linux-magic.md rename to jekyll_archive/_posts/2010-05-03-jagannath-hora-on-linux-play-on-linux-magic.md diff --git a/_posts/2010-11-13-part-1-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md b/jekyll_archive/_posts/2010-11-13-part-1-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md similarity index 100% rename from _posts/2010-11-13-part-1-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md rename to jekyll_archive/_posts/2010-11-13-part-1-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md diff --git a/_posts/2011-02-19-call-us-and-several-other-countries-free-using-android.md b/jekyll_archive/_posts/2011-02-19-call-us-and-several-other-countries-free-using-android.md similarity index 100% rename from _posts/2011-02-19-call-us-and-several-other-countries-free-using-android.md rename to jekyll_archive/_posts/2011-02-19-call-us-and-several-other-countries-free-using-android.md diff --git a/_posts/2011-02-20-google-voice-sip2sip-ikall-free-international-calls-to-known-contacts.md b/jekyll_archive/_posts/2011-02-20-google-voice-sip2sip-ikall-free-international-calls-to-known-contacts.md similarity index 100% rename from _posts/2011-02-20-google-voice-sip2sip-ikall-free-international-calls-to-known-contacts.md rename to jekyll_archive/_posts/2011-02-20-google-voice-sip2sip-ikall-free-international-calls-to-known-contacts.md diff --git a/_posts/2011-04-17-time-for-a-bit-of-show-off.md b/jekyll_archive/_posts/2011-04-17-time-for-a-bit-of-show-off.md similarity index 100% rename from _posts/2011-04-17-time-for-a-bit-of-show-off.md rename to jekyll_archive/_posts/2011-04-17-time-for-a-bit-of-show-off.md diff --git a/_posts/2011-04-24-logitech-ex100-wireless-keyboard-and-mouse-not-working-read-on.md b/jekyll_archive/_posts/2011-04-24-logitech-ex100-wireless-keyboard-and-mouse-not-working-read-on.md similarity index 100% rename from _posts/2011-04-24-logitech-ex100-wireless-keyboard-and-mouse-not-working-read-on.md rename to jekyll_archive/_posts/2011-04-24-logitech-ex100-wireless-keyboard-and-mouse-not-working-read-on.md diff --git a/_posts/2011-04-29-mmc-convert-media-files-on-linux.md b/jekyll_archive/_posts/2011-04-29-mmc-convert-media-files-on-linux.md similarity index 100% rename from _posts/2011-04-29-mmc-convert-media-files-on-linux.md rename to jekyll_archive/_posts/2011-04-29-mmc-convert-media-files-on-linux.md diff --git a/_posts/2011-05-02-glympse.md b/jekyll_archive/_posts/2011-05-02-glympse.md similarity index 100% rename from _posts/2011-05-02-glympse.md rename to jekyll_archive/_posts/2011-05-02-glympse.md diff --git a/_posts/2011-05-04-part-2-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md b/jekyll_archive/_posts/2011-05-04-part-2-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md similarity index 100% rename from _posts/2011-05-04-part-2-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md rename to jekyll_archive/_posts/2011-05-04-part-2-configure-epson-s515w-on-linux-mint-ubuntu-10-04.md diff --git a/_posts/2011-05-07-how-to-edit-pdf-in-linux-the-easy-way.md b/jekyll_archive/_posts/2011-05-07-how-to-edit-pdf-in-linux-the-easy-way.md similarity index 100% rename from _posts/2011-05-07-how-to-edit-pdf-in-linux-the-easy-way.md rename to jekyll_archive/_posts/2011-05-07-how-to-edit-pdf-in-linux-the-easy-way.md diff --git a/_posts/2011-06-04-install-open-workbench-and-jre-on-wine-in-linux-mint.md b/jekyll_archive/_posts/2011-06-04-install-open-workbench-and-jre-on-wine-in-linux-mint.md similarity index 100% rename from _posts/2011-06-04-install-open-workbench-and-jre-on-wine-in-linux-mint.md rename to jekyll_archive/_posts/2011-06-04-install-open-workbench-and-jre-on-wine-in-linux-mint.md diff --git a/_posts/2011-06-20-visio-alternative-on-linux-business-process-model-and-notation-tool.md b/jekyll_archive/_posts/2011-06-20-visio-alternative-on-linux-business-process-model-and-notation-tool.md similarity index 100% rename from _posts/2011-06-20-visio-alternative-on-linux-business-process-model-and-notation-tool.md rename to jekyll_archive/_posts/2011-06-20-visio-alternative-on-linux-business-process-model-and-notation-tool.md diff --git a/_posts/2011-11-04-access-files-folders-directories-from-linux-mint-on-android.md b/jekyll_archive/_posts/2011-11-04-access-files-folders-directories-from-linux-mint-on-android.md similarity index 100% rename from _posts/2011-11-04-access-files-folders-directories-from-linux-mint-on-android.md rename to jekyll_archive/_posts/2011-11-04-access-files-folders-directories-from-linux-mint-on-android.md diff --git a/_posts/2011-11-06-openvpn-on-linux-mint-to-access-us.md b/jekyll_archive/_posts/2011-11-06-openvpn-on-linux-mint-to-access-us.md similarity index 100% rename from _posts/2011-11-06-openvpn-on-linux-mint-to-access-us.md rename to jekyll_archive/_posts/2011-11-06-openvpn-on-linux-mint-to-access-us.md diff --git a/_posts/2012-02-20-how-to-boot-from-usb-when-bios-does-not-have-the-option.md b/jekyll_archive/_posts/2012-02-20-how-to-boot-from-usb-when-bios-does-not-have-the-option.md similarity index 100% rename from _posts/2012-02-20-how-to-boot-from-usb-when-bios-does-not-have-the-option.md rename to jekyll_archive/_posts/2012-02-20-how-to-boot-from-usb-when-bios-does-not-have-the-option.md diff --git a/_posts/2012-03-04-stagevu-divx-video-on-bodhi-linux.md b/jekyll_archive/_posts/2012-03-04-stagevu-divx-video-on-bodhi-linux.md similarity index 100% rename from _posts/2012-03-04-stagevu-divx-video-on-bodhi-linux.md rename to jekyll_archive/_posts/2012-03-04-stagevu-divx-video-on-bodhi-linux.md diff --git a/_posts/2012-03-16-exchange-2007-on-thunderbird-using-davmail.md b/jekyll_archive/_posts/2012-03-16-exchange-2007-on-thunderbird-using-davmail.md similarity index 100% rename from _posts/2012-03-16-exchange-2007-on-thunderbird-using-davmail.md rename to jekyll_archive/_posts/2012-03-16-exchange-2007-on-thunderbird-using-davmail.md diff --git a/_posts/2012-08-06-top-10-android-apps-that-i-use.md b/jekyll_archive/_posts/2012-08-06-top-10-android-apps-that-i-use.md similarity index 100% rename from _posts/2012-08-06-top-10-android-apps-that-i-use.md rename to jekyll_archive/_posts/2012-08-06-top-10-android-apps-that-i-use.md diff --git a/_posts/2012-10-15-flash-samsung-galaxy-s-gt-i9000-with-cyanogenmod-9-on-linux.md b/jekyll_archive/_posts/2012-10-15-flash-samsung-galaxy-s-gt-i9000-with-cyanogenmod-9-on-linux.md similarity index 100% rename from _posts/2012-10-15-flash-samsung-galaxy-s-gt-i9000-with-cyanogenmod-9-on-linux.md rename to jekyll_archive/_posts/2012-10-15-flash-samsung-galaxy-s-gt-i9000-with-cyanogenmod-9-on-linux.md diff --git a/_posts/2012-10-17-prepare-linux-mint-13-for-android-development.md b/jekyll_archive/_posts/2012-10-17-prepare-linux-mint-13-for-android-development.md similarity index 100% rename from _posts/2012-10-17-prepare-linux-mint-13-for-android-development.md rename to jekyll_archive/_posts/2012-10-17-prepare-linux-mint-13-for-android-development.md diff --git a/_posts/2013-01-01-root-nexus-4-on-linux-mint-13-and-access-all-files-on-computer.md b/jekyll_archive/_posts/2013-01-01-root-nexus-4-on-linux-mint-13-and-access-all-files-on-computer.md similarity index 100% rename from _posts/2013-01-01-root-nexus-4-on-linux-mint-13-and-access-all-files-on-computer.md rename to jekyll_archive/_posts/2013-01-01-root-nexus-4-on-linux-mint-13-and-access-all-files-on-computer.md diff --git a/_posts/2013-01-18-conky-on-my-desktop-step-by-step.md b/jekyll_archive/_posts/2013-01-18-conky-on-my-desktop-step-by-step.md similarity index 100% rename from _posts/2013-01-18-conky-on-my-desktop-step-by-step.md rename to jekyll_archive/_posts/2013-01-18-conky-on-my-desktop-step-by-step.md diff --git a/_posts/2013-03-01-python-eric-rad-ide-and-qt-designer.md b/jekyll_archive/_posts/2013-03-01-python-eric-rad-ide-and-qt-designer.md similarity index 100% rename from _posts/2013-03-01-python-eric-rad-ide-and-qt-designer.md rename to jekyll_archive/_posts/2013-03-01-python-eric-rad-ide-and-qt-designer.md diff --git a/_posts/2013-03-17-linux-mint-on-android-through-vnc-and-jump.md b/jekyll_archive/_posts/2013-03-17-linux-mint-on-android-through-vnc-and-jump.md similarity index 100% rename from _posts/2013-03-17-linux-mint-on-android-through-vnc-and-jump.md rename to jekyll_archive/_posts/2013-03-17-linux-mint-on-android-through-vnc-and-jump.md diff --git a/_posts/2014-02-19-arch-linux-nearly-a-year-on.md b/jekyll_archive/_posts/2014-02-19-arch-linux-nearly-a-year-on.md similarity index 100% rename from _posts/2014-02-19-arch-linux-nearly-a-year-on.md rename to jekyll_archive/_posts/2014-02-19-arch-linux-nearly-a-year-on.md diff --git a/_posts/2016-02-18-mysql-stored-procedure-to-return-json-for-google-charts.md b/jekyll_archive/_posts/2016-02-18-mysql-stored-procedure-to-return-json-for-google-charts.md similarity index 100% rename from _posts/2016-02-18-mysql-stored-procedure-to-return-json-for-google-charts.md rename to jekyll_archive/_posts/2016-02-18-mysql-stored-procedure-to-return-json-for-google-charts.md diff --git a/_posts/2016-06-06-crossover.md b/jekyll_archive/_posts/2016-06-06-crossover.md similarity index 100% rename from _posts/2016-06-06-crossover.md rename to jekyll_archive/_posts/2016-06-06-crossover.md diff --git a/_posts/2016-06-27-seafile-server-behind-nginx-on-fedora-24-security-lab-spin.md b/jekyll_archive/_posts/2016-06-27-seafile-server-behind-nginx-on-fedora-24-security-lab-spin.md similarity index 100% rename from _posts/2016-06-27-seafile-server-behind-nginx-on-fedora-24-security-lab-spin.md rename to jekyll_archive/_posts/2016-06-27-seafile-server-behind-nginx-on-fedora-24-security-lab-spin.md diff --git a/_posts/2016-07-01-ghost-on-fedora-24.md b/jekyll_archive/_posts/2016-07-01-ghost-on-fedora-24.md similarity index 100% rename from _posts/2016-07-01-ghost-on-fedora-24.md rename to jekyll_archive/_posts/2016-07-01-ghost-on-fedora-24.md diff --git a/_posts/2016-07-17-the-complete-walkthrough-of-my-blogger-to-ghost-migration.md b/jekyll_archive/_posts/2016-07-17-the-complete-walkthrough-of-my-blogger-to-ghost-migration.md similarity index 100% rename from _posts/2016-07-17-the-complete-walkthrough-of-my-blogger-to-ghost-migration.md rename to jekyll_archive/_posts/2016-07-17-the-complete-walkthrough-of-my-blogger-to-ghost-migration.md diff --git a/_posts/2016-07-19-mysql-function-to-calculate-elapsed-working-time.md b/jekyll_archive/_posts/2016-07-19-mysql-function-to-calculate-elapsed-working-time.md similarity index 100% rename from _posts/2016-07-19-mysql-function-to-calculate-elapsed-working-time.md rename to jekyll_archive/_posts/2016-07-19-mysql-function-to-calculate-elapsed-working-time.md diff --git a/_posts/2016-07-20-ddclient-on-fedora-2.md b/jekyll_archive/_posts/2016-07-20-ddclient-on-fedora-2.md similarity index 100% rename from _posts/2016-07-20-ddclient-on-fedora-2.md rename to jekyll_archive/_posts/2016-07-20-ddclient-on-fedora-2.md diff --git a/_posts/2016-07-25-tomcat-on-fedora-behind-nginx.md b/jekyll_archive/_posts/2016-07-25-tomcat-on-fedora-behind-nginx.md similarity index 100% rename from _posts/2016-07-25-tomcat-on-fedora-behind-nginx.md rename to jekyll_archive/_posts/2016-07-25-tomcat-on-fedora-behind-nginx.md diff --git a/_posts/2016-07-28-update-ghost-on-fedora.md b/jekyll_archive/_posts/2016-07-28-update-ghost-on-fedora.md similarity index 100% rename from _posts/2016-07-28-update-ghost-on-fedora.md rename to jekyll_archive/_posts/2016-07-28-update-ghost-on-fedora.md diff --git a/_posts/2016-07-31-fix-for-php-issues-after-upgrade-to-ubuntu-16-04-1-xenial.md b/jekyll_archive/_posts/2016-07-31-fix-for-php-issues-after-upgrade-to-ubuntu-16-04-1-xenial.md similarity index 100% rename from _posts/2016-07-31-fix-for-php-issues-after-upgrade-to-ubuntu-16-04-1-xenial.md rename to jekyll_archive/_posts/2016-07-31-fix-for-php-issues-after-upgrade-to-ubuntu-16-04-1-xenial.md diff --git a/_posts/2016-08-12-ethercalc.md b/jekyll_archive/_posts/2016-08-12-ethercalc.md similarity index 100% rename from _posts/2016-08-12-ethercalc.md rename to jekyll_archive/_posts/2016-08-12-ethercalc.md diff --git a/_posts/2016-09-05-the-pain-of-using-windows.md b/jekyll_archive/_posts/2016-09-05-the-pain-of-using-windows.md similarity index 100% rename from _posts/2016-09-05-the-pain-of-using-windows.md rename to jekyll_archive/_posts/2016-09-05-the-pain-of-using-windows.md diff --git a/_posts/2016-10-04-grav-cms-with-a-difference.md b/jekyll_archive/_posts/2016-10-04-grav-cms-with-a-difference.md similarity index 100% rename from _posts/2016-10-04-grav-cms-with-a-difference.md rename to jekyll_archive/_posts/2016-10-04-grav-cms-with-a-difference.md diff --git a/_posts/2016-11-23-note-7-to-oneplus-3.md b/jekyll_archive/_posts/2016-11-23-note-7-to-oneplus-3.md similarity index 100% rename from _posts/2016-11-23-note-7-to-oneplus-3.md rename to jekyll_archive/_posts/2016-11-23-note-7-to-oneplus-3.md diff --git a/_posts/2016-12-14-swap-file-to-create-extra-memory.md b/jekyll_archive/_posts/2016-12-14-swap-file-to-create-extra-memory.md similarity index 100% rename from _posts/2016-12-14-swap-file-to-create-extra-memory.md rename to jekyll_archive/_posts/2016-12-14-swap-file-to-create-extra-memory.md diff --git a/_posts/2017-02-02-dd-wrt-firmware-on-tp-link-tl-wr841n-v11.md b/jekyll_archive/_posts/2017-02-02-dd-wrt-firmware-on-tp-link-tl-wr841n-v11.md similarity index 100% rename from _posts/2017-02-02-dd-wrt-firmware-on-tp-link-tl-wr841n-v11.md rename to jekyll_archive/_posts/2017-02-02-dd-wrt-firmware-on-tp-link-tl-wr841n-v11.md diff --git a/_posts/2017-02-13-markdown-and-gantt-charts.md b/jekyll_archive/_posts/2017-02-13-markdown-and-gantt-charts.md similarity index 100% rename from _posts/2017-02-13-markdown-and-gantt-charts.md rename to jekyll_archive/_posts/2017-02-13-markdown-and-gantt-charts.md diff --git a/_posts/2017-03-03-rstudio-server-setup-with-ssl-behind-apache-proxy-server.md b/jekyll_archive/_posts/2017-03-03-rstudio-server-setup-with-ssl-behind-apache-proxy-server.md similarity index 100% rename from _posts/2017-03-03-rstudio-server-setup-with-ssl-behind-apache-proxy-server.md rename to jekyll_archive/_posts/2017-03-03-rstudio-server-setup-with-ssl-behind-apache-proxy-server.md diff --git a/_posts/2017-10-05-ghost-v1-0-upgrade-related-quirks-and-fixes.md b/jekyll_archive/_posts/2017-10-05-ghost-v1-0-upgrade-related-quirks-and-fixes.md similarity index 100% rename from _posts/2017-10-05-ghost-v1-0-upgrade-related-quirks-and-fixes.md rename to jekyll_archive/_posts/2017-10-05-ghost-v1-0-upgrade-related-quirks-and-fixes.md diff --git a/_posts/2017-11-19-unprotect-sheets-in-libre-calc-excel.md b/jekyll_archive/_posts/2017-11-19-unprotect-sheets-in-libre-calc-excel.md similarity index 100% rename from _posts/2017-11-19-unprotect-sheets-in-libre-calc-excel.md rename to jekyll_archive/_posts/2017-11-19-unprotect-sheets-in-libre-calc-excel.md diff --git a/_posts/2018-01-04-ghost-upgrade-errors-and-fixes-1-19-x.md b/jekyll_archive/_posts/2018-01-04-ghost-upgrade-errors-and-fixes-1-19-x.md similarity index 100% rename from _posts/2018-01-04-ghost-upgrade-errors-and-fixes-1-19-x.md rename to jekyll_archive/_posts/2018-01-04-ghost-upgrade-errors-and-fixes-1-19-x.md diff --git a/_posts/2018-02-20-mysql-function-to-calculate-closing-workday-date-given-elapsed-working-time.md b/jekyll_archive/_posts/2018-02-20-mysql-function-to-calculate-closing-workday-date-given-elapsed-working-time.md similarity index 100% rename from _posts/2018-02-20-mysql-function-to-calculate-closing-workday-date-given-elapsed-working-time.md rename to jekyll_archive/_posts/2018-02-20-mysql-function-to-calculate-closing-workday-date-given-elapsed-working-time.md diff --git a/_posts/2018-05-14-home-networking.md b/jekyll_archive/_posts/2018-05-14-home-networking.md similarity index 100% rename from _posts/2018-05-14-home-networking.md rename to jekyll_archive/_posts/2018-05-14-home-networking.md diff --git a/_posts/2018-06-15-prosody-behind-apache-on-debian-stretch.md b/jekyll_archive/_posts/2018-06-15-prosody-behind-apache-on-debian-stretch.md similarity index 100% rename from _posts/2018-06-15-prosody-behind-apache-on-debian-stretch.md rename to jekyll_archive/_posts/2018-06-15-prosody-behind-apache-on-debian-stretch.md diff --git a/_posts/2018-12-05-metabase-a-bi-solution-that-just-works.md b/jekyll_archive/_posts/2018-12-05-metabase-a-bi-solution-that-just-works.md similarity index 100% rename from _posts/2018-12-05-metabase-a-bi-solution-that-just-works.md rename to jekyll_archive/_posts/2018-12-05-metabase-a-bi-solution-that-just-works.md diff --git a/_posts/2020-05-19-converting-aax-audible-to-mp3.md b/jekyll_archive/_posts/2020-05-19-converting-aax-audible-to-mp3.md similarity index 100% rename from _posts/2020-05-19-converting-aax-audible-to-mp3.md rename to jekyll_archive/_posts/2020-05-19-converting-aax-audible-to-mp3.md diff --git a/_posts/2021-02-10-upgrading-php-version-on-linux-for-apache.md b/jekyll_archive/_posts/2021-02-10-upgrading-php-version-on-linux-for-apache.md similarity index 100% rename from _posts/2021-02-10-upgrading-php-version-on-linux-for-apache.md rename to jekyll_archive/_posts/2021-02-10-upgrading-php-version-on-linux-for-apache.md diff --git a/_posts/2021-03-05-tech-for-diabetics.md b/jekyll_archive/_posts/2021-03-05-tech-for-diabetics.md similarity index 100% rename from _posts/2021-03-05-tech-for-diabetics.md rename to jekyll_archive/_posts/2021-03-05-tech-for-diabetics.md diff --git a/_posts/2023-01-25-jupyterlite- on-github-enterprise-with-panel-enabled.md b/jekyll_archive/_posts/2023-01-25-jupyterlite- on-github-enterprise-with-panel-enabled.md similarity index 100% rename from _posts/2023-01-25-jupyterlite- on-github-enterprise-with-panel-enabled.md rename to jekyll_archive/_posts/2023-01-25-jupyterlite- on-github-enterprise-with-panel-enabled.md diff --git a/_posts/2023-02-26-git-basics.md b/jekyll_archive/_posts/2023-02-26-git-basics.md similarity index 100% rename from _posts/2023-02-26-git-basics.md rename to jekyll_archive/_posts/2023-02-26-git-basics.md diff --git a/_posts/2023-02-28-git-jargon.md b/jekyll_archive/_posts/2023-02-28-git-jargon.md similarity index 100% rename from _posts/2023-02-28-git-jargon.md rename to jekyll_archive/_posts/2023-02-28-git-jargon.md diff --git a/_posts/2023-03-29-read-excel-csv-recursive.md b/jekyll_archive/_posts/2023-03-29-read-excel-csv-recursive.md similarity index 100% rename from _posts/2023-03-29-read-excel-csv-recursive.md rename to jekyll_archive/_posts/2023-03-29-read-excel-csv-recursive.md diff --git a/_posts/2024-08-13-logseq-customisation-for-project-management-teamplate.md b/jekyll_archive/_posts/2024-08-13-logseq-customisation-for-project-management-teamplate.md similarity index 100% rename from _posts/2024-08-13-logseq-customisation-for-project-management-teamplate.md rename to jekyll_archive/_posts/2024-08-13-logseq-customisation-for-project-management-teamplate.md diff --git a/_sass/minimal-mistakes.scss b/jekyll_archive/_sass/minimal-mistakes.scss similarity index 100% rename from _sass/minimal-mistakes.scss rename to jekyll_archive/_sass/minimal-mistakes.scss diff --git a/_sass/minimal-mistakes/_animations.scss b/jekyll_archive/_sass/minimal-mistakes/_animations.scss similarity index 100% rename from _sass/minimal-mistakes/_animations.scss rename to jekyll_archive/_sass/minimal-mistakes/_animations.scss diff --git a/_sass/minimal-mistakes/_archive.scss b/jekyll_archive/_sass/minimal-mistakes/_archive.scss similarity index 100% rename from _sass/minimal-mistakes/_archive.scss rename to jekyll_archive/_sass/minimal-mistakes/_archive.scss diff --git a/_sass/minimal-mistakes/_base.scss b/jekyll_archive/_sass/minimal-mistakes/_base.scss similarity index 100% rename from _sass/minimal-mistakes/_base.scss rename to jekyll_archive/_sass/minimal-mistakes/_base.scss diff --git a/_sass/minimal-mistakes/_buttons.scss b/jekyll_archive/_sass/minimal-mistakes/_buttons.scss similarity index 100% rename from _sass/minimal-mistakes/_buttons.scss rename to jekyll_archive/_sass/minimal-mistakes/_buttons.scss diff --git a/_sass/minimal-mistakes/_footer.scss b/jekyll_archive/_sass/minimal-mistakes/_footer.scss similarity index 100% rename from _sass/minimal-mistakes/_footer.scss rename to jekyll_archive/_sass/minimal-mistakes/_footer.scss diff --git a/_sass/minimal-mistakes/_forms.scss b/jekyll_archive/_sass/minimal-mistakes/_forms.scss similarity index 100% rename from _sass/minimal-mistakes/_forms.scss rename to jekyll_archive/_sass/minimal-mistakes/_forms.scss diff --git a/_sass/minimal-mistakes/_masthead.scss b/jekyll_archive/_sass/minimal-mistakes/_masthead.scss similarity index 100% rename from _sass/minimal-mistakes/_masthead.scss rename to jekyll_archive/_sass/minimal-mistakes/_masthead.scss diff --git a/_sass/minimal-mistakes/_mixins.scss b/jekyll_archive/_sass/minimal-mistakes/_mixins.scss similarity index 100% rename from _sass/minimal-mistakes/_mixins.scss rename to jekyll_archive/_sass/minimal-mistakes/_mixins.scss diff --git a/_sass/minimal-mistakes/_navigation.scss b/jekyll_archive/_sass/minimal-mistakes/_navigation.scss similarity index 100% rename from _sass/minimal-mistakes/_navigation.scss rename to jekyll_archive/_sass/minimal-mistakes/_navigation.scss diff --git a/_sass/minimal-mistakes/_notices.scss b/jekyll_archive/_sass/minimal-mistakes/_notices.scss similarity index 100% rename from _sass/minimal-mistakes/_notices.scss rename to jekyll_archive/_sass/minimal-mistakes/_notices.scss diff --git a/_sass/minimal-mistakes/_page.scss b/jekyll_archive/_sass/minimal-mistakes/_page.scss similarity index 100% rename from _sass/minimal-mistakes/_page.scss rename to jekyll_archive/_sass/minimal-mistakes/_page.scss diff --git a/_sass/minimal-mistakes/_print.scss b/jekyll_archive/_sass/minimal-mistakes/_print.scss similarity index 100% rename from _sass/minimal-mistakes/_print.scss rename to jekyll_archive/_sass/minimal-mistakes/_print.scss diff --git a/_sass/minimal-mistakes/_reset.scss b/jekyll_archive/_sass/minimal-mistakes/_reset.scss similarity index 100% rename from _sass/minimal-mistakes/_reset.scss rename to jekyll_archive/_sass/minimal-mistakes/_reset.scss diff --git a/_sass/minimal-mistakes/_search.scss b/jekyll_archive/_sass/minimal-mistakes/_search.scss similarity index 100% rename from _sass/minimal-mistakes/_search.scss rename to jekyll_archive/_sass/minimal-mistakes/_search.scss diff --git a/_sass/minimal-mistakes/_sidebar.scss b/jekyll_archive/_sass/minimal-mistakes/_sidebar.scss similarity index 100% rename from _sass/minimal-mistakes/_sidebar.scss rename to jekyll_archive/_sass/minimal-mistakes/_sidebar.scss diff --git a/_sass/minimal-mistakes/_syntax.scss b/jekyll_archive/_sass/minimal-mistakes/_syntax.scss similarity index 100% rename from _sass/minimal-mistakes/_syntax.scss rename to jekyll_archive/_sass/minimal-mistakes/_syntax.scss diff --git a/_sass/minimal-mistakes/_tables.scss b/jekyll_archive/_sass/minimal-mistakes/_tables.scss similarity index 100% rename from _sass/minimal-mistakes/_tables.scss rename to jekyll_archive/_sass/minimal-mistakes/_tables.scss diff --git a/_sass/minimal-mistakes/_utilities.scss b/jekyll_archive/_sass/minimal-mistakes/_utilities.scss similarity index 100% rename from _sass/minimal-mistakes/_utilities.scss rename to jekyll_archive/_sass/minimal-mistakes/_utilities.scss diff --git a/_sass/minimal-mistakes/_variables.scss b/jekyll_archive/_sass/minimal-mistakes/_variables.scss similarity index 100% rename from _sass/minimal-mistakes/_variables.scss rename to jekyll_archive/_sass/minimal-mistakes/_variables.scss diff --git a/_sass/minimal-mistakes/skins/_air.scss b/jekyll_archive/_sass/minimal-mistakes/skins/_air.scss similarity index 100% rename from _sass/minimal-mistakes/skins/_air.scss rename to jekyll_archive/_sass/minimal-mistakes/skins/_air.scss diff --git a/_sass/minimal-mistakes/skins/_aqua.scss b/jekyll_archive/_sass/minimal-mistakes/skins/_aqua.scss similarity index 100% rename from _sass/minimal-mistakes/skins/_aqua.scss rename to jekyll_archive/_sass/minimal-mistakes/skins/_aqua.scss diff --git a/_sass/minimal-mistakes/skins/_contrast.scss b/jekyll_archive/_sass/minimal-mistakes/skins/_contrast.scss similarity index 100% rename from _sass/minimal-mistakes/skins/_contrast.scss rename to jekyll_archive/_sass/minimal-mistakes/skins/_contrast.scss diff --git a/_sass/minimal-mistakes/skins/_dark.scss b/jekyll_archive/_sass/minimal-mistakes/skins/_dark.scss similarity index 100% rename from _sass/minimal-mistakes/skins/_dark.scss rename to jekyll_archive/_sass/minimal-mistakes/skins/_dark.scss diff --git a/_sass/minimal-mistakes/skins/_default.scss b/jekyll_archive/_sass/minimal-mistakes/skins/_default.scss similarity index 100% rename from _sass/minimal-mistakes/skins/_default.scss rename to jekyll_archive/_sass/minimal-mistakes/skins/_default.scss diff --git a/_sass/minimal-mistakes/skins/_dirt.scss b/jekyll_archive/_sass/minimal-mistakes/skins/_dirt.scss similarity index 100% rename from _sass/minimal-mistakes/skins/_dirt.scss rename to jekyll_archive/_sass/minimal-mistakes/skins/_dirt.scss diff --git a/_sass/minimal-mistakes/skins/_gold.scss b/jekyll_archive/_sass/minimal-mistakes/skins/_gold.scss similarity index 100% rename from _sass/minimal-mistakes/skins/_gold.scss rename to jekyll_archive/_sass/minimal-mistakes/skins/_gold.scss diff --git a/_sass/minimal-mistakes/skins/_mint.scss b/jekyll_archive/_sass/minimal-mistakes/skins/_mint.scss similarity index 100% rename from _sass/minimal-mistakes/skins/_mint.scss rename to jekyll_archive/_sass/minimal-mistakes/skins/_mint.scss diff --git a/_sass/minimal-mistakes/skins/_neon.scss b/jekyll_archive/_sass/minimal-mistakes/skins/_neon.scss similarity index 100% rename from _sass/minimal-mistakes/skins/_neon.scss rename to jekyll_archive/_sass/minimal-mistakes/skins/_neon.scss diff --git a/_sass/minimal-mistakes/skins/_plum.scss b/jekyll_archive/_sass/minimal-mistakes/skins/_plum.scss similarity index 100% rename from _sass/minimal-mistakes/skins/_plum.scss rename to jekyll_archive/_sass/minimal-mistakes/skins/_plum.scss diff --git a/_sass/minimal-mistakes/skins/_sunrise.scss b/jekyll_archive/_sass/minimal-mistakes/skins/_sunrise.scss similarity index 100% rename from _sass/minimal-mistakes/skins/_sunrise.scss rename to jekyll_archive/_sass/minimal-mistakes/skins/_sunrise.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_breakpoint.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_breakpoint.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/_breakpoint.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_breakpoint.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_context.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_context.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/_context.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_context.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_helpers.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_helpers.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/_helpers.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_helpers.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_legacy-settings.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_legacy-settings.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/_legacy-settings.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_legacy-settings.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_no-query.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_no-query.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/_no-query.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_no-query.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_parsers.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_parsers.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/_parsers.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_parsers.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_respond-to.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_respond-to.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/_respond-to.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_respond-to.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_settings.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_settings.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/_settings.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/_settings.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_double.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/_double.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/parsers/_double.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/_double.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_query.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/_query.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/parsers/_query.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/_query.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_resolution.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/_resolution.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/parsers/_resolution.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/_resolution.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_single.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/_single.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/parsers/_single.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/_single.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_triple.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/_triple.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/parsers/_triple.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/_triple.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default-pair.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default-pair.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default-pair.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default-pair.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_double-string.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_double-string.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/parsers/double/_double-string.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_double-string.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/single/_default.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/single/_default.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/parsers/single/_default.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/single/_default.scss diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/triple/_default.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/triple/_default.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/breakpoint/parsers/triple/_default.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/breakpoint/parsers/triple/_default.scss diff --git a/_sass/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss diff --git a/_sass/minimal-mistakes/vendor/magnific-popup/_settings.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/magnific-popup/_settings.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/magnific-popup/_settings.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/magnific-popup/_settings.scss diff --git a/_sass/minimal-mistakes/vendor/susy/_su.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/_su.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/_su.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/_su.scss diff --git a/_sass/minimal-mistakes/vendor/susy/_susy-prefix.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/_susy-prefix.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/_susy-prefix.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/_susy-prefix.scss diff --git a/_sass/minimal-mistakes/vendor/susy/_susy.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/_susy.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/_susy.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/_susy.scss diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-grid-math.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-grid-math.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-grid-math.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-grid-math.scss diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-settings.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-settings.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-settings.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-settings.scss diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-unprefix.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-unprefix.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-unprefix.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-unprefix.scss diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-utilities.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-utilities.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-utilities.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-utilities.scss diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_api.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_api.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/susy/_api.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_api.scss diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_normalize.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_normalize.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/susy/_normalize.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_normalize.scss diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_parse.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_parse.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/susy/_parse.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_parse.scss diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_settings.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_settings.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/susy/_settings.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_settings.scss diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_su-math.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_su-math.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/susy/_su-math.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_su-math.scss diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_su-validate.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_su-validate.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/susy/_su-validate.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_su-validate.scss diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_syntax-helpers.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_syntax-helpers.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/susy/_syntax-helpers.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_syntax-helpers.scss diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_unprefix.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_unprefix.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/susy/_unprefix.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_unprefix.scss diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_utilities.scss b/jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_utilities.scss similarity index 100% rename from _sass/minimal-mistakes/vendor/susy/susy/_utilities.scss rename to jekyll_archive/_sass/minimal-mistakes/vendor/susy/susy/_utilities.scss diff --git a/assets/css/main.scss b/jekyll_archive/assets/css/main.scss similarity index 100% rename from assets/css/main.scss rename to jekyll_archive/assets/css/main.scss diff --git a/jekyll_archive/assets/images/2016/07/201011_Fig_1.png b/jekyll_archive/assets/images/2016/07/201011_Fig_1.png new file mode 100644 index 0000000..3a9df6a Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/201011_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/201011_Fig_10.png b/jekyll_archive/assets/images/2016/07/201011_Fig_10.png new file mode 100644 index 0000000..28055c7 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/201011_Fig_10.png differ diff --git a/jekyll_archive/assets/images/2016/07/201011_Fig_2.png b/jekyll_archive/assets/images/2016/07/201011_Fig_2.png new file mode 100644 index 0000000..8edb5d9 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/201011_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/201011_Fig_3.png b/jekyll_archive/assets/images/2016/07/201011_Fig_3.png new file mode 100644 index 0000000..b8bcd1b Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/201011_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/201011_Fig_4.png b/jekyll_archive/assets/images/2016/07/201011_Fig_4.png new file mode 100644 index 0000000..1d0683f Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/201011_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/201011_Fig_5.png b/jekyll_archive/assets/images/2016/07/201011_Fig_5.png new file mode 100644 index 0000000..579f140 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/201011_Fig_5.png differ diff --git a/jekyll_archive/assets/images/2016/07/201011_Fig_6.png b/jekyll_archive/assets/images/2016/07/201011_Fig_6.png new file mode 100644 index 0000000..17d7139 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/201011_Fig_6.png differ diff --git a/jekyll_archive/assets/images/2016/07/201011_Fig_7.png b/jekyll_archive/assets/images/2016/07/201011_Fig_7.png new file mode 100644 index 0000000..98333d4 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/201011_Fig_7.png differ diff --git a/jekyll_archive/assets/images/2016/07/201011_Fig_8.png b/jekyll_archive/assets/images/2016/07/201011_Fig_8.png new file mode 100644 index 0000000..e5d151f Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/201011_Fig_8.png differ diff --git a/jekyll_archive/assets/images/2016/07/201011_Fig_9.png b/jekyll_archive/assets/images/2016/07/201011_Fig_9.png new file mode 100644 index 0000000..093455c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/201011_Fig_9.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110417_Fig_1.jpg b/jekyll_archive/assets/images/2016/07/20110417_Fig_1.jpg new file mode 100644 index 0000000..52d85fc Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110417_Fig_1.jpg differ diff --git a/jekyll_archive/assets/images/2016/07/20110417_Fig_2.jpg b/jekyll_archive/assets/images/2016/07/20110417_Fig_2.jpg new file mode 100644 index 0000000..d0d55e7 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110417_Fig_2.jpg differ diff --git a/jekyll_archive/assets/images/2016/07/20110417_Fig_3.jpg b/jekyll_archive/assets/images/2016/07/20110417_Fig_3.jpg new file mode 100644 index 0000000..10c4558 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110417_Fig_3.jpg differ diff --git a/jekyll_archive/assets/images/2016/07/20110429_Fig_1.png b/jekyll_archive/assets/images/2016/07/20110429_Fig_1.png new file mode 100644 index 0000000..9b29517 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110429_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110429_Fig_2.png b/jekyll_archive/assets/images/2016/07/20110429_Fig_2.png new file mode 100644 index 0000000..c113720 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110429_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110429_Fig_3.png b/jekyll_archive/assets/images/2016/07/20110429_Fig_3.png new file mode 100644 index 0000000..9d7d11b Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110429_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110429_Fig_4.png b/jekyll_archive/assets/images/2016/07/20110429_Fig_4.png new file mode 100644 index 0000000..c47cb8c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110429_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110429_Fig_5.png b/jekyll_archive/assets/images/2016/07/20110429_Fig_5.png new file mode 100644 index 0000000..cf56b2b Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110429_Fig_5.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_1.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_1.png new file mode 100644 index 0000000..0582cf9 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_10.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_10.png new file mode 100644 index 0000000..0f259eb Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_10.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_11.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_11.png new file mode 100644 index 0000000..747bb69 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_11.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_12.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_12.png new file mode 100644 index 0000000..76ea7e4 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_12.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_13.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_13.png new file mode 100644 index 0000000..b0f4c6a Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_13.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_2.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_2.png new file mode 100644 index 0000000..4a6a23c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_3.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_3.png new file mode 100644 index 0000000..cc931f8 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_4.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_4.png new file mode 100644 index 0000000..83698f9 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_5.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_5.png new file mode 100644 index 0000000..49b0122 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_5.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_6.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_6.png new file mode 100644 index 0000000..e336660 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_6.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_7.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_7.png new file mode 100644 index 0000000..8b6e0b8 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_7.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_8.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_8.png new file mode 100644 index 0000000..3d2c63c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_8.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110507_Fig_9.png b/jekyll_archive/assets/images/2016/07/20110507_Fig_9.png new file mode 100644 index 0000000..ee2be9e Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110507_Fig_9.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110604_Fig_1.png b/jekyll_archive/assets/images/2016/07/20110604_Fig_1.png new file mode 100644 index 0000000..383584e Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110604_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110604_Fig_2.png b/jekyll_archive/assets/images/2016/07/20110604_Fig_2.png new file mode 100644 index 0000000..20d5a59 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110604_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110604_Fig_3.png b/jekyll_archive/assets/images/2016/07/20110604_Fig_3.png new file mode 100644 index 0000000..6f87147 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110604_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110604_Fig_4.png b/jekyll_archive/assets/images/2016/07/20110604_Fig_4.png new file mode 100644 index 0000000..67627b1 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110604_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110604_Fig_5.png b/jekyll_archive/assets/images/2016/07/20110604_Fig_5.png new file mode 100644 index 0000000..b2df3f1 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110604_Fig_5.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110604_Fig_6.png b/jekyll_archive/assets/images/2016/07/20110604_Fig_6.png new file mode 100644 index 0000000..468e1b8 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110604_Fig_6.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110604_Fig_7.png b/jekyll_archive/assets/images/2016/07/20110604_Fig_7.png new file mode 100644 index 0000000..0aeacdc Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110604_Fig_7.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110620_Fig_1.png b/jekyll_archive/assets/images/2016/07/20110620_Fig_1.png new file mode 100644 index 0000000..cb02af9 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110620_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20110620_Fig_2.png b/jekyll_archive/assets/images/2016/07/20110620_Fig_2.png new file mode 100644 index 0000000..bb5597c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20110620_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_1.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_1.png new file mode 100644 index 0000000..9494d56 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_10.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_10.png new file mode 100644 index 0000000..71cae8d Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_10.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_11.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_11.png new file mode 100644 index 0000000..7644788 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_11.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_12.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_12.png new file mode 100644 index 0000000..e921c5f Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_12.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_13.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_13.png new file mode 100644 index 0000000..fff5247 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_13.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_14.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_14.png new file mode 100644 index 0000000..4deb828 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_14.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_15.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_15.png new file mode 100644 index 0000000..2ad61ad Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_15.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_16.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_16.png new file mode 100644 index 0000000..69ff58e Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_16.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_17.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_17.png new file mode 100644 index 0000000..6447e73 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_17.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_2.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_2.png new file mode 100644 index 0000000..ca3fc77 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_3.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_3.png new file mode 100644 index 0000000..b23cfee Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_4.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_4.png new file mode 100644 index 0000000..4fcff96 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_5.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_5.png new file mode 100644 index 0000000..e548239 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_5.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_6.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_6.png new file mode 100644 index 0000000..00eb627 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_6.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_7.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_7.png new file mode 100644 index 0000000..a06b679 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_7.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_8.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_8.png new file mode 100644 index 0000000..b839c57 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_8.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111104_Fig_9.png b/jekyll_archive/assets/images/2016/07/20111104_Fig_9.png new file mode 100644 index 0000000..6f70fc8 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111104_Fig_9.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_1.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_1.png new file mode 100644 index 0000000..36eb9d7 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_10.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_10.png new file mode 100644 index 0000000..ece4cbe Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_10.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_11.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_11.png new file mode 100644 index 0000000..b0ac90f Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_11.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_12.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_12.png new file mode 100644 index 0000000..c1976d7 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_12.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_2.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_2.png new file mode 100644 index 0000000..f4a95ec Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_3.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_3.png new file mode 100644 index 0000000..ee12635 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_4.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_4.png new file mode 100644 index 0000000..dd39b24 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_5.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_5.png new file mode 100644 index 0000000..78da8b5 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_5.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_6.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_6.png new file mode 100644 index 0000000..c100118 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_6.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_7.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_7.png new file mode 100644 index 0000000..47577c1 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_7.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_8.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_8.png new file mode 100644 index 0000000..66fcae1 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_8.png differ diff --git a/jekyll_archive/assets/images/2016/07/20111106_Fig_9.png b/jekyll_archive/assets/images/2016/07/20111106_Fig_9.png new file mode 100644 index 0000000..d3401cc Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20111106_Fig_9.png differ diff --git a/jekyll_archive/assets/images/2016/07/2011_Fig_11.jpg b/jekyll_archive/assets/images/2016/07/2011_Fig_11.jpg new file mode 100644 index 0000000..0355038 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/2011_Fig_11.jpg differ diff --git a/jekyll_archive/assets/images/2016/07/20120220_Fig_1.png b/jekyll_archive/assets/images/2016/07/20120220_Fig_1.png new file mode 100644 index 0000000..4c9531b Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120220_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120220_Fig_2.png b/jekyll_archive/assets/images/2016/07/20120220_Fig_2.png new file mode 100644 index 0000000..d94ac6d Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120220_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120220_Fig_3.png b/jekyll_archive/assets/images/2016/07/20120220_Fig_3.png new file mode 100644 index 0000000..b198ed5 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120220_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120220_Fig_4.png b/jekyll_archive/assets/images/2016/07/20120220_Fig_4.png new file mode 100644 index 0000000..bd32772 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120220_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120220_Fig_5.png b/jekyll_archive/assets/images/2016/07/20120220_Fig_5.png new file mode 100644 index 0000000..57b65b7 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120220_Fig_5.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120220_Fig_6.png b/jekyll_archive/assets/images/2016/07/20120220_Fig_6.png new file mode 100644 index 0000000..5983d6b Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120220_Fig_6.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120220_Fig_7.png b/jekyll_archive/assets/images/2016/07/20120220_Fig_7.png new file mode 100644 index 0000000..ebe8bdf Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120220_Fig_7.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120220_Fig_8.png b/jekyll_archive/assets/images/2016/07/20120220_Fig_8.png new file mode 100644 index 0000000..acf1620 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120220_Fig_8.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_1.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_1.png new file mode 100644 index 0000000..781c5e3 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_10.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_10.png new file mode 100644 index 0000000..581ca29 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_10.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_11.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_11.png new file mode 100644 index 0000000..5b9ce47 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_11.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_12.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_12.png new file mode 100644 index 0000000..f1688e1 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_12.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_13.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_13.png new file mode 100644 index 0000000..d17948d Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_13.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_14.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_14.png new file mode 100644 index 0000000..98c7457 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_14.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_15.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_15.png new file mode 100644 index 0000000..c7a5974 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_15.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_16.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_16.png new file mode 100644 index 0000000..bc6270c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_16.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_2.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_2.png new file mode 100644 index 0000000..d365c57 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_3.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_3.png new file mode 100644 index 0000000..f25fa22 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_4.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_4.png new file mode 100644 index 0000000..61e8242 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_5.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_5.png new file mode 100644 index 0000000..17da14f Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_5.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_6.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_6.png new file mode 100644 index 0000000..ec62b47 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_6.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_7.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_7.png new file mode 100644 index 0000000..fcdc2ee Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_7.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_8.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_8.png new file mode 100644 index 0000000..aa52031 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_8.png differ diff --git a/jekyll_archive/assets/images/2016/07/20120316_Fig_9.png b/jekyll_archive/assets/images/2016/07/20120316_Fig_9.png new file mode 100644 index 0000000..bb157aa Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20120316_Fig_9.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121012_Fig_1.png b/jekyll_archive/assets/images/2016/07/20121012_Fig_1.png new file mode 100644 index 0000000..4e75c8d Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121012_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121012_Fig_2.png b/jekyll_archive/assets/images/2016/07/20121012_Fig_2.png new file mode 100644 index 0000000..72afdce Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121012_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121012_Fig_3.png b/jekyll_archive/assets/images/2016/07/20121012_Fig_3.png new file mode 100644 index 0000000..e46e994 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121012_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_1.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_1.png new file mode 100644 index 0000000..5476dcd Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_10.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_10.png new file mode 100644 index 0000000..37a6f32 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_10.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_11.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_11.png new file mode 100644 index 0000000..ddb6c7d Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_11.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_12.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_12.png new file mode 100644 index 0000000..7e3e34d Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_12.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_13.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_13.png new file mode 100644 index 0000000..58c43e4 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_13.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_14.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_14.png new file mode 100644 index 0000000..aeb3192 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_14.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_14a.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_14a.png new file mode 100644 index 0000000..0f27720 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_14a.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_15.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_15.png new file mode 100644 index 0000000..5f9e38e Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_15.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_16.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_16.png new file mode 100644 index 0000000..a263f1b Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_16.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_17.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_17.png new file mode 100644 index 0000000..75a25a5 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_17.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_18.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_18.png new file mode 100644 index 0000000..14f26c3 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_18.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_19.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_19.png new file mode 100644 index 0000000..4315412 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_19.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_2.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_2.png new file mode 100644 index 0000000..23240bd Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_20.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_20.png new file mode 100644 index 0000000..d3634ed Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_20.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_21.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_21.png new file mode 100644 index 0000000..272a1d6 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_21.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_22.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_22.png new file mode 100644 index 0000000..e65547e Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_22.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_23.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_23.png new file mode 100644 index 0000000..73dea7d Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_23.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_24.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_24.png new file mode 100644 index 0000000..d015709 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_24.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_25.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_25.png new file mode 100644 index 0000000..294f1c6 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_25.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_26.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_26.png new file mode 100644 index 0000000..d52a4d3 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_26.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_27.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_27.png new file mode 100644 index 0000000..be5c086 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_27.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_28.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_28.png new file mode 100644 index 0000000..fb529ca Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_28.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_29.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_29.png new file mode 100644 index 0000000..056640c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_29.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_3.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_3.png new file mode 100644 index 0000000..7ec710c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_4.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_4.png new file mode 100644 index 0000000..c962c1c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_5.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_5.png new file mode 100644 index 0000000..a1fe629 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_5.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_6.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_6.png new file mode 100644 index 0000000..7da94bc Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_6.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_7.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_7.png new file mode 100644 index 0000000..458081b Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_7.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_8.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_8.png new file mode 100644 index 0000000..22350fe Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_8.png differ diff --git a/jekyll_archive/assets/images/2016/07/20121018_Fig_9.png b/jekyll_archive/assets/images/2016/07/20121018_Fig_9.png new file mode 100644 index 0000000..e1bf2ed Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20121018_Fig_9.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130101_Fig_1.png b/jekyll_archive/assets/images/2016/07/20130101_Fig_1.png new file mode 100644 index 0000000..c55d990 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130101_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130101_Fig_2.png b/jekyll_archive/assets/images/2016/07/20130101_Fig_2.png new file mode 100644 index 0000000..ba0fa40 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130101_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130101_Fig_3.png b/jekyll_archive/assets/images/2016/07/20130101_Fig_3.png new file mode 100644 index 0000000..ce62a5b Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130101_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130101_Fig_4.png b/jekyll_archive/assets/images/2016/07/20130101_Fig_4.png new file mode 100644 index 0000000..dcd844b Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130101_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130101_Fig_5.png b/jekyll_archive/assets/images/2016/07/20130101_Fig_5.png new file mode 100644 index 0000000..f06b625 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130101_Fig_5.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130101_Fig_6.png b/jekyll_archive/assets/images/2016/07/20130101_Fig_6.png new file mode 100644 index 0000000..f0a5423 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130101_Fig_6.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130118_Fig_1.png b/jekyll_archive/assets/images/2016/07/20130118_Fig_1.png new file mode 100644 index 0000000..e82c31c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130118_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130118_Fig_2.png b/jekyll_archive/assets/images/2016/07/20130118_Fig_2.png new file mode 100644 index 0000000..918c8c2 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130118_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130118_Fig_3.png b/jekyll_archive/assets/images/2016/07/20130118_Fig_3.png new file mode 100644 index 0000000..154d02c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130118_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130118_Fig_4.png b/jekyll_archive/assets/images/2016/07/20130118_Fig_4.png new file mode 100644 index 0000000..ad7348d Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130118_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_1.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_1.png new file mode 100644 index 0000000..7b719fa Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_1.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_10.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_10.png new file mode 100644 index 0000000..257d2d7 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_10.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_11.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_11.png new file mode 100644 index 0000000..74aba20 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_11.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_12.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_12.png new file mode 100644 index 0000000..6d8aa30 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_12.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_2.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_2.png new file mode 100644 index 0000000..0796511 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_2.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_3.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_3.png new file mode 100644 index 0000000..a495993 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_3.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_4.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_4.png new file mode 100644 index 0000000..377ca8b Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_4.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_5.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_5.png new file mode 100644 index 0000000..05ae0b1 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_5.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_6.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_6.png new file mode 100644 index 0000000..d524588 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_6.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_7.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_7.png new file mode 100644 index 0000000..ef5e88d Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_7.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_8.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_8.png new file mode 100644 index 0000000..9416e6a Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_8.png differ diff --git a/jekyll_archive/assets/images/2016/07/20130317_Fig_9.png b/jekyll_archive/assets/images/2016/07/20130317_Fig_9.png new file mode 100644 index 0000000..176fceb Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20130317_Fig_9.png differ diff --git a/jekyll_archive/assets/images/2016/07/20160718_Fig_1.PNG b/jekyll_archive/assets/images/2016/07/20160718_Fig_1.PNG new file mode 100644 index 0000000..42d35bf Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20160718_Fig_1.PNG differ diff --git a/jekyll_archive/assets/images/2016/07/20160718_Fig_2.PNG b/jekyll_archive/assets/images/2016/07/20160718_Fig_2.PNG new file mode 100644 index 0000000..56b8d6b Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20160718_Fig_2.PNG differ diff --git a/jekyll_archive/assets/images/2016/07/20160718_Fig_3.PNG b/jekyll_archive/assets/images/2016/07/20160718_Fig_3.PNG new file mode 100644 index 0000000..fdd5a98 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20160718_Fig_3.PNG differ diff --git a/jekyll_archive/assets/images/2016/07/20160718_Fig_4.PNG b/jekyll_archive/assets/images/2016/07/20160718_Fig_4.PNG new file mode 100644 index 0000000..337795c Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/20160718_Fig_4.PNG differ diff --git a/jekyll_archive/assets/images/2016/07/Figure-1-1.png b/jekyll_archive/assets/images/2016/07/Figure-1-1.png new file mode 100644 index 0000000..5d34967 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/Figure-1-1.png differ diff --git a/jekyll_archive/assets/images/2016/07/Figure-2.png b/jekyll_archive/assets/images/2016/07/Figure-2.png new file mode 100644 index 0000000..6d1afdd Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/Figure-2.png differ diff --git a/jekyll_archive/assets/images/2016/07/Figure-3.png b/jekyll_archive/assets/images/2016/07/Figure-3.png new file mode 100644 index 0000000..77dd65a Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/Figure-3.png differ diff --git a/jekyll_archive/assets/images/2016/07/Figure-4.png b/jekyll_archive/assets/images/2016/07/Figure-4.png new file mode 100644 index 0000000..b2f6522 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/Figure-4.png differ diff --git a/jekyll_archive/assets/images/2016/07/Figure-5.png b/jekyll_archive/assets/images/2016/07/Figure-5.png new file mode 100644 index 0000000..2dbcc23 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/Figure-5.png differ diff --git a/jekyll_archive/assets/images/2016/07/Maitreya.png b/jekyll_archive/assets/images/2016/07/Maitreya.png new file mode 100644 index 0000000..e450c85 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/Maitreya.png differ diff --git a/jekyll_archive/assets/images/2016/07/Workday-Time-Diff-mono.svg b/jekyll_archive/assets/images/2016/07/Workday-Time-Diff-mono.svg new file mode 100644 index 0000000..f7aea8c --- /dev/null +++ b/jekyll_archive/assets/images/2016/07/Workday-Time-Diff-mono.svg @@ -0,0 +1 @@ +Get the parameter values from calling function- assigneddatetime in 'YYYY-MM-DD hh:mm' format,- closeddatetime in 'YYYY-MM-DD hh:mm' format,- starttime in 'hh:mm' format,- endtime in 'hh:mm' formatSet @starttime = starttimeSet @endtime = endtimeSet @assigneddate = assigneddatetimeSet @closeddate = closeddatetimeSet @timecount = 0Set @timevar1 = @assigneddateSet @nextdate = @assigneddateSet @timevar2 = null1.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hoursSelect time_to_sec(timediff(@endtime,@starttime))/3600into @maxhoursadaySet @checkstart = nullSet @checkend = nullSelect CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1), ' ',@starttime),CONCAT(SUBSTRING_INDEX(@closeddate, ' ', 1), ' ',@endtime) into @checkstart, @checkendyes@assigneddate > @checkstart@closeddate<@checkendyesnoSet @assigneddate = @assigneddateSet @closeddate = @closeddateSet @assigneddate = @assigneddateSet @closeddate = @checkendyes@closeddate<@checkendnoSET @assigneddate = @checkstartSet @closeddate = @closeddateSET @assigneddate = @checkstartSet @closeddate = @checkendSELECT DATEDIFF(@closeddate, @assigneddate)INTO @fixcountSet @count = @fixcountfixcount>0?yesif not, avoid while loop asboth assigned and closed dateare same.calculate weekday for nextdateselect weekday(@nextdate) into @weekdaySet the holiday flag toanything other than zeroif the value in nextdatefor this loop is a holidaySelect sum(if(date_format(holiday_date,'%Y-%m-%d') =substring_index(@nextdate,' ',1),1,0)) fromholiday_table where Country_codes = 'ALL'or instr(Country_codes,@param_country)>0 into@holidayflag@weekday<5? and @holidayflag=0yesit is a weekend so get nextdateWeekday_Calculationsyes@count = @fixcount?Set @timevar1 = @assigneddateSELECT CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1),' ',@endtime)INTO @timevar2yes@count = 0?noSelect concat(substring_index(@closeddate,' ',1),' ',@starttime)into @timevar1Set @timevar2 = @closeddateif neither of previous conditionsare true,then nextdate is neitherclosedate nor assigneddate so justuse the date with normal start andend timeSelect concat(@nextdate,' ',@starttime)into @timevar1SELECT CONCAT(@nextdate, ' ', @endtime)INTO @timevar21.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hours4.if the difference was negative, GREATEST willignore result in favour of 05.If result is greater than max working hours,LEAST will ignore result in favour of maxhoursdaySELECT LEAST(Greatest((TIME_TO_SEC(TIMEDIFF(@timevar2, @timevar1))) / 3600),0), @maxhoursaday)INTO @timecounttempSet @timecount = @timecounttemp + @timecountSet @timevar1 = @nextdateSELECTADDDATE(SUBSTRING_INDEX(@timevar1, ' ', 1),1)INTO @nextdateSet @count = @count - 1truecount>=0?false1.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hours4.if the difference was negative, GREATEST willignore result in favour of 05.If result is greater than max working hours,LEAST will ignore result in favour of maxhoursdaySELECT Least(Greatest(((TIME_TO_SEC(TIMEDIFF(@closeddate, @assigneddate)))/ 3600),0),@maxhoursaday) INTO @timecountreturn timecount*60 \ No newline at end of file diff --git a/jekyll_archive/assets/images/2016/07/Workday-Time-Diff.svg b/jekyll_archive/assets/images/2016/07/Workday-Time-Diff.svg new file mode 100644 index 0000000..26f0dd4 --- /dev/null +++ b/jekyll_archive/assets/images/2016/07/Workday-Time-Diff.svg @@ -0,0 +1 @@ +Get the parameter values from calling function- assigneddatetime in 'YYYY-MM-DD hh:mm' format,- closeddatetime in 'YYYY-MM-DD hh:mm' format,- starttime in 'hh:mm' format,- endtime in 'hh:mm' formatSet @starttime = starttimeSet @endtime = endtimeSet @assigneddate = assigneddatetimeSet @closeddate = closeddatetimeSet @timecount = 0Set @timevar1 = @assigneddateSet @nextdate = @assigneddateSet @timevar2 = null1.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hoursSelect time_to_sec(timediff(@endtime,@starttime))/3600into @maxhoursadaySet @checkstart = nullSet @checkend = nullSelect CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1), ' ',@starttime),CONCAT(SUBSTRING_INDEX(@closeddate, ' ', 1), ' ',@endtime) into @checkstart, @checkendyes@assigneddate > @checkstart@closeddate<@checkendyesnoSet @assigneddate = @assigneddateSet @closeddate = @closeddateSet @assigneddate = @assigneddateSet @closeddate = @checkendyes@closeddate<@checkendnoSET @assigneddate = @checkstartSet @closeddate = @closeddateSET @assigneddate = @checkstartSet @closeddate = @checkendSELECT DATEDIFF(@closeddate, @assigneddate)INTO @fixcountSet @count = @fixcountfixcount>0?yesif not, avoid while loop asboth assigned and closed dateare same.calculate weekday for nextdateselect weekday(@nextdate) into @weekdaySet the holiday flag toanything other than zeroif the value in nextdatefor this loop is a holidaySelect sum(if(date_format(holiday_date,'%Y-%m-%d') =substring_index(@nextdate,' ',1),1,0)) fromholiday_table where Country_codes = 'ALL'or instr(Country_codes,@param_country)>0 into@holidayflag@weekday<5? and @holidayflag=0yesit is a weekend so get nextdateWeekday_Calculationsyes@count = @fixcount?Set @timevar1 = @assigneddateSELECT CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1),' ',@endtime)INTO @timevar2yes@count = 0?noSelect concat(substring_index(@closeddate,' ',1),' ',@starttime)into @timevar1Set @timevar2 = @closeddateif neither of previous conditionsare true,then nextdate is neitherclosedate nor assigneddate so justuse the date with normal start andend timeSelect concat(@nextdate,' ',@starttime)into @timevar1SELECT CONCAT(@nextdate, ' ', @endtime)INTO @timevar21.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hours4.if the difference was negative, GREATEST willignore result in favour of 05.If result is greater than max working hours,LEAST will ignore result in favour of maxhoursdaySELECT LEAST(Greatest((TIME_TO_SEC(TIMEDIFF(@timevar2, @timevar1))) / 3600),0), @maxhoursaday)INTO @timecounttempSet @timecount = @timecounttemp + @timecountSet @timevar1 = @nextdateSELECTADDDATE(SUBSTRING_INDEX(@timevar1, ' ', 1),1)INTO @nextdateSet @count = @count - 1truecount>=0?false1.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hours4.if the difference was negative, GREATEST willignore result in favour of 05.If result is greater than max working hours,LEAST will ignore result in favour of maxhoursdaySELECT Least(Greatest(((TIME_TO_SEC(TIMEDIFF(@closeddate, @assigneddate)))/ 3600),0),@maxhoursaday) INTO @timecountreturn timecount*60 \ No newline at end of file diff --git a/jekyll_archive/assets/images/2016/07/advanced-dns-3-6-2016-171.png b/jekyll_archive/assets/images/2016/07/advanced-dns-3-6-2016-171.png new file mode 100644 index 0000000..c09aef0 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/advanced-dns-3-6-2016-171.png differ diff --git a/jekyll_archive/assets/images/2016/07/profile.PNG b/jekyll_archive/assets/images/2016/07/profile.PNG new file mode 100644 index 0000000..1e1f3b6 Binary files /dev/null and b/jekyll_archive/assets/images/2016/07/profile.PNG differ diff --git a/jekyll_archive/assets/images/2016/09/ComputerFrustration.jpg b/jekyll_archive/assets/images/2016/09/ComputerFrustration.jpg new file mode 100644 index 0000000..1666742 Binary files /dev/null and b/jekyll_archive/assets/images/2016/09/ComputerFrustration.jpg differ diff --git a/jekyll_archive/assets/images/2017/02/Administration-Command.PNG b/jekyll_archive/assets/images/2017/02/Administration-Command.PNG new file mode 100644 index 0000000..4dfed14 Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/Administration-Command.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/Administration-Management.PNG b/jekyll_archive/assets/images/2017/02/Administration-Management.PNG new file mode 100644 index 0000000..5dca7c6 Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/Administration-Management.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/CuteMarkEd-2017-02-12-20-02-02.png b/jekyll_archive/assets/images/2017/02/CuteMarkEd-2017-02-12-20-02-02.png new file mode 100644 index 0000000..cad95c1 Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/CuteMarkEd-2017-02-12-20-02-02.png differ diff --git a/jekyll_archive/assets/images/2017/02/DDNS.PNG b/jekyll_archive/assets/images/2017/02/DDNS.PNG new file mode 100644 index 0000000..708af42 Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/DDNS.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/DateGantt.PNG b/jekyll_archive/assets/images/2017/02/DateGantt.PNG new file mode 100644 index 0000000..068c092 Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/DateGantt.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/GanttChartCuteMarkEd-1.PNG b/jekyll_archive/assets/images/2017/02/GanttChartCuteMarkEd-1.PNG new file mode 100644 index 0000000..1b60f6a Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/GanttChartCuteMarkEd-1.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/GanttChartCuteMarkEd-2.PNG b/jekyll_archive/assets/images/2017/02/GanttChartCuteMarkEd-2.PNG new file mode 100644 index 0000000..46d6de5 Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/GanttChartCuteMarkEd-2.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/GanttChartCuteMarkEd.PNG b/jekyll_archive/assets/images/2017/02/GanttChartCuteMarkEd.PNG new file mode 100644 index 0000000..1b60f6a Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/GanttChartCuteMarkEd.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/NAT-QOS-PortForwarding.PNG b/jekyll_archive/assets/images/2017/02/NAT-QOS-PortForwarding.PNG new file mode 100644 index 0000000..bfde33d Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/NAT-QOS-PortForwarding.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/NAT-QOS-PortRangeForwarding.PNG b/jekyll_archive/assets/images/2017/02/NAT-QOS-PortRangeForwarding.PNG new file mode 100644 index 0000000..c41ee4b Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/NAT-QOS-PortRangeForwarding.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/Services-Services.PNG b/jekyll_archive/assets/images/2017/02/Services-Services.PNG new file mode 100644 index 0000000..e4f2f47 Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/Services-Services.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/SetupBasicSetup_1.PNG b/jekyll_archive/assets/images/2017/02/SetupBasicSetup_1.PNG new file mode 100644 index 0000000..5dcb070 Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/SetupBasicSetup_1.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/SetupBasicSetup_2.PNG b/jekyll_archive/assets/images/2017/02/SetupBasicSetup_2.PNG new file mode 100644 index 0000000..8757139 Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/SetupBasicSetup_2.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/Wireless-Basic-Settings.PNG b/jekyll_archive/assets/images/2017/02/Wireless-Basic-Settings.PNG new file mode 100644 index 0000000..81e9637 Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/Wireless-Basic-Settings.PNG differ diff --git a/jekyll_archive/assets/images/2017/02/Wireless-Wireless-Security.PNG b/jekyll_archive/assets/images/2017/02/Wireless-Wireless-Security.PNG new file mode 100644 index 0000000..1a623c6 Binary files /dev/null and b/jekyll_archive/assets/images/2017/02/Wireless-Wireless-Security.PNG differ diff --git a/jekyll_archive/assets/images/2017/10/Screenshot-from-2017-10-17-23-32-43.png b/jekyll_archive/assets/images/2017/10/Screenshot-from-2017-10-17-23-32-43.png new file mode 100644 index 0000000..43b0145 Binary files /dev/null and b/jekyll_archive/assets/images/2017/10/Screenshot-from-2017-10-17-23-32-43.png differ diff --git a/jekyll_archive/assets/images/2017/10/finish-install-process.PNG b/jekyll_archive/assets/images/2017/10/finish-install-process.PNG new file mode 100644 index 0000000..29ff0b8 Binary files /dev/null and b/jekyll_archive/assets/images/2017/10/finish-install-process.PNG differ diff --git a/jekyll_archive/assets/images/2017/10/nginx-not-found.PNG b/jekyll_archive/assets/images/2017/10/nginx-not-found.PNG new file mode 100644 index 0000000..35507d6 Binary files /dev/null and b/jekyll_archive/assets/images/2017/10/nginx-not-found.PNG differ diff --git a/jekyll_archive/assets/images/2017/11/Menu_001.png b/jekyll_archive/assets/images/2017/11/Menu_001.png new file mode 100644 index 0000000..389a2e9 Binary files /dev/null and b/jekyll_archive/assets/images/2017/11/Menu_001.png differ diff --git a/jekyll_archive/assets/images/2018/01/20171219_163816.jpg b/jekyll_archive/assets/images/2018/01/20171219_163816.jpg new file mode 100644 index 0000000..54cc8fc Binary files /dev/null and b/jekyll_archive/assets/images/2018/01/20171219_163816.jpg differ diff --git a/jekyll_archive/assets/images/2018/01/Workday-Time-Diff-mono.svg b/jekyll_archive/assets/images/2018/01/Workday-Time-Diff-mono.svg new file mode 100644 index 0000000..1708067 --- /dev/null +++ b/jekyll_archive/assets/images/2018/01/Workday-Time-Diff-mono.svg @@ -0,0 +1,169 @@ +Get the parameter values from calling function- assigneddatetime in 'YYYY-MM-DD hh:mm' format,- closeddatetime in 'YYYY-MM-DD hh:mm' format,- starttime in 'hh:mm' format,- endtime in 'hh:mm' formatSet @starttime = starttimeSet @endtime = endtimeSet @assigneddate = assigneddatetimeSet @closeddate = closeddatetimeSet @timecount = 0Set @timevar1 = @assigneddateSet @nextdate = @assigneddateSet @timevar2 = null1.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hoursSelect time_to_sec(timediff(@endtime,@starttime))/3600into @maxhoursadaySet @checkstart = nullSet @checkend = nullSelect CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1), ' ',@starttime),CONCAT(SUBSTRING_INDEX(@closeddate, ' ', 1), ' ',@endtime) into @checkstart, @checkendyes@assigneddate > @checkstart@closeddate<@checkendyesnoSet @assigneddate = @assigneddateSet @closeddate = @closeddateSet @assigneddate = @assigneddateSet @closeddate = @checkendyes@closeddate<@checkendnoSET @assigneddate = @checkstartSet @closeddate = @closeddateSET @assigneddate = @checkstartSet @closeddate = @checkendSELECT DATEDIFF(@closeddate, @assigneddate)INTO @fixcountSet @count = @fixcountfixcount>0?yesif not, avoid while loop asboth assigned and closed dateare same.calculate weekday for nextdateselect weekday(@nextdate) into @weekdaySet the holiday flag toanything other than zeroif the value in nextdatefor this loop is a holidaySelect sum(if(date_format(holiday_date,'%Y-%m-%d') =substring_index(@nextdate,' ',1),1,0)) fromholiday_table where Country_codes = 'ALL'or instr(Country_codes,@param_country)>0 into@holidayflagWeekday_Calculationsyes@count = @fixcount?Set @timevar1 = @assigneddateSELECT CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1),' ',@endtime)INTO @timevar2yes@count = 0?noSelect concat(substring_index(@closeddate,' ',1),' ',@starttime)into @timevar1Set @timevar2 = @closeddateif neither of previous conditionsare true,then nextdate is neitherclosedate nor assigneddate so justuse the date with normal start andend timeSelect concat(@nextdate,' ',@starttime)into @timevar1SELECT CONCAT(@nextdate, ' ', @endtime)INTO @timevar21.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hours4.if the difference was negative, GREATEST willignore result in favour of 05.If result is greater than max working hours,LEAST will ignore result in favour of maxhoursdaySELECT LEAST(Greatest((TIME_TO_SEC(TIMEDIFF(@timevar2, @timevar1))) / 3600),0), @maxhoursaday)INTO @timecounttempSet @timecount = @timecounttemp + @timecountyes@weekday<5? and @holidayflag=0it is a weekend so get nextdateSet @timevar1 = @nextdateSELECTADDDATE(SUBSTRING_INDEX(@timevar1, ' ', 1),1)INTO @nextdateSet @count = @count - 1truecount>=0?falsecalculate weekday for assigneddateselect weekday(@assigneddate) into @weekdaySet the holiday flag toanything other than zeroif the value in nextdatefor this loop is a holidaySelect sum(if(date_format(holiday_date,'%Y-%m-%d') =substring_index(@assigneddate,' ',1),1,0)) fromholiday_table where Country_codes = 'ALL'or instr(Country_codes,@param_country)>0 into@holidayflag@weekday<5? and @holidayflag=0yesif assigned and closed over holiday / weekend, set @timecount to 01.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hours4.if the difference was negative, GREATEST willignore result in favour of 05.If result is greater than max working hours,LEAST will ignore result in favour of maxhoursdaySELECT Least(Greatest(((TIME_TO_SEC(TIMEDIFF(@closeddate, @assigneddate)))/ 3600),0),@maxhoursaday) INTO @timecountSet @timecount = 0return timecount*60 \ No newline at end of file diff --git a/jekyll_archive/assets/images/2018/01/Workday-Time-Diff.svg b/jekyll_archive/assets/images/2018/01/Workday-Time-Diff.svg new file mode 100644 index 0000000..1f1532c --- /dev/null +++ b/jekyll_archive/assets/images/2018/01/Workday-Time-Diff.svg @@ -0,0 +1,168 @@ +Get the parameter values from calling function- assigneddatetime in 'YYYY-MM-DD hh:mm' format,- closeddatetime in 'YYYY-MM-DD hh:mm' format,- starttime in 'hh:mm' format,- endtime in 'hh:mm' formatSet @starttime = starttimeSet @endtime = endtimeSet @assigneddate = assigneddatetimeSet @closeddate = closeddatetimeSet @timecount = 0Set @timevar1 = @assigneddateSet @nextdate = @assigneddateSet @timevar2 = null1.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hoursSelect time_to_sec(timediff(@endtime,@starttime))/3600into @maxhoursadaySet @checkstart = nullSet @checkend = nullSelect CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1), ' ',@starttime),CONCAT(SUBSTRING_INDEX(@closeddate, ' ', 1), ' ',@endtime) into @checkstart, @checkendyes@assigneddate > @checkstart@closeddate<@checkendyesnoSet @assigneddate = @assigneddateSet @closeddate = @closeddateSet @assigneddate = @assigneddateSet @closeddate = @checkendyes@closeddate<@checkendnoSET @assigneddate = @checkstartSet @closeddate = @closeddateSET @assigneddate = @checkstartSet @closeddate = @checkendSELECT DATEDIFF(@closeddate, @assigneddate)INTO @fixcountSet @count = @fixcountfixcount>0?yesif not, avoid while loop asboth assigned and closed dateare same.calculate weekday for nextdateselect weekday(@nextdate) into @weekdaySet the holiday flag toanything other than zeroif the value in nextdatefor this loop is a holidaySelect sum(if(date_format(holiday_date,'%Y-%m-%d') =substring_index(@nextdate,' ',1),1,0)) fromholiday_table where Country_codes = 'ALL'or instr(Country_codes,@param_country)>0 into@holidayflagWeekday_Calculationsyes@count = @fixcount?Set @timevar1 = @assigneddateSELECT CONCAT(SUBSTRING_INDEX(@assigneddate, ' ', 1),' ',@endtime)INTO @timevar2yes@count = 0?noSelect concat(substring_index(@closeddate,' ',1),' ',@starttime)into @timevar1Set @timevar2 = @closeddateif neither of previous conditionsare true,then nextdate is neitherclosedate nor assigneddate so justuse the date with normal start andend timeSelect concat(@nextdate,' ',@starttime)into @timevar1SELECT CONCAT(@nextdate, ' ', @endtime)INTO @timevar21.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hours4.if the difference was negative, GREATEST willignore result in favour of 05.If result is greater than max working hours,LEAST will ignore result in favour of maxhoursdaySELECT LEAST(Greatest((TIME_TO_SEC(TIMEDIFF(@timevar2, @timevar1))) / 3600),0), @maxhoursaday)INTO @timecounttempSet @timecount = @timecounttemp + @timecountyes@weekday<5? and @holidayflag=0it is a weekend so get nextdateSet @timevar1 = @nextdateSELECTADDDATE(SUBSTRING_INDEX(@timevar1, ' ', 1),1)INTO @nextdateSet @count = @count - 1truecount>=0?falsecalculate weekday for assigneddateselect weekday(@assigneddate) into @weekdaySet the holiday flag toanything other than zeroif the value in nextdatefor this loop is a holidaySelect sum(if(date_format(holiday_date,'%Y-%m-%d') =substring_index(@assigneddate,' ',1),1,0)) fromholiday_table where Country_codes = 'ALL'or instr(Country_codes,@param_country)>0 into@holidayflag@weekday<5? and @holidayflag=0yesif assigned and closed over holiday / weekend, set @timecount to 01.TIMEDIFF calculates difference between two times2.Time_to_sec function converts data into seconds3.Dividing by 3600 converts the time into hours4.if the difference was negative, GREATEST willignore result in favour of 05.If result is greater than max working hours,LEAST will ignore result in favour of maxhoursdaySELECT Least(Greatest(((TIME_TO_SEC(TIMEDIFF(@closeddate, @assigneddate)))/ 3600),0),@maxhoursaday) INTO @timecountSet @timecount = 0return timecount*60 \ No newline at end of file diff --git a/jekyll_archive/assets/images/2018/06/Gajim_2018-06-15_17-10-11.png b/jekyll_archive/assets/images/2018/06/Gajim_2018-06-15_17-10-11.png new file mode 100644 index 0000000..16bbb1b Binary files /dev/null and b/jekyll_archive/assets/images/2018/06/Gajim_2018-06-15_17-10-11.png differ diff --git a/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_12-08-21.png b/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_12-08-21.png new file mode 100644 index 0000000..938dd5c Binary files /dev/null and b/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_12-08-21.png differ diff --git a/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_12-19-30.png b/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_12-19-30.png new file mode 100644 index 0000000..5480d0d Binary files /dev/null and b/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_12-19-30.png differ diff --git a/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_12-49-42.png b/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_12-49-42.png new file mode 100644 index 0000000..41ad195 Binary files /dev/null and b/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_12-49-42.png differ diff --git a/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_17-23-18.png b/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_17-23-18.png new file mode 100644 index 0000000..93e1751 Binary files /dev/null and b/jekyll_archive/assets/images/2018/06/PUTTY_2018-06-15_17-23-18.png differ diff --git a/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-34-57.png b/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-34-57.png new file mode 100644 index 0000000..22ba6b3 Binary files /dev/null and b/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-34-57.png differ diff --git a/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-43-31.png b/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-43-31.png new file mode 100644 index 0000000..abd0c28 Binary files /dev/null and b/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-43-31.png differ diff --git a/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-48-32.png b/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-48-32.png new file mode 100644 index 0000000..7bccb88 Binary files /dev/null and b/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-48-32.png differ diff --git a/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-53-35.png b/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-53-35.png new file mode 100644 index 0000000..f9ade97 Binary files /dev/null and b/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_11-53-35.png differ diff --git a/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_17-02-32.png b/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_17-02-32.png new file mode 100644 index 0000000..73f5a1a Binary files /dev/null and b/jekyll_archive/assets/images/2018/06/chrome_2018-06-15_17-02-32.png differ diff --git a/jekyll_archive/assets/images/2018/09/DSC_0469.JPG b/jekyll_archive/assets/images/2018/09/DSC_0469.JPG new file mode 100644 index 0000000..4af7579 Binary files /dev/null and b/jekyll_archive/assets/images/2018/09/DSC_0469.JPG differ diff --git a/jekyll_archive/assets/images/2020/05/2020-05-1919-17-07.png b/jekyll_archive/assets/images/2020/05/2020-05-1919-17-07.png new file mode 100644 index 0000000..e2b53d4 Binary files /dev/null and b/jekyll_archive/assets/images/2020/05/2020-05-1919-17-07.png differ diff --git a/jekyll_archive/assets/images/2020/05/2020-05-1919-17-07_o.png b/jekyll_archive/assets/images/2020/05/2020-05-1919-17-07_o.png new file mode 100644 index 0000000..543ea0a Binary files /dev/null and b/jekyll_archive/assets/images/2020/05/2020-05-1919-17-07_o.png differ diff --git a/jekyll_archive/assets/images/2020/05/2020-05-1919-46-13-1.png b/jekyll_archive/assets/images/2020/05/2020-05-1919-46-13-1.png new file mode 100644 index 0000000..06b9bde Binary files /dev/null and b/jekyll_archive/assets/images/2020/05/2020-05-1919-46-13-1.png differ diff --git a/jekyll_archive/assets/images/2020/05/2020-05-1919-46-13_o-1.png b/jekyll_archive/assets/images/2020/05/2020-05-1919-46-13_o-1.png new file mode 100644 index 0000000..5b85667 Binary files /dev/null and b/jekyll_archive/assets/images/2020/05/2020-05-1919-46-13_o-1.png differ diff --git a/jekyll_archive/assets/images/2020/05/2020-05-1920-34-14.png b/jekyll_archive/assets/images/2020/05/2020-05-1920-34-14.png new file mode 100644 index 0000000..563dd92 Binary files /dev/null and b/jekyll_archive/assets/images/2020/05/2020-05-1920-34-14.png differ diff --git a/jekyll_archive/assets/images/2020/05/2020-05-1920-34-14_o.png b/jekyll_archive/assets/images/2020/05/2020-05-1920-34-14_o.png new file mode 100644 index 0000000..563dd92 Binary files /dev/null and b/jekyll_archive/assets/images/2020/05/2020-05-1920-34-14_o.png differ diff --git a/jekyll_archive/assets/images/2020/05/2020-05-1920-35-14.png b/jekyll_archive/assets/images/2020/05/2020-05-1920-35-14.png new file mode 100644 index 0000000..8e2ee89 Binary files /dev/null and b/jekyll_archive/assets/images/2020/05/2020-05-1920-35-14.png differ diff --git a/jekyll_archive/assets/images/2020/05/2020-05-1920-35-14_o.png b/jekyll_archive/assets/images/2020/05/2020-05-1920-35-14_o.png new file mode 100644 index 0000000..8e2ee89 Binary files /dev/null and b/jekyll_archive/assets/images/2020/05/2020-05-1920-35-14_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/00aec12e25c74fed8e124e788850090e.png b/jekyll_archive/assets/images/2021/03/00aec12e25c74fed8e124e788850090e.png new file mode 100644 index 0000000..1e2f339 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/00aec12e25c74fed8e124e788850090e.png differ diff --git a/jekyll_archive/assets/images/2021/03/00aec12e25c74fed8e124e788850090e_o.png b/jekyll_archive/assets/images/2021/03/00aec12e25c74fed8e124e788850090e_o.png new file mode 100644 index 0000000..1e2f339 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/00aec12e25c74fed8e124e788850090e_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2.png b/jekyll_archive/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2.png new file mode 100644 index 0000000..14c8418 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2.png differ diff --git a/jekyll_archive/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2_o.png b/jekyll_archive/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2_o.png new file mode 100644 index 0000000..dd19765 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/053fbb025cc74ebc880f729d3dc3b6b2_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85.png b/jekyll_archive/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85.png new file mode 100644 index 0000000..2a83de8 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85.png differ diff --git a/jekyll_archive/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85_o.png b/jekyll_archive/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85_o.png new file mode 100644 index 0000000..5542b77 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/2707fa8797d94ed08f1d6c44fc04ef85_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a.png b/jekyll_archive/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a.png new file mode 100644 index 0000000..325a3e7 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a.png differ diff --git a/jekyll_archive/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a_o.png b/jekyll_archive/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a_o.png new file mode 100644 index 0000000..325a3e7 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/4aa44c106c724c16b27129ccc3acfb3a_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1.png b/jekyll_archive/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1.png new file mode 100644 index 0000000..50cee92 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1.png differ diff --git a/jekyll_archive/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1_o.png b/jekyll_archive/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1_o.png new file mode 100644 index 0000000..47b6cca Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/4c718c71ade84cb7a2c9eeb3596e32c1_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565.png b/jekyll_archive/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565.png new file mode 100644 index 0000000..dbfe6fb Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565.png differ diff --git a/jekyll_archive/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565_o.png b/jekyll_archive/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565_o.png new file mode 100644 index 0000000..6c66df2 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/5229542f7a364b07bbed0356ec8f3565_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/64ed999845d644239615c3b0e2aab454.png b/jekyll_archive/assets/images/2021/03/64ed999845d644239615c3b0e2aab454.png new file mode 100644 index 0000000..e216f27 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/64ed999845d644239615c3b0e2aab454.png differ diff --git a/jekyll_archive/assets/images/2021/03/64ed999845d644239615c3b0e2aab454_o.png b/jekyll_archive/assets/images/2021/03/64ed999845d644239615c3b0e2aab454_o.png new file mode 100644 index 0000000..296a0ee Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/64ed999845d644239615c3b0e2aab454_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e.png b/jekyll_archive/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e.png new file mode 100644 index 0000000..ba66990 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e.png differ diff --git a/jekyll_archive/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e_o.png b/jekyll_archive/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e_o.png new file mode 100644 index 0000000..b137146 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/84da158d66534dcc97a7a8bb60cba58e_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d.png b/jekyll_archive/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d.png new file mode 100644 index 0000000..765521a Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d.png differ diff --git a/jekyll_archive/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d_o.png b/jekyll_archive/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d_o.png new file mode 100644 index 0000000..91f7c59 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/8c623ef74cdc41d8a6ba5fd05e30b32d_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d.png b/jekyll_archive/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d.png new file mode 100644 index 0000000..a3680a2 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d.png differ diff --git a/jekyll_archive/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d_o.png b/jekyll_archive/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d_o.png new file mode 100644 index 0000000..2e5897e Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/8f671fb4efa542d08bdf60c1ead2756d_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/ProfilePix.jpg b/jekyll_archive/assets/images/2021/03/ProfilePix.jpg new file mode 100644 index 0000000..27d5c7b Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/ProfilePix.jpg differ diff --git a/jekyll_archive/assets/images/2021/03/ProfilePix_o.jpg b/jekyll_archive/assets/images/2021/03/ProfilePix_o.jpg new file mode 100644 index 0000000..27d5c7b Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/ProfilePix_o.jpg differ diff --git a/jekyll_archive/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67.png b/jekyll_archive/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67.png new file mode 100644 index 0000000..952aa3c Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67.png differ diff --git a/jekyll_archive/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67_o.png b/jekyll_archive/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67_o.png new file mode 100644 index 0000000..65c1be5 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/adfd44c4c0cf4e91aeeb8792970dbf67_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c.png b/jekyll_archive/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c.png new file mode 100644 index 0000000..0526618 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c.png differ diff --git a/jekyll_archive/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c_o.png b/jekyll_archive/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c_o.png new file mode 100644 index 0000000..7b06bf2 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/cc9cdbfe94474be4b87515de72d9f98c_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/d417b24684524a05985e737b656b55a9.png b/jekyll_archive/assets/images/2021/03/d417b24684524a05985e737b656b55a9.png new file mode 100644 index 0000000..22338ce Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/d417b24684524a05985e737b656b55a9.png differ diff --git a/jekyll_archive/assets/images/2021/03/d417b24684524a05985e737b656b55a9_o.png b/jekyll_archive/assets/images/2021/03/d417b24684524a05985e737b656b55a9_o.png new file mode 100644 index 0000000..b13a03c Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/d417b24684524a05985e737b656b55a9_o.png differ diff --git a/jekyll_archive/assets/images/2021/03/tidepool.png b/jekyll_archive/assets/images/2021/03/tidepool.png new file mode 100644 index 0000000..c74b578 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/tidepool.png differ diff --git a/jekyll_archive/assets/images/2021/03/tidepool_o.png b/jekyll_archive/assets/images/2021/03/tidepool_o.png new file mode 100644 index 0000000..6a3bca7 Binary files /dev/null and b/jekyll_archive/assets/images/2021/03/tidepool_o.png differ diff --git a/jekyll_archive/assets/images/2023/01/1.png b/jekyll_archive/assets/images/2023/01/1.png new file mode 100644 index 0000000..a2bf0bd Binary files /dev/null and b/jekyll_archive/assets/images/2023/01/1.png differ diff --git a/jekyll_archive/assets/images/2023/01/2.png b/jekyll_archive/assets/images/2023/01/2.png new file mode 100644 index 0000000..98fd530 Binary files /dev/null and b/jekyll_archive/assets/images/2023/01/2.png differ diff --git a/jekyll_archive/assets/images/2023/01/3.png b/jekyll_archive/assets/images/2023/01/3.png new file mode 100644 index 0000000..4a42de5 Binary files /dev/null and b/jekyll_archive/assets/images/2023/01/3.png differ diff --git a/jekyll_archive/assets/images/2023/01/4.png b/jekyll_archive/assets/images/2023/01/4.png new file mode 100644 index 0000000..34a8c72 Binary files /dev/null and b/jekyll_archive/assets/images/2023/01/4.png differ diff --git a/jekyll_archive/assets/images/2023/01/5.png b/jekyll_archive/assets/images/2023/01/5.png new file mode 100644 index 0000000..0d2bf7b Binary files /dev/null and b/jekyll_archive/assets/images/2023/01/5.png differ diff --git a/jekyll_archive/assets/images/2023/01/6.png b/jekyll_archive/assets/images/2023/01/6.png new file mode 100644 index 0000000..63003f7 Binary files /dev/null and b/jekyll_archive/assets/images/2023/01/6.png differ diff --git a/jekyll_archive/assets/images/2023/01/7.png b/jekyll_archive/assets/images/2023/01/7.png new file mode 100644 index 0000000..41ddf80 Binary files /dev/null and b/jekyll_archive/assets/images/2023/01/7.png differ diff --git a/jekyll_archive/assets/images/profile_pix/profile_1.jpg b/jekyll_archive/assets/images/profile_pix/profile_1.jpg new file mode 100644 index 0000000..e84077b Binary files /dev/null and b/jekyll_archive/assets/images/profile_pix/profile_1.jpg differ diff --git a/assets/js/_main.js b/jekyll_archive/assets/js/_main.js similarity index 100% rename from assets/js/_main.js rename to jekyll_archive/assets/js/_main.js diff --git a/assets/js/clipboardrouge.js b/jekyll_archive/assets/js/clipboardrouge.js similarity index 100% rename from assets/js/clipboardrouge.js rename to jekyll_archive/assets/js/clipboardrouge.js diff --git a/assets/js/lunr/lunr-en.js b/jekyll_archive/assets/js/lunr/lunr-en.js similarity index 100% rename from assets/js/lunr/lunr-en.js rename to jekyll_archive/assets/js/lunr/lunr-en.js diff --git a/assets/js/lunr/lunr-gr.js b/jekyll_archive/assets/js/lunr/lunr-gr.js similarity index 100% rename from assets/js/lunr/lunr-gr.js rename to jekyll_archive/assets/js/lunr/lunr-gr.js diff --git a/assets/js/lunr/lunr-store.js b/jekyll_archive/assets/js/lunr/lunr-store.js similarity index 100% rename from assets/js/lunr/lunr-store.js rename to jekyll_archive/assets/js/lunr/lunr-store.js diff --git a/assets/js/lunr/lunr.js b/jekyll_archive/assets/js/lunr/lunr.js similarity index 100% rename from assets/js/lunr/lunr.js rename to jekyll_archive/assets/js/lunr/lunr.js diff --git a/assets/js/lunr/lunr.min.js b/jekyll_archive/assets/js/lunr/lunr.min.js similarity index 100% rename from assets/js/lunr/lunr.min.js rename to jekyll_archive/assets/js/lunr/lunr.min.js diff --git a/assets/js/main.min.js b/jekyll_archive/assets/js/main.min.js similarity index 100% rename from assets/js/main.min.js rename to jekyll_archive/assets/js/main.min.js diff --git a/assets/js/plugins/gumshoe.js b/jekyll_archive/assets/js/plugins/gumshoe.js similarity index 100% rename from assets/js/plugins/gumshoe.js rename to jekyll_archive/assets/js/plugins/gumshoe.js diff --git a/assets/js/plugins/jquery.ba-throttle-debounce.js b/jekyll_archive/assets/js/plugins/jquery.ba-throttle-debounce.js similarity index 100% rename from assets/js/plugins/jquery.ba-throttle-debounce.js rename to jekyll_archive/assets/js/plugins/jquery.ba-throttle-debounce.js diff --git a/assets/js/plugins/jquery.fitvids.js b/jekyll_archive/assets/js/plugins/jquery.fitvids.js similarity index 100% rename from assets/js/plugins/jquery.fitvids.js rename to jekyll_archive/assets/js/plugins/jquery.fitvids.js diff --git a/assets/js/plugins/jquery.greedy-navigation.js b/jekyll_archive/assets/js/plugins/jquery.greedy-navigation.js similarity index 100% rename from assets/js/plugins/jquery.greedy-navigation.js rename to jekyll_archive/assets/js/plugins/jquery.greedy-navigation.js diff --git a/assets/js/plugins/jquery.magnific-popup.js b/jekyll_archive/assets/js/plugins/jquery.magnific-popup.js similarity index 100% rename from assets/js/plugins/jquery.magnific-popup.js rename to jekyll_archive/assets/js/plugins/jquery.magnific-popup.js diff --git a/assets/js/plugins/smooth-scroll.js b/jekyll_archive/assets/js/plugins/smooth-scroll.js similarity index 100% rename from assets/js/plugins/smooth-scroll.js rename to jekyll_archive/assets/js/plugins/smooth-scroll.js diff --git a/assets/js/scroll-to-top.js b/jekyll_archive/assets/js/scroll-to-top.js similarity index 100% rename from assets/js/scroll-to-top.js rename to jekyll_archive/assets/js/scroll-to-top.js diff --git a/assets/js/vendor/jquery/jquery-3.5.1.js b/jekyll_archive/assets/js/vendor/jquery/jquery-3.5.1.js similarity index 100% rename from assets/js/vendor/jquery/jquery-3.5.1.js rename to jekyll_archive/assets/js/vendor/jquery/jquery-3.5.1.js diff --git a/banner.js b/jekyll_archive/banner.js similarity index 100% rename from banner.js rename to jekyll_archive/banner.js diff --git a/index.html b/jekyll_archive/index.html similarity index 100% rename from index.html rename to jekyll_archive/index.html diff --git a/jekyll_archive/jekyll_archive.txt b/jekyll_archive/jekyll_archive.txt new file mode 100644 index 0000000..9b759f4 --- /dev/null +++ b/jekyll_archive/jekyll_archive.txt @@ -0,0 +1 @@ +This directory will store the older jekyll project. diff --git a/package.json b/jekyll_archive/package.json similarity index 100% rename from package.json rename to jekyll_archive/package.json diff --git a/staticman.yml b/jekyll_archive/staticman.yml similarity index 100% rename from staticman.yml rename to jekyll_archive/staticman.yml diff --git a/.github/workflows/build-jekyll.yml b/jekyll_archive/workflows/build-jekyll.yml similarity index 100% rename from .github/workflows/build-jekyll.yml rename to jekyll_archive/workflows/build-jekyll.yml diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..2c27f6c --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,99 @@ +site_name: Make Gadgets Work +site_description: I give what I take and then I try giving a bit more - My payback to the helpful open source community !!! +repo_url: !ENV [REPO_URL, 'https://github.com/pubmania/pubmania.github.io'] +edit_uri: !ENV [EDIT_URL,'edit/main/docs/'] +site_url: !ENV [SITE_URL,'https://mgw.dumatics.com'] +use_directory_urls: False +theme: + name: material + + custom_dir: overrides + + features: + - content.code.annotate + - content.code.copy + - content.tabs.link + - content.tooltips + - content.action.edit + - content.action.view + - navigation.indexes + - navigation.tabs + - navigation.top + - navigation.tracking + - search.highlight + - search.share + - search.suggest + + palette: + # Palette toggle for light mode + - scheme: default + primary: orange + accent: deep orange + toggle: + icon: material/brightness-7 + name: Switch to dark mode + + # Palette toggle for dark mode + - scheme: slate + primary: orange + accent: deep orange + toggle: + icon: material/brightness-4 + name: Switch to light mode + +markdown_extensions: + - abbr + - admonition + - attr_list + - footnotes + - md_in_html + - meta + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.details + - pymdownx.caret + - pymdownx.mark + - pymdownx.tilde + - pymdownx.snippets: + base_path: '.' + check_paths: false + auto_append: ["includes/abbreviations.md"] + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.tasklist: + custom_checkbox: true + clickable_checkbox: true + - pymdownx.keys + - pymdownx.blocks.caption + - toc: + permalink: true + - plantuml_markdown: + server: http://www.plantuml.com/plantuml # PlantUML server, for remote rendering + format: svg_inline # default diagram image format + + # Plugin information +plugins: + - search + - awesome-pages + - include-markdown + - blog: + enabled: true + blog_dir: . + blog_toc: false + pagination_if_single_page: true + - glightbox + - social: + cards_dir: assets/images/social + +extra_css: + - assets/stylesheets/extra.css + +extra: + disqus: !ENV [DISQUS_CODE,''] \ No newline at end of file diff --git a/overrides/blog.html b/overrides/blog.html new file mode 100644 index 0000000..3bc7b9c --- /dev/null +++ b/overrides/blog.html @@ -0,0 +1,31 @@ +{% extends "main.html" %} + +{% block container %} +
+
+ + +
+ {{ page.content }} +
+ + {% if pagination %} + {% block top_pagination %} + {% include "partials/pagination.html" %} + {% endblock %} + {% endif %} + + + {% for post in posts %} + {% include "partials/post.html" %} + {% endfor %} + + + {% if pagination %} + {% block bottom_pagination %} + {% include "partials/pagination.html" %} + {% endblock %} + {% endif %} +
+
+{% endblock %} \ No newline at end of file diff --git a/overrides/main1.html b/overrides/main1.html new file mode 100644 index 0000000..4cc5421 --- /dev/null +++ b/overrides/main1.html @@ -0,0 +1,23 @@ +{# page info #} +{% set page_title = '' %} +{% if page and page.meta and page.meta.title %} + {% set page_title = page.meta.title %} +{% elif page and page.title and not page.is_homepage %} + {% set page_title = page.title %} +{% endif %} + +{% if page and page.meta and page.meta.tags %} + {% set page_tags = page.meta.tags %} +{% endif %} + +{% extends "base.html" %} + +{# title #} +{% block htmltitle %} + {{ page_title }} - {{ config.site_name }} +{% endblock %} + +{# navigation #} +{% block site_nav %} + {% include "partials/navigation.html" %} +{% endblock %} \ No newline at end of file diff --git a/overrides/partials/header.html b/overrides/partials/header.html new file mode 100644 index 0000000..0152cd8 --- /dev/null +++ b/overrides/partials/header.html @@ -0,0 +1,115 @@ +{% set class = "md-header" %} +{% if "navigation.tabs.sticky" in features %} + {% set class = class ~ " md-header--lifted" %} +{% endif %} +
+ + {% if "navigation.tabs.sticky" in features %} + {% if "navigation.tabs" in features %} + {% include "partials/tabs.html" %} + {% endif %} + {% endif %} +
diff --git a/overrides/partials/navigation.html b/overrides/partials/navigation.html new file mode 100644 index 0000000..e69de29 diff --git a/overrides/partials/post1.html b/overrides/partials/post1.html new file mode 100644 index 0000000..2084557 --- /dev/null +++ b/overrides/partials/post1.html @@ -0,0 +1,87 @@ + + +
+ +
+ {% if post.meta.description %} + {% if post.meta.title %} + {% set title = post.meta.title %} + {% else %} + {% set test_url = post.canonical_url %} + {% set filename = test_url.split('/')[-1] %} + {% set title = filename.split('.')[0] %} + {% endif %} + {% else %} + {{ post.content | truncate(400) }} + + {{ lang.t("blog.continue") }} + + {% endif %} +

{{ title }}

+

{{ post.meta.description }}

+ + {{ lang.t("blog.continue") }} + +
+
+ + {% if post.authors %} + + {% endif %} + + + +
+
\ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..683c31b Binary files /dev/null and b/requirements.txt differ