[{"data":1,"prerenderedAt":1555},["ShallowReactive",2],{"article-googletakeout-extract-script":3},{"article":4,"tags":572,"previous":587,"next":1168},{"id":5,"title":6,"author":7,"body":8,"createdAt":561,"description":562,"extension":563,"img":564,"meta":565,"navigation":92,"path":566,"seo":567,"stem":568,"tags":569,"updatedAt":561,"__hash__":571},"articles\u002Farticles\u002Fgoogletakeout-extract-script.md","Extracting Specific Files from Zip Archives with a Python Script",null,{"type":9,"value":10,"toc":553},"minimark",[11,15,19,22,28,31,33,37,57,61,64,387,391,468,472,487,516,523,539,542,546,549],[12,13,6],"h3",{"id":14},"extracting-specific-files-from-zip-archives-with-a-python-script",[16,17,18],"p",{},"When managing large amounts of data, especially backups from services like Google Photos, you may find yourself dealing with numerous zip files. Manually extracting specific files from these archives can be tedious. Fortunately, Python offers a powerful way to automate this process.",[16,20,21],{},"In this blog post, I'll show you how to create a Python script that extracts files from zip archives to a specific path on your hard drive. You can specify a particular path within each zip file to extract files from, making it ideal for organizing photos or other data from Google backups.  The script below will iterate over each zip file within\nthe directory and perform the same extraction from within each zip to another target directory.  In our particular case we had 17 - 10 gb zip files and we need to iterate over each to extract the photos.",[23,24],"img",{"style":25,"src":26,"alt":27,"title":27},"display: inline;","\u002Farticles\u002Fimages\u002Fpythonscript.jpg","image",[29,30],"br",{},[29,32],{},[12,34,36],{"id":35},"prerequisites","Prerequisites",[16,38,39,40,47,48,52,53,56],{},"Before we dive into the script, ensure you have Python installed on your machine. You can download it from ",[41,42,46],"a",{"href":43,"rel":44},"https:\u002F\u002Fwww.python.org\u002F",[45],"nofollow","python.org",". You'll also need the ",[49,50,51],"code",{},"zipfile"," and ",[49,54,55],{},"os"," modules, which are part of Python's standard library, so no additional installations are required.",[12,58,60],{"id":59},"the-script","The Script",[16,62,63],{},"Here's the Python script to extract files from zip archives:",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-python shiki shiki-themes github-light github-dark","import os\nimport zipfile\n\ndef extract_specific_path_from_zip(source_dir, dest_dir, specific_path):\n    # Ensure destination directory exists\n    if not os.path.exists(dest_dir):\n        os.makedirs(dest_dir)\n    \n    # Loop through all files in the source directory\n    for item in os.listdir(source_dir):\n        # Construct full file path\n        file_path = os.path.join(source_dir, item)\n        \n        # Check if the file is a ZIP file\n        if zipfile.is_zipfile(file_path):\n            # Open the ZIP file\n            with zipfile.ZipFile(file_path, 'r') as zip_ref:\n                # Get the list of all archived file names from the zip\n                zip_file_names = zip_ref.namelist()\n                \n                # Filter the files that match the specific path\n                files_to_extract = [f for f in zip_file_names if f.startswith(specific_path)]\n                \n                # Extract the filtered files preserving the directory structure below the specific path\n                for file in files_to_extract:\n                    try:\n                        # Determine the relative path within the specific path\n                        relative_path = os.path.relpath(file, specific_path)\n                        \n                        # Determine the output file path\n                        output_file_path = os.path.join(dest_dir, relative_path)\n                        \n                        # Normalize the output file path to handle any issues with invalid characters or spaces\n                        output_file_path = os.path.normpath(output_file_path)\n                        \n                        # Ensure the directory exists\n                        os.makedirs(os.path.dirname(output_file_path), exist_ok=True)\n                        \n                        # Extract the file data and write to the destination directory\n                        with zip_ref.open(file) as source_file:\n                            with open(output_file_path, 'wb') as output_file:\n                                output_file.write(source_file.read())\n                        \n                        print(f\"Extracted: {file} from {file_path} to {output_file_path}\")\n                    except Exception as e:\n                        print(f\"Failed to extract {file} from {file_path}. Error: {e}\")\n\nif __name__ == \"__main__\":\n    source_directory = \"C:\u002FTemp\u002FMay23_BrittmarieGoogleBackup\"  # Replace with the path to the source directory\n    destination_directory = \"G:\u002FHome_PC\u002FPictures\u002F2023-06-23\"  # Replace with the path to the destination directory\n    specific_path_in_zip = \"Takeout\u002FGoogle Photos\"  # Replace with the specific path to extract from each ZIP file\n\n    extract_specific_path_from_zip(source_directory, destination_directory, specific_path_in_zip)\n","python","",[49,72,73,81,87,94,100,106,112,118,124,130,136,142,148,154,160,166,172,178,184,190,196,202,208,213,219,225,231,237,243,249,255,261,266,272,278,283,289,295,300,306,312,318,324,329,335,341,347,352,358,364,370,376,381],{"__ignoreMap":70},[74,75,78],"span",{"class":76,"line":77},"line",1,[74,79,80],{},"import os\n",[74,82,84],{"class":76,"line":83},2,[74,85,86],{},"import zipfile\n",[74,88,90],{"class":76,"line":89},3,[74,91,93],{"emptyLinePlaceholder":92},true,"\n",[74,95,97],{"class":76,"line":96},4,[74,98,99],{},"def extract_specific_path_from_zip(source_dir, dest_dir, specific_path):\n",[74,101,103],{"class":76,"line":102},5,[74,104,105],{},"    # Ensure destination directory exists\n",[74,107,109],{"class":76,"line":108},6,[74,110,111],{},"    if not os.path.exists(dest_dir):\n",[74,113,115],{"class":76,"line":114},7,[74,116,117],{},"        os.makedirs(dest_dir)\n",[74,119,121],{"class":76,"line":120},8,[74,122,123],{},"    \n",[74,125,127],{"class":76,"line":126},9,[74,128,129],{},"    # Loop through all files in the source directory\n",[74,131,133],{"class":76,"line":132},10,[74,134,135],{},"    for item in os.listdir(source_dir):\n",[74,137,139],{"class":76,"line":138},11,[74,140,141],{},"        # Construct full file path\n",[74,143,145],{"class":76,"line":144},12,[74,146,147],{},"        file_path = os.path.join(source_dir, item)\n",[74,149,151],{"class":76,"line":150},13,[74,152,153],{},"        \n",[74,155,157],{"class":76,"line":156},14,[74,158,159],{},"        # Check if the file is a ZIP file\n",[74,161,163],{"class":76,"line":162},15,[74,164,165],{},"        if zipfile.is_zipfile(file_path):\n",[74,167,169],{"class":76,"line":168},16,[74,170,171],{},"            # Open the ZIP file\n",[74,173,175],{"class":76,"line":174},17,[74,176,177],{},"            with zipfile.ZipFile(file_path, 'r') as zip_ref:\n",[74,179,181],{"class":76,"line":180},18,[74,182,183],{},"                # Get the list of all archived file names from the zip\n",[74,185,187],{"class":76,"line":186},19,[74,188,189],{},"                zip_file_names = zip_ref.namelist()\n",[74,191,193],{"class":76,"line":192},20,[74,194,195],{},"                \n",[74,197,199],{"class":76,"line":198},21,[74,200,201],{},"                # Filter the files that match the specific path\n",[74,203,205],{"class":76,"line":204},22,[74,206,207],{},"                files_to_extract = [f for f in zip_file_names if f.startswith(specific_path)]\n",[74,209,211],{"class":76,"line":210},23,[74,212,195],{},[74,214,216],{"class":76,"line":215},24,[74,217,218],{},"                # Extract the filtered files preserving the directory structure below the specific path\n",[74,220,222],{"class":76,"line":221},25,[74,223,224],{},"                for file in files_to_extract:\n",[74,226,228],{"class":76,"line":227},26,[74,229,230],{},"                    try:\n",[74,232,234],{"class":76,"line":233},27,[74,235,236],{},"                        # Determine the relative path within the specific path\n",[74,238,240],{"class":76,"line":239},28,[74,241,242],{},"                        relative_path = os.path.relpath(file, specific_path)\n",[74,244,246],{"class":76,"line":245},29,[74,247,248],{},"                        \n",[74,250,252],{"class":76,"line":251},30,[74,253,254],{},"                        # Determine the output file path\n",[74,256,258],{"class":76,"line":257},31,[74,259,260],{},"                        output_file_path = os.path.join(dest_dir, relative_path)\n",[74,262,264],{"class":76,"line":263},32,[74,265,248],{},[74,267,269],{"class":76,"line":268},33,[74,270,271],{},"                        # Normalize the output file path to handle any issues with invalid characters or spaces\n",[74,273,275],{"class":76,"line":274},34,[74,276,277],{},"                        output_file_path = os.path.normpath(output_file_path)\n",[74,279,281],{"class":76,"line":280},35,[74,282,248],{},[74,284,286],{"class":76,"line":285},36,[74,287,288],{},"                        # Ensure the directory exists\n",[74,290,292],{"class":76,"line":291},37,[74,293,294],{},"                        os.makedirs(os.path.dirname(output_file_path), exist_ok=True)\n",[74,296,298],{"class":76,"line":297},38,[74,299,248],{},[74,301,303],{"class":76,"line":302},39,[74,304,305],{},"                        # Extract the file data and write to the destination directory\n",[74,307,309],{"class":76,"line":308},40,[74,310,311],{},"                        with zip_ref.open(file) as source_file:\n",[74,313,315],{"class":76,"line":314},41,[74,316,317],{},"                            with open(output_file_path, 'wb') as output_file:\n",[74,319,321],{"class":76,"line":320},42,[74,322,323],{},"                                output_file.write(source_file.read())\n",[74,325,327],{"class":76,"line":326},43,[74,328,248],{},[74,330,332],{"class":76,"line":331},44,[74,333,334],{},"                        print(f\"Extracted: {file} from {file_path} to {output_file_path}\")\n",[74,336,338],{"class":76,"line":337},45,[74,339,340],{},"                    except Exception as e:\n",[74,342,344],{"class":76,"line":343},46,[74,345,346],{},"                        print(f\"Failed to extract {file} from {file_path}. Error: {e}\")\n",[74,348,350],{"class":76,"line":349},47,[74,351,93],{"emptyLinePlaceholder":92},[74,353,355],{"class":76,"line":354},48,[74,356,357],{},"if __name__ == \"__main__\":\n",[74,359,361],{"class":76,"line":360},49,[74,362,363],{},"    source_directory = \"C:\u002FTemp\u002FMay23_BrittmarieGoogleBackup\"  # Replace with the path to the source directory\n",[74,365,367],{"class":76,"line":366},50,[74,368,369],{},"    destination_directory = \"G:\u002FHome_PC\u002FPictures\u002F2023-06-23\"  # Replace with the path to the destination directory\n",[74,371,373],{"class":76,"line":372},51,[74,374,375],{},"    specific_path_in_zip = \"Takeout\u002FGoogle Photos\"  # Replace with the specific path to extract from each ZIP file\n",[74,377,379],{"class":76,"line":378},52,[74,380,93],{"emptyLinePlaceholder":92},[74,382,384],{"class":76,"line":383},53,[74,385,386],{},"    extract_specific_path_from_zip(source_directory, destination_directory, specific_path_in_zip)\n",[12,388,390],{"id":389},"how-it-works","How It Works",[392,393,394,407,438,444,450,456,462],"ol",{},[395,396,397,401,402,52,404,406],"li",{},[398,399,400],"strong",{},"Import Modules",": The script begins by importing the ",[49,403,51],{},[49,405,55],{}," modules.",[395,408,409,412,413,416,417],{},[398,410,411],{},"Function Definition",": The ",[49,414,415],{},"extract_specific_path_from_zip"," function takes three parameters:\n",[418,419,420,426,432],"ul",{},[395,421,422,425],{},[49,423,424],{},"source_dir",": The directory containing the zip files you want to extract files from.",[395,427,428,431],{},[49,429,430],{},"dest_dir",": The directory where you want the extracted files to be saved.",[395,433,434,437],{},[49,435,436],{},"specific_path",": The specific path within each zip file from which you want to extract files.",[395,439,440,443],{},[398,441,442],{},"Ensure Destination Directory Exists",": The script checks if the destination directory exists and creates it if necessary.",[395,445,446,449],{},[398,447,448],{},"Loop Through Source Directory",": It loops through all files in the source directory, checking each one to see if it's a zip file.",[395,451,452,455],{},[398,453,454],{},"Open Zip File",": For each zip file, the script opens it and lists all the files within the zip archive.",[395,457,458,461],{},[398,459,460],{},"Filter Files",": The script filters the files based on the specified path within the zip file.",[395,463,464,467],{},[398,465,466],{},"Extract Files",": For each filtered file, the script constructs the target file path, creates necessary directories, and writes the file to the target path, handling any issues with invalid characters or spaces.",[12,469,471],{"id":470},"usage","Usage",[16,473,474,475,478,479,482,483,486],{},"To use this script, replace the placeholder values for ",[49,476,477],{},"source_directory",", ",[49,480,481],{},"destination_directory",", and ",[49,484,485],{},"specific_path_in_zip"," with your specific paths. For example, if you want to extract all photos from a Google Photos backup, you might have:",[65,488,490],{"className":67,"code":489,"language":69,"meta":70,"style":70},"if __name__ == \"__main__\":\n    source_directory = \"C:\u002FTemp\u002FMay23_BrittmarieGoogleBackup\"  # Replace with the path to the source directory\n    destination_directory = \"G:\u002FHome_PC\u002FPictures\u002F2023-06-23\"  # Replace with the path to the destination directory\n    specific_path_in_zip = \"Takeout\u002FGoogle Photos\"  # Replace with the specific path to extract from each ZIP file\n\n    extract_specific_path_from_zip(source_directory, destination_directory, specific_path_in_zip)\n",[49,491,492,496,500,504,508,512],{"__ignoreMap":70},[74,493,494],{"class":76,"line":77},[74,495,357],{},[74,497,498],{"class":76,"line":83},[74,499,363],{},[74,501,502],{"class":76,"line":89},[74,503,369],{},[74,505,506],{"class":76,"line":96},[74,507,375],{},[74,509,510],{"class":76,"line":102},[74,511,93],{"emptyLinePlaceholder":92},[74,513,514],{"class":76,"line":108},[74,515,386],{},[16,517,518,519,522],{},"Save the script as ",[49,520,521],{},"extract_photos.py"," and run it using:",[65,524,528],{"className":525,"code":526,"language":527,"meta":70,"style":70},"language-bash shiki shiki-themes github-light github-dark","python extract_photos.py\n","bash",[49,529,530],{"__ignoreMap":70},[74,531,532,535],{"class":76,"line":77},[74,533,69],{"class":534},"sScJk",[74,536,538],{"class":537},"sZZnC"," extract_photos.py\n",[16,540,541],{},"This script will extract all files from the specified path within each zip archive and save them to your target directory, maintaining the directory structure.",[12,543,545],{"id":544},"conclusion","Conclusion",[16,547,548],{},"This updated Python script is a handy tool for automating the extraction of specific files from zip archives. Whether you're organizing photos from Google or managing backups, this script can save you time and effort. Happy coding!",[550,551,552],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":70,"searchDepth":83,"depth":83,"links":554},[555,556,557,558,559,560],{"id":14,"depth":89,"text":6},{"id":35,"depth":89,"text":36},{"id":59,"depth":89,"text":60},{"id":389,"depth":89,"text":390},{"id":470,"depth":89,"text":471},{"id":544,"depth":89,"text":545},"2024-06-23T15:44:03.462Z","In this blog post, I'll show you how to create a Python script that extracts files from zip archives to a specific path on your hard drive.  Google Takeout will allow users to extract all of their Google Photos to any number of large zip files.  After downloading, you are still required to extract to your own file system.  This script can help that by iterating over each zip and perform the extraction.","md","\u002Farticles\u002Fimages\u002Fpythonscript2.jpg",{},"\u002Farticles\u002Fgoogletakeout-extract-script",{"title":6,"description":562},"articles\u002Fgoogletakeout-extract-script",[570],"tools","X2MHVj0WJ__COABevlzA2jaK7l4Y6ysibzyoJIiF5iU",[573],{"id":574,"title":575,"body":576,"description":580,"extension":563,"img":581,"meta":582,"name":570,"navigation":92,"path":583,"seo":584,"stem":585,"__hash__":586},"tags\u002Ftags\u002Ftools.md","Tools",{"type":9,"value":577,"toc":578},[],{"title":70,"searchDepth":83,"depth":83,"links":579},[],"Any sort of tip, script or function to make your job easier","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1598313183973-4effcded8d5e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=675&q=80",{},"\u002Ftags\u002Ftools",{"description":580},"tags\u002Ftools","o44aMhD358lxjNB-QBcxIrP7aURCo_L0OIiw3TTU3PY",{"id":588,"title":589,"author":590,"body":591,"createdAt":1157,"description":1158,"extension":563,"img":1159,"meta":1160,"navigation":92,"path":1161,"seo":1162,"stem":1163,"tags":1164,"updatedAt":1157,"__hash__":1167},"articles\u002Farticles\u002F2024_10_architecturalpatterns.md","Enterprise Architecture Frameworks","[object Object]",{"type":9,"value":592,"toc":1146},[593,596,600,603,607,610,613,669,672,703,710,713,716,762,765,768,814,817,820,825,827,829,843,847,850,855,860,863,866,869,882,886,889,892,895,898,901,904,907,912,925,929,932,936,939,969,971,975,978,1138,1140,1142,1144],[12,594,589],{"id":595},"enterprise-architecture-frameworks",[12,597,599],{"id":598},"overview","Overview",[16,601,602],{},"Let's explore four common enterprise architecture frameworks: TOGAF, Zachman Framework, MODAF, and SAFe. Each framework has its distinct use cases, structure, and target audience, making them suitable for different types of projects and organizational needs.",[12,604,606],{"id":605},"_1-togaf-the-open-group-architecture-framework","1. TOGAF (The Open Group Architecture Framework)",[16,608,609],{},"TOGAF is an enterprise architecture framework that provides a detailed approach for designing, planning, implementing, and governing enterprise information architecture. It helps organizations align their IT goals with their overall business objectives. TOGAF consists of a structured method called the Architecture Development Method (ADM), which is used to create an enterprise-wide architecture.",[16,611,612],{},"TOGAF works through a well-defined process called the Architecture Development Method (ADM), which is iterative and consists of several phases. These phases include:",[392,614,615,621,627,633,639,645,651,657,663],{},[395,616,617,620],{},[398,618,619],{},"Preliminary Phase",": Establish the architecture framework and define the principles to guide the architecture work.",[395,622,623,626],{},[398,624,625],{},"Architecture Vision",": Develop a high-level view of the intended architecture to align stakeholders and ensure buy-in.",[395,628,629,632],{},[398,630,631],{},"Business Architecture",": Define the business strategy, governance, organization, and key business processes.",[395,634,635,638],{},[398,636,637],{},"Information Systems Architectures",": Develop both the Data Architecture and the Application Architecture to support the business processes.",[395,640,641,644],{},[398,642,643],{},"Technology Architecture",": Define the technology infrastructure needed to support the proposed architecture.",[395,646,647,650],{},[398,648,649],{},"Opportunities and Solutions",": Identify potential solutions and transition plans to achieve the target architecture.",[395,652,653,656],{},[398,654,655],{},"Migration Planning",": Create a detailed roadmap that shows how to move from the current state to the target architecture.",[395,658,659,662],{},[398,660,661],{},"Implementation Governance",": Oversee the implementation to ensure alignment with the architectural vision.",[395,664,665,668],{},[398,666,667],{},"Architecture Change Management",": Establish procedures for managing changes to the architecture as business needs evolve.",[16,670,671],{},"Each of these phases helps organizations systematically create, maintain, and govern their enterprise architecture, ensuring it supports both current and future business needs.",[16,673,674,682,684,686,688,690,691,696,697,699,701],{},[41,675,678],{"href":676,"target":677},"\u002Farticles\u002Fimages\u002Fenterprise_arch1.png","_blank",[23,679],{"style":25,"title":27,"src":676,"alt":27,"width":680,"height":681},531,729,[29,683],{},[29,685],{},[29,687],{},[29,689],{},"\nFor more information, visit ",[41,692,695],{"href":693,"rel":694},"https:\u002F\u002Fwww.opengroup.org\u002Ftogaf",[45],"The Open Group",".\n",[29,698],{},[29,700],{},[29,702],{},[12,704,706,707],{"id":705},"_2-zachman-framework","2. ",[398,708,709],{},"Zachman Framework",[16,711,712],{},"The Zachman Framework is a structured approach for organizing and understanding an enterprise’s architecture through a matrix of viewpoints. It categorizes the different artifacts of an enterprise architecture into rows and columns to ensure that all critical perspectives (such as business, system, and technology) are captured. The framework is often used as a taxonomy for managing enterprise architecture.",[16,714,715],{},"The Zachman Framework is structured as a matrix with six columns and six rows, representing different aspects of an enterprise from multiple perspectives:",[418,717,718],{},[395,719,720,723,724],{},[398,721,722],{},"Columns",": The different interrogatives represented are:\n",[418,725,726,732,738,744,750,756],{},[395,727,728,731],{},[398,729,730],{},"What"," (data)",[395,733,734,737],{},[398,735,736],{},"How"," (function)",[395,739,740,743],{},[398,741,742],{},"Where"," (network)",[395,745,746,749],{},[398,747,748],{},"Who"," (people)",[395,751,752,755],{},[398,753,754],{},"When"," (time)",[395,757,758,761],{},[398,759,760],{},"Why"," (motivation)",[16,763,764],{},"These columns help define the different aspects of the enterprise that need to be captured.",[16,766,767],{},"The rows represent different stakeholder perspectives:",[418,769,770],{},[395,771,772,775,776],{},[398,773,774],{},"Rows",": The different stakeholder perspectives represented are:\n",[418,777,778,784,790,796,802,808],{},[395,779,780,783],{},[398,781,782],{},"Scope"," (Planner)",[395,785,786,789],{},[398,787,788],{},"Enterprise Model"," (Owner)",[395,791,792,795],{},[398,793,794],{},"System Model"," (Designer)",[395,797,798,801],{},[398,799,800],{},"Technology Model"," (Builder)",[395,803,804,807],{},[398,805,806],{},"Detailed Representations"," (Subcontractor)",[395,809,810,813],{},[398,811,812],{},"Functioning Enterprise"," (User)",[16,815,816],{},"Each row provides a view that is essential for a comprehensive understanding of the architecture, ranging from a high-level business overview to detailed implementation details.",[16,818,819],{},"By using this combination of columns and rows, the Zachman Framework ensures that all critical elements of an enterprise are covered, from strategic goals to technical implementation. This structured approach facilitates better communication between stakeholders and helps ensure that every aspect of the enterprise is aligned with business goals.",[23,821],{"style":25,"title":27,"src":822,"alt":27,"width":823,"height":824},"\u002Farticles\u002Fimages\u002Fenterprise_arch2.png",794,513,[29,826],{},[29,828],{},[16,830,831,832,696,837,839,841],{},"For more information, visit ",[41,833,836],{"href":834,"rel":835},"https:\u002F\u002Fwww.zachman.com\u002F",[45],"Zachman International",[29,838],{},[29,840],{},[29,842],{},[12,844,846],{"id":845},"_3-modaf-ministry-of-defence-architecture-framework","3. MODAF (Ministry of Defence Architecture Framework)",[16,848,849],{},"MODAF is an enterprise architecture framework used by the UK Ministry of Defence to model, document, and understand complex defense systems and processes. It provides a way to visualize the relationships between systems, capabilities, and organizational processes. MODAF focuses on ensuring that all stakeholders, particularly in the defense domain, have a clear view of the systems and their interactions.",[23,851],{"style":25,"title":27,"src":852,"alt":27,"width":853,"height":854},"\u002Farticles\u002Fimages\u002Fenterprise_arch3.png",959,717,[856,857,859],"h4",{"id":858},"comparison-with-togaf-and-zachman","Comparison with TOGAF and Zachman",[16,861,862],{},"MODAF, TOGAF, and the Zachman Framework each provide distinct approaches to enterprise architecture. MODAF is specifically tailored for defense systems, focusing on capabilities, systems, and the relationships between them. It is particularly suited for military and government use, where high levels of detail, security, and interoperability are crucial.",[16,864,865],{},"In contrast, TOGAF is more generic and applicable across different industries. It focuses on aligning IT with business strategy using a structured methodology known as the Architecture Development Method (ADM). TOGAF is iterative and modular, which makes it adaptable for a wide range of enterprises beyond the defense sector.",[16,867,868],{},"The Zachman Framework, on the other hand, offers a comprehensive taxonomy by organizing enterprise artifacts into a matrix of rows and columns. It ensures that all critical elements are covered from multiple stakeholder perspectives. Unlike MODAF, which is domain-specific, Zachman is not prescriptive about implementation and is suitable for capturing enterprise complexity in a highly detailed manner, but without providing specific methodologies for execution.",[16,870,831,871,696,876,878,880],{},[41,872,875],{"href":873,"rel":874},"https:\u002F\u002Fwww.gov.uk\u002Fguidance\u002Fmod-architecture-framework",[45],"UK Ministry of Defence",[29,877],{},[29,879],{},[29,881],{},[12,883,885],{"id":884},"_4-safe-scaled-agile-framework","4. SAFe (Scaled Agile Framework)",[16,887,888],{},"SAFe is a framework designed to help organizations scale agile practices across large enterprises and multiple teams. It integrates lean and agile principles to provide guidance on roles, responsibilities, and best practices for managing large-scale projects. SAFe emphasizes the alignment of teams toward a shared goal, effective collaboration, and regular delivery of value. It also provides a set of tools and techniques that help organizations manage complex product development while ensuring a consistent and high-quality output.",[16,890,891],{},"Benefits of SAFe",[16,893,894],{},"Scalable Agile Practices: SAFe enables the effective scaling of agile principles across multiple teams and departments within a large organization.",[16,896,897],{},"Alignment with Business Objectives: SAFe ensures that all teams work toward common business goals, improving the overall strategic alignment of the organization.",[16,899,900],{},"Continuous Improvement: SAFe integrates lean and agile principles to foster a culture of continuous improvement, leading to better performance over time.",[16,902,903],{},"Enhanced Collaboration: The framework provides structured roles and responsibilities to facilitate collaboration across teams and departments.",[16,905,906],{},"Regular Value Delivery: Through iterative development, SAFe ensures frequent and consistent delivery of value to stakeholders, which improves customer satisfaction.",[23,908],{"style":25,"title":27,"src":909,"alt":27,"width":910,"height":911},"\u002Farticles\u002Fimages\u002Fenterprise_arch4.png",988,659,[16,913,831,914,696,919,921,923],{},[41,915,918],{"href":916,"rel":917},"https:\u002F\u002Fwww.scaledagileframework.com\u002F",[45],"Scaled Agile Framework",[29,920],{},[29,922],{},[29,924],{},[12,926,928],{"id":927},"_5-agile-framework","5. Agile Framework",[16,930,931],{},"The Agile Framework is a flexible methodology that emphasizes iterative development, collaboration, and continuous feedback. Agile focuses on delivering small, functional increments of software, allowing for rapid adaptation to changes in customer requirements. Agile is well-suited for projects where requirements are expected to evolve, and it encourages cross-functional teams to work closely together.",[856,933,935],{"id":934},"comparison-with-safe","Comparison with SAFe",[16,937,938],{},"While both Agile and SAFe promote iterative development and collaboration, they serve different organizational scopes. Agile is typically used by smaller teams working independently, allowing for flexibility and quick adjustments. In contrast, SAFe is designed to scale agile principles across large enterprises involving multiple teams. SAFe includes structured roles, responsibilities, and coordination mechanisms to ensure alignment across the entire organization, making it effective for managing complex projects with numerous interdependencies.",[16,940,941,942,944,946,948,950,955,957,959,961,690,963,968],{},"SAFe is a framework designed to help organizations scale agile practices across large enterprises and multiple teams. It integrates lean and agile principles to provide guidance on roles, responsibilities, and best practices for managing large-scale projects. SAFe emphasizes the alignment of teams toward a shared goal, effective collaboration, and regular delivery of value.\n",[29,943],{},[29,945],{},[29,947],{},[29,949],{},[23,951],{"style":25,"title":27,"src":952,"alt":27,"width":953,"height":954},"\u002Farticles\u002Fimages\u002Fenterprise_arch5.png",519,407,[29,956],{},[29,958],{},[29,960],{},[29,962],{},[41,964,967],{"href":965,"rel":966},"https:\u002F\u002Fwww.agilealliance.org\u002Fagile101\u002F",[45],"Agile Alliance",".",[29,970],{},[12,972,974],{"id":973},"comparison-of-architectures","Comparison of Architectures",[16,976,977],{},"Below is a table comparing the features of TOGAF, Zachman Framework, MODAF, and SAFe:",[979,980,981,1002],"table",{},[982,983,984],"thead",{},[985,986,987,991,994,996,999],"tr",{},[988,989,990],"th",{},"Feature",[988,992,993],{},"TOGAF",[988,995,709],{},[988,997,998],{},"MODAF",[988,1000,1001],{},"SAFe",[1003,1004,1005,1025,1043,1062,1081,1100,1119],"tbody",{},[985,1006,1007,1013,1016,1019,1022],{},[1008,1009,1010],"td",{},[398,1011,1012],{},"Purpose",[1008,1014,1015],{},"Enterprise architecture planning",[1008,1017,1018],{},"Taxonomy for enterprise architecture",[1008,1020,1021],{},"Defense systems modeling",[1008,1023,1024],{},"Scaling agile practices",[985,1026,1027,1031,1034,1037,1040],{},[1008,1028,1029],{},[398,1030,782],{},[1008,1032,1033],{},"Business, data, application, technology",[1008,1035,1036],{},"Business, system, technology views",[1008,1038,1039],{},"Systems, capabilities, processes",[1008,1041,1042],{},"Teams, programs, portfolios",[985,1044,1045,1050,1053,1056,1059],{},[1008,1046,1047],{},[398,1048,1049],{},"Structure",[1008,1051,1052],{},"Architecture Development Method (ADM)",[1008,1054,1055],{},"Matrix of viewpoints (rows & columns)",[1008,1057,1058],{},"Layered views (e.g., capability, system)",[1008,1060,1061],{},"Levels: Team, Program, Portfolio",[985,1063,1064,1069,1072,1075,1078],{},[1008,1065,1066],{},[398,1067,1068],{},"Target Audience",[1008,1070,1071],{},"Enterprise architects, IT managers",[1008,1073,1074],{},"Enterprise architects, stakeholders",[1008,1076,1077],{},"Defense and government stakeholders",[1008,1079,1080],{},"Agile teams, enterprise stakeholders",[985,1082,1083,1088,1091,1094,1097],{},[1008,1084,1085],{},[398,1086,1087],{},"Level of Detail",[1008,1089,1090],{},"High-level to detailed architectural design",[1008,1092,1093],{},"Detailed categorization of components",[1008,1095,1096],{},"High-level defense capability mapping",[1008,1098,1099],{},"Operational and tactical agile practices",[985,1101,1102,1107,1110,1113,1116],{},[1008,1103,1104],{},[398,1105,1106],{},"Technology Specificity",[1008,1108,1109],{},"Technology-agnostic, adaptable to .NET",[1008,1111,1112],{},"Technology-agnostic",[1008,1114,1115],{},"Often government\u002Fdefense-specific",[1008,1117,1118],{},"Supports various technologies including .NET",[985,1120,1121,1126,1129,1132,1135],{},[1008,1122,1123],{},[398,1124,1125],{},"Implementation with .NET",[1008,1127,1128],{},"Suitable for modular applications, SOA, microservices",[1008,1130,1131],{},"Useful for ensuring holistic system design",[1008,1133,1134],{},"Suitable for secure, interoperable defense solutions",[1008,1136,1137],{},"Ideal for iterative development using Azure DevOps",[29,1139],{},[29,1141],{},[29,1143],{},[29,1145],{},{"title":70,"searchDepth":83,"depth":83,"links":1147},[1148,1149,1150,1151,1153,1154,1155,1156],{"id":595,"depth":89,"text":589},{"id":598,"depth":89,"text":599},{"id":605,"depth":89,"text":606},{"id":705,"depth":89,"text":1152},"2. Zachman Framework",{"id":845,"depth":89,"text":846},{"id":884,"depth":89,"text":885},{"id":927,"depth":89,"text":928},{"id":973,"depth":89,"text":974},"2024-10-10","Lets explore four common enterprise architecture frameworks TOGAF, Zachman Framework, MODAF, SAFe and Agile . Each framework has its distinct use cases, structure, and target audience, making them suitable for different types of projects and organizational needs","\u002Farticles\u002Fimages\u002Fenterprise_arch0.png",{},"\u002Farticles\u002F2024_10_architecturalpatterns",{"title":589,"description":1158},"articles\u002F2024_10_architecturalpatterns",[1165,1166],"business","technology","RzsZu2Zsit30hDIYRLavM7S0_BCoeCTOE5OBHWaYPrc",{"id":1169,"title":1170,"author":7,"body":1171,"createdAt":1545,"description":1546,"extension":563,"img":1547,"meta":1548,"navigation":92,"path":1549,"seo":1550,"stem":1551,"tags":1552,"updatedAt":1545,"__hash__":1554},"articles\u002Farticles\u002Fazure-appservices-containersapps.md","Comparing Azure App Services and Azure Container Apps Features Benefits Pros and Cons",{"type":9,"value":1172,"toc":1537},[1173,1177,1180,1183,1185,1187,1191,1197,1202,1234,1239,1265,1270,1290,1294,1299,1303,1335,1339,1364,1368,1388,1392,1398,1404,1408,1411,1520,1522,1524,1529,1534],[12,1174,1176],{"id":1175},"comparing-azure-app-services-and-azure-container-apps-features-benefits-pros-and-cons","Comparing Azure App Services and Azure Container Apps: Features, Benefits, Pros, and Cons",[16,1178,1179],{},"When deploying and managing applications on Azure, two prominent options stand out: Azure App Services and Azure Container Apps. Both cater to different use cases and offer distinct features. Here, we'll dive into their differences, benefits, pros, and cons, and examine their performance features.",[23,1181],{"style":25,"src":1182,"alt":27,"title":27},"\u002Farticles\u002Fimages\u002Fappservices_vs_containerapps_2.png",[29,1184],{},[29,1186],{},[12,1188,1190],{"id":1189},"azure-app-services","Azure App Services",[16,1192,1193,1196],{},[398,1194,1195],{},"Overview:","\nAzure App Services is a platform-as-a-service (PaaS) offering that allows developers to build, deploy, and scale web apps, mobile backends, and RESTful APIs.",[16,1198,1199],{},[398,1200,1201],{},"Benefits:",[418,1203,1204,1210,1216,1222,1228],{},[395,1205,1206,1209],{},[398,1207,1208],{},"Managed Environment:"," Handles infrastructure management, including patching and scaling.",[395,1211,1212,1215],{},[398,1213,1214],{},"Integrated Development Environment:"," Supports multiple languages and frameworks like .NET, Java, Node.js, PHP, Python, and Ruby.",[395,1217,1218,1221],{},[398,1219,1220],{},"Deployment Options:"," Facilitates continuous integration and deployment with GitHub, Azure DevOps, and other CI\u002FCD tools.",[395,1223,1224,1227],{},[398,1225,1226],{},"Built-in Services:"," Includes load balancing, auto-scaling, and built-in monitoring and diagnostics.",[395,1229,1230,1233],{},[398,1231,1232],{},"Security:"," Offers SSL certificates, custom domain names, and compliance with industry standards.",[16,1235,1236],{},[398,1237,1238],{},"Pros:",[418,1240,1241,1247,1253,1259],{},[395,1242,1243,1246],{},[398,1244,1245],{},"Ease of Use:"," Simplified deployment and management with minimal configuration.",[395,1248,1249,1252],{},[398,1250,1251],{},"Scalability:"," Automatically scales up or out based on demand.",[395,1254,1255,1258],{},[398,1256,1257],{},"Integration:"," Seamless integration with other Azure services (e.g., Azure SQL Database, Azure Storage).",[395,1260,1261,1264],{},[398,1262,1263],{},"Cost Management:"," Flexible pricing plans, including a free tier for basic apps.",[16,1266,1267],{},[398,1268,1269],{},"Cons:",[418,1271,1272,1278,1284],{},[395,1273,1274,1277],{},[398,1275,1276],{},"Limited Customization:"," Limited control over the underlying infrastructure.",[395,1279,1280,1283],{},[398,1281,1282],{},"Dependency on Azure Ecosystem:"," Strongly tied to Azure services, which might be a drawback for multi-cloud strategies.",[395,1285,1286,1289],{},[398,1287,1288],{},"Complexity in Advanced Scenarios:"," May require workarounds or additional services for complex scenarios like multi-region deployments or specific compliance requirements.",[12,1291,1293],{"id":1292},"azure-container-apps","Azure Container Apps",[16,1295,1296,1298],{},[398,1297,1195],{},"\nAzure Container Apps is a serverless container service designed to build and deploy modern applications using microservices and container orchestration.",[16,1300,1301],{},[398,1302,1201],{},[418,1304,1305,1311,1317,1323,1329],{},[395,1306,1307,1310],{},[398,1308,1309],{},"Serverless:"," Abstracts the underlying infrastructure, allowing developers to focus on application logic.",[395,1312,1313,1316],{},[398,1314,1315],{},"Microservices Support:"," Ideal for deploying applications composed of multiple microservices.",[395,1318,1319,1322],{},[398,1320,1321],{},"Flexibility:"," Supports any containerized application, irrespective of the programming language or framework.",[395,1324,1325,1328],{},[398,1326,1327],{},"Event-driven Architecture:"," Integrates with Azure Event Grid, Azure Functions, and other event-driven services.",[395,1330,1331,1334],{},[398,1332,1333],{},"Auto-scaling:"," Automatically scales based on HTTP traffic or custom metrics.",[16,1336,1337],{},[398,1338,1238],{},[418,1340,1341,1347,1353,1358],{},[395,1342,1343,1346],{},[398,1344,1345],{},"Agility:"," Quick to deploy and update containerized applications.",[395,1348,1349,1352],{},[398,1350,1351],{},"Granular Control:"," More control over the runtime environment compared to App Services.",[395,1354,1355,1357],{},[398,1356,1251],{}," Efficient scaling at the container level, supporting spikes in demand.",[395,1359,1360,1363],{},[398,1361,1362],{},"Portability:"," Containers can be moved across different environments, including on-premises and other cloud providers.",[16,1365,1366],{},[398,1367,1269],{},[418,1369,1370,1376,1382],{},[395,1371,1372,1375],{},[398,1373,1374],{},"Complexity:"," Requires understanding of containerization and orchestration concepts.",[395,1377,1378,1381],{},[398,1379,1380],{},"Cold Start Latency:"," Potential cold start issues similar to other serverless offerings.",[395,1383,1384,1387],{},[398,1385,1386],{},"Resource Management:"," Although managed, you still need to handle aspects like container lifecycle and resource optimization.",[12,1389,1391],{"id":1390},"performance-features-comparison","Performance Features Comparison",[16,1393,1394,1395,1397],{},"When comparing performance features, Azure App Services and Azure Container Apps offer distinct capabilities tailored to their respective use cases. ",[398,1396,1190],{}," provides performance optimization through automatic scaling, load balancing, and built-in caching mechanisms. It supports scaling both vertically (increasing the power of existing instances) and horizontally (adding more instances) based on predefined metrics or schedules. App Services also integrates seamlessly with Azure CDN for improved global performance and Azure Traffic Manager for efficient traffic distribution.",[16,1399,1400,1401,1403],{},"In contrast, ",[398,1402,1293],{}," leverages Kubernetes-based orchestration under the hood, offering granular control over performance tuning. It excels in handling microservices architectures, allowing individual containers to scale independently based on specific metrics, such as CPU and memory usage. This fine-grained scaling ensures optimal resource utilization and performance efficiency for each microservice. Container Apps also support advanced networking features, such as service mesh integration, which enhances performance by optimizing service-to-service communication within the application.",[12,1405,1407],{"id":1406},"when-to-use-each-service","When to Use Each Service",[16,1409,1410],{},"Here's a table summarizing when each service is well suited:",[979,1412,1413,1430],{},[982,1414,1415],{},[985,1416,1417,1422,1426],{},[988,1418,1419],{},[398,1420,1421],{},"Scenario",[988,1423,1424],{},[398,1425,1190],{},[988,1427,1428],{},[398,1429,1293],{},[1003,1431,1432,1443,1454,1465,1476,1487,1498,1509],{},[985,1433,1434,1437,1440],{},[1008,1435,1436],{},"Traditional web apps and APIs",[1008,1438,1439],{},"Best suited for simple, monolithic applications",[1008,1441,1442],{},"Not ideal",[985,1444,1445,1448,1451],{},[1008,1446,1447],{},"Rapid development and deployment",[1008,1449,1450],{},"Excellent choice with easy CI\u002FCD integration",[1008,1452,1453],{},"Suitable, but requires container knowledge",[985,1455,1456,1459,1462],{},[1008,1457,1458],{},"Minimal infrastructure management",[1008,1460,1461],{},"Ideal, as it abstracts infrastructure complexities",[1008,1463,1464],{},"Provides some abstraction, but requires container management",[985,1466,1467,1470,1473],{},[1008,1468,1469],{},"Applications with predictable traffic",[1008,1471,1472],{},"Handles predictable scaling efficiently",[1008,1474,1475],{},"Handles scaling well, but shines with fluctuating workloads",[985,1477,1478,1481,1484],{},[1008,1479,1480],{},"Microservices architecture",[1008,1482,1483],{},"Not optimized for microservices",[1008,1485,1486],{},"Perfectly suited for microservices",[985,1488,1489,1492,1495],{},[1008,1490,1491],{},"Granular performance tuning",[1008,1493,1494],{},"Limited to platform capabilities",[1008,1496,1497],{},"Offers fine-grained control and optimization",[985,1499,1500,1503,1506],{},[1008,1501,1502],{},"Multi-cloud and portability needs",[1008,1504,1505],{},"Tightly integrated with Azure ecosystem",[1008,1507,1508],{},"Highly portable across different environments",[985,1510,1511,1514,1517],{},[1008,1512,1513],{},"Event-driven applications",[1008,1515,1516],{},"Can be integrated with event-driven services",[1008,1518,1519],{},"Natively supports event-driven architectures",[29,1521],{},[12,1523,545],{"id":544},[16,1525,1526,1528],{},[398,1527,1190],{}," is best for developers looking for a straightforward way to deploy web apps and APIs without worrying about infrastructure management. It's ideal for traditional web applications that require a quick and easy deployment process.",[16,1530,1531,1533],{},[398,1532,1293],{}," is suited for developers who need more control over their application environment and want to deploy modern, containerized applications with microservices architecture. It offers greater flexibility and is more suitable for complex applications requiring fine-grained scaling and orchestration.",[16,1535,1536],{},"Choosing between the two depends on your application's architecture, your team's expertise with containers, and your need for control versus ease of use. Whether you prioritize the simplicity and integrated services of App Services or the granular control and performance optimization of Container Apps, Azure has a solution to meet your needs.",{"title":70,"searchDepth":83,"depth":83,"links":1538},[1539,1540,1541,1542,1543,1544],{"id":1175,"depth":89,"text":1176},{"id":1189,"depth":89,"text":1190},{"id":1292,"depth":89,"text":1293},{"id":1390,"depth":89,"text":1391},{"id":1406,"depth":89,"text":1407},{"id":544,"depth":89,"text":545},"2024-06-12T15:44:03.462Z","When deploying and managing applications on Azure, two prominent options stand out. Azure App Services and Azure Container Apps. Both cater to different use cases and offer distinct features. Here, we'll dive into their differences, benefits, pros, and cons, and examine their performance features.","\u002Farticles\u002Fimages\u002Fappservices_vs_containerapps.png",{},"\u002Farticles\u002Fazure-appservices-containersapps",{"title":1170,"description":1546},"articles\u002Fazure-appservices-containersapps",[1553],"azure","gXbVnG9BGDl9U618t6qtPPrPHpfcxpLl8gKn_ydmDbI",1781574757949]