Deployment Yout application part 2

The repository you cloned in Lesson 1 contained multiple branches that represent different stages of the application. For this step you will need to create a new local branch within your repository and set it to be track the remote “pg” branch. To do this make sure that you are in your repo and run git checkout -b pg origin/pg

We named this branch is called “pg” because the database that we have is a PostgreSQL database. There are many databases out there that you can use but Heroku requires that you use PostgreSQL when using a Ruby application. Sinatra doesn’t require any database by default but other frameworks like Rails come with SQLite as a default. SQLite will create a database file in your application directory that will change as your database updates. Because of Heroku’s ephemeral filesystem this changing database file will be eventually reset, meaning it is unsuitable for use with Heroku.

At this point your application is ready to be deployed, however unless you have PostgreSQL installed in your computer you will not be able to run this application in your localhost. If you do not have PostgreSQL installed follow these guides.

You may notice when opening this up in your editor that there are many more files present than there were in the version without a database. This is because to get a database working with this Sinatra application you have to have not only the database but also a way for your application to interact with the database, in this case ActiveRecord. ActiveRecord is an ORM or Object Relational Manager that will translate the ruby code to SQL (pronounced sequel) that the database can execute.

ActiveRecord comes in the form of a gem so you want to make sure that the application is stable locally before it can be deployed online, so run bundle install

Now that the required gems are installed on your local system, open the app as you regularly would on your local development environment. Run ruby app.rb When you try to open the application by visiting localhost:4567 you see that we have a Sinatra error:

Here we see that the table that needs to be in the database does not yet exist. You need to create it. Return to the command line, shut the server down and run rake db:migrate

Now that you have created the table required, go ahead and fire up the server again with ruby app.rb and navigate to it on your browser.

Now that the application is running without errors you are ready to deploy this new version of the application to Heroku.

To push your pg branch to the Heroku remote make sure that you are on the pg branch (you can check by running git branch) and run this command: git push heroku HEAD:master

This command will ensure that the code that is pushed to heroku master is the one that is at HEAD. In this case, this is the pg branch.

Once you do this open the application by running heroku open.

You will see that we get an internal server error. Well if you recall, when running the application locally you had to run the database migrations. To run a command on your Heroku server you have to prepend the command with heroku run. This will tell Heroku that you want to run a command on the live server, much like you would when you are running it on localhost. So instead of rake db:migrate, try heroku run rake db:migrate.

Well that’s strange, it looks different than the different error you got last time about the undefined PG table. It looks here that Heroku is not able to find a database connection.

This happened because you do not have a PostgreSQL addon included in Heroku. Heroku will only automatically include the PostgreSQL addon if your very first deploy includes the gem pg in the Gemfile. This is your second deploy to the same Heroku application so it is not included. To include this addon run heroku addons:create heroku-postgresql.

Now try running the database migrations again in the Heroku server by using heroku run heroku run rake db:migrate.

Great it looks like you’re almost there. Check if your page is up by refreshing it.

You have now successfully deployed the version of the Udacity Gallery application with a database!

Let’s recap the takeaways here:

  • Running commands on your Heroku server is different than running those same commands on your local computer.
    • Prepend your commands with heroku run.
  • Installing a database on your Heroku server is not always automatic.
    • If your first deploy contains the pg gem, then Heroku will include the heroku-postgresql addon.
    • If your application does not start with a postgres database but you want to add it you must run the heroku addons:create heroku-postgresql.

Your Deployed Application

Before we are able to deploy on Heroku you need to make sure you have a few things installed. We will go through those requirements here to ensure you are ready to deploy in just a few simple steps.

Heroku Account
The first thing we need to do is make sure you have a Heroku account created. This will give you access to Heroku’s deployment services and will allow you to manage your deployed applications on their web app. It is free to sign up so visit the Heroku homepage and sign up for an account.

Heroku Toolbelt
The next thing you should do is install the Heroku Toolbelt. The toolbelt is a command line tool that will expand the functionality of your command line to include heroku commands. For example, once installed you will be able to use the heroku login command to log into your account from your command shell. To install the Heroku Toolbelt navigate to and follow the installation instructions for your operating system.

Heroku Login
Once you have your Heroku account and the toolbelt installed you will want to log in to your Heroku account from the command line. To do this, open up your command line shell and type heroku login. This will prompt you for your Heroku email and password. If you entered your information correctly, your command line output should look something like the image below. You won’t have to log in every time you want to deploy, your credentials will be saved for some time, so this is a good command to keep in mind if you get logged out at some point.

Git Installed
Heroku deploys the most recent version of your app by keeping track of changes via Git. Make sure that you have Git installed on your command shell. If you do not have Git installed you can visit this link to get yourself set up. Most recent MacOS machines come with Git already installed, and if you have been building applications on your development environment already, it is likely you have already been using Git.

Clone Repository Now that you have everything you need to get started, you will need to clone the gallery application you are going to deploy. Open up your command line and navigate to the location where you want the repository to live, this is often a projects directory but it can be anywhere you like on your machine as long as it is not within another Git repository. If you are not sure if there is a git repo on your working directory you can check using git status. If you get a message saying fatal: Not a git repository (or any of the parent directories): .git This means you are not in a Git repo and you can clone in this location. Go to the Udacity repository in your web browser.

In order to make updates to the codebase, you will need your own copy of the repository, which you can do from the Github page. You will need an account on Github in order to fork the repository to your own account. Click the ‘fork’ button in the upper right corner of the page (see image above) and choose your account to fork.

Once you have forked the repository, open your new repository in your web browser and copy the clone URL. Return to your command line and type git clone followed by the git clone URL you just copied. This will clone the code on GitHub to your computer.

git clone<your_github_account>/galeria

Once you have installed all the tools and cloned the repo, you are ready to go live. Let’s go ahead and change our working directory to the repository directory: cd galeria

It is generally a good idea to check your git status to make sure you are about to deploy the most updated stable version. Let’s deploy!

Heroku Create
To get yourself deployed on Heroku, you must first create a remote on Git. To do this you have to run the heroku createcommand. This will make a new remote repo named heroku where the code will be pushed to.

To ensure you have properly created this remote, run the git remote -v command, you should see something output that reveals the two remotes listed, origin and heroku.

Git Push Heroku Master
Now the last step, the ribbon cutting is the command git push heroku master. This command is very similar to the git push that you may be familiar with when pushing your code to GitHub. Instead of pushing it to github via the originremote, you are pushing it to the heroku remote.

From this point you will see a large output from Heroku that is listing all of the libraries and tools that are being installed on the Heroku machine before your code is finally decompressed and launched onto the online server.

Heroku Open
Once you have your application deployed, Heroku will provide you with a URL you can visit to see your site. After this you can run heroku open. This will open up a browser window and navigate to the deployed application URL.

Now your gallery is live! Click on the “New Art Piece” button to see a new image appear!

নিজেকে বদলানোর গল্প -১

ঘটনা ১.
করিম সাহেব একটি কোম্পানির ম্যানেজিং ডিরেক্টর। সুউচ্চ একটি ভবনের টপ ফ্লোরে ওনার অফিস। আজ অফিস শেষে ভবনের নিচতলার কফি শপে ঢুকে কিছুটা হকচকিয়ে গেলেন। ওনার অফিসে সদ্য জয়েন করা ছেলেটি টানা তৃতীয় দিনের মতো সেই ক্যাফেতে কফি খাচ্ছে আর সেলফি তুলছে। তিনি ক্যাফেতে না ঢুকে নিজের গাড়িতে চড়ে বাসায় ফিরে গেলেন।

সুউচ্চ সেই কর্পোরেট ভবনের নিচতলার ক্যাফেটি বিদেশি ব্র্যান্ডের। এককাপ কফি আর একটা ন্যূনতম স্ন্যাক্স খেতে গেলে কমপক্ষে পাঁচশ’- সাড়ে পাঁচশ’ টাকা বিল আসে। আসলে এই ব্যয়বহুল অভিজাত ক্যাফের ব্রাঞ্চটি করাই হয়েছে কোম্পানির মালিকপক্ষ, উচ্চপদস্থ কর্মকর্তা আর ক্লায়েন্টদের কথা চিন্তা করে। সেই কফি শপে পনেরো-ষোল হাজার টাকা বেতন পাওয়া ছেলে প্রায় সময় গিয়ে এতো টাকা খরচ কেন করে সেটি করিম সাহেবের মাথায় আসে না। এতো টাকা এভাবে খরচ না করে এই সদ্য চাকরি পাওয়া ছেলেটি নিজের ভবিষ্যতের জন্য জমাতে পারতো বা পরিবারের পেছনে খরচ করতে পারতো।

ক্যারিয়ারের প্রথম দিকে তিনি নিজেও তাই করতেন। এমনকী এখনো আয় বুঝেই ব্যয় করেন। জীবনে এতোটা পথ এভাবে সঠিকভাবে পেরিয়েছেন বলেই সফলতা পেয়েছেন তিনি। তরুণ বয়স থেকেই অযৌক্তিক শো অফ করতে গিয়ে বা ট্রেন্ডে গা ভাসিয়ে দিলে তিনি কখনোই জীবনে এতোটা উন্নতি করতে পারতেন না।

ঘটনা ২.
শরীফ সাহেবের মাসিক আয় প্রায় সাত লক্ষ টাকা। একটি এক্সেসরিজ কোম্পানির অধিকর্তা তিনি। একদিন বিস্মিত হয়ে দেখলেন তার কোম্পানির তরুণ এক্সিকিউটিভের হাতে আইফোন। এ ব্যাপারে জিজ্ঞেস করতেই ছেলেটি দাঁত বের করে হেসে বললো, ‘স্যার, সত্তর হাজার টাকার ফোন। ক্রেডিট কার্ড দিয়ে কিনেছি!’ শরীফ সাহেব এমন উত্তরে খুব ব্যথিত হলেন।

ক্রেডিট মানে তো ধার! মানুষ ধার নেয় বিপদে-আপদে, জরুরি প্রয়োজনে। কেউ বিলাসপণ্য কেন ধার করে কিনবে- সেটি তার বুঝে এলো না। যে ছেলে অপ্রয়োজনে বিলাসী মোবাইল কিনে ক্রেডিট কার্ডের লিমিট শেষ করে ফেলেছে, হঠাৎ করে তার বাবা বা ছেলেটি নিজেই অসুস্থ হয়ে গেলে হাসপাতালের বিলটা সে কার কাছ থেকে জোগাড় করবে!

ঘটনা ৩.
আসলাম সাহেব উচ্চপদে চাকরি করে অবসরগ্রহণ করেছেন কিছুদিন আগে। অবসরগ্রহণের সময় উনি খুব তৃপ্ত ছিলেন যে তার সন্তান খুব ভালো পদে চাকরি পেয়ে গেছে। যার শুরুর বেতন আসলাম সাহেবের অবসর সময়কার বেতনের প্রায় সমান। কিন্তু ইদানিং তিনি তার সন্তান নিয়ে খুব অস্বস্তিতে থাকেন। এতো টাকা বেতন পায়, তবু ছেলেটা সারামাস খুব অস্থিরতায় ভোগে। পরিবারে টাকা দেওয়া বা নিজের জন্য সঞ্চয় তো দূরের কথা, তার সন্তান মাসের শেষ আসতে না আসতেই উল্টো বাবার কাছে চলে আসে টাকা ধার করতে।

এ মাসেও যখন ছেলেটি কাচুমাচু মুখে আসলো আবার টাকা ধার চাইতে, তখন আসলাম সাহেব কিছুটা উদ্বিগ্ন হয়েই ছেলেকে কাছে বসিয়ে জিজ্ঞেস করলেন, ‘আমার বাসায় থাকিস তাই তোর বাসা ভাড়া দিতে হয় না। গ্যাস বিদ্যুৎ পানি কোনো কিছুর বিল দিতে হয় না। বাসাতেই খাবার খাস এবং বাসাতে তোর কোনো খরচও দিতে হয় না। কিন্তু তবু কেন এতো টাকা বেতন পেয়েও তোর নিজের খরচ চলে না?’ হঠাত এ প্রশ্নে অস্থির ছেলেটি চিৎকার করে বললো, ‘আপনি কেন এতো কিছু হিসাব করছেন? আপনি জানেন, এখনকার দিনে লাইফস্টাইল মেইনটেন করতে কতো টাকা খরচ করতে হয়?’

সন্তানের কাছ থেকে এ উত্তর শুনে বাবা হতবাক হয়ে যান! লাইফস্টাইল? মেইন্টেইন? এসব কী? লাইফস্টাইল আবার কী জিনিস? তার আমলে তো লাইফস্টাইল শব্দটি শুধু সিনেমাবিষয়ক ম্যাগাজিন পত্রিকায় স্থান পেতো। চলচ্চিত্রের নায়ক-নায়িকার লাইফস্টাইল নিয়ে কথা হতো। এমনকী চলচ্চিত্রের নায়ক-নায়িকারাও লাইফস্টাইল নিয়ে মাথা ঘামাতেন নিজেদের কাজের স্বার্থেই, অযথা তো নয়।

ক্যারিয়ারে স্ট্রাগলিং করা এক তরুণ কেন এখনই লাইফস্টাইল নিয়ে মাথা ঘামাবে? দামি মোবাইল কেনা, দামি রেস্টুরেন্টে খাওয়া, সিঙ্গাপুর, মালয়েশিয়ায় ঘুরতে যাওয়া- এ সবকিছুই প্রতিনিয়ত সামাজিক যোগাযোগমাধ্যমে আপলোড করে দশজনকে জাহির করে ‘লাইফস্টাইল’ প্রতিষ্ঠা করা। এ সব করে তার লাভটা কী হচ্ছে? যে নায়ক-নায়িকারা কোনো হিসেব না করে অযথা লাইফস্টাইল মেইনটেন করতো তারাও তো পরে কাজের অভাবের সময় জমানো টাকা না থাকায় দেউলিয়া হয়ে পথে বসে যেত। এসব পরে পত্রিকাতেও আসতো। অযৌক্তিক লাইফস্টাইল তো কখনো শুভ পরিণাম আনে না। তার সন্তান এ কী ধরনের ট্রেন্ডে গা ভাসিয়ে দিচ্ছে!

তিনি সন্তানকে কিছু পরামর্শ দিতে গেলে সন্তান তাকে চুপ করিয়ে তাচ্ছিল্য ভরে উত্তর দিলো, ‘বাবা, আমি চাই না আপনি আমাকে কিছু বোঝাতে আসেন। আপনি নিজে জীবনে কিছু করতে পারেননি।’ আসলাম সাহেব সন্তানের মুখে এই কথা শুনে চুপ হয়ে গেলেন। সন্তানকে আর বললেন না যে, যৌবনে যে টাকা তিনি আয় করতেন তা দিয়ে নিজের ব্যক্তিজীবন এ সন্তানের চেয়েও অনেক আয়েশিভাবে পার করতে পারতেন। কিন্তু তিনি যা রোজগার করতেন তা দিয়ে নিজের বাবা-মার দেখাশোনা করেছেন, ছোট ভাই-বোনদের দেখাশোনা করেছেন, কোন আত্নীয়-স্বজন বন্ধু-বান্ধবদের বিপদের সময় পাশে দাঁড়িয়েছেন, নিজের স্ত্রী-সন্তানদেরও দেওয়ার পাশাপাশি তাদের ভবিষ্যতের জন্যও সঞ্চয় করেছেন। সবাইকে নিয়ে একসঙ্গে জীবনের পথ চলেছেন, কখনো অপচয় করে অযথা হতাশ হননি, বরং তৃপ্তির সঙ্গে নিয়মিত ধর্ম-কর্ম করে স্রষ্টার কাছে কৃতজ্ঞতা প্রকাশ করেছেন। পাশাপাশি ধৈর্য্যের সঙ্গে দিশেহারা না হয়ে রোজগার বাড়ানোর কাজও অব্যাহত রেখেছেন। এটাই ছিলো তাদের যুগের সঠিক `লাইফস্টাইল`।


তথ্যপ্রযুক্তির উন্নতি আমাদের অর্থনীতি ও বৈজ্ঞানিক বিকাশে অবদান রাখার পাশাপাশি প্রভাব ফেলছে আমাদের সামাজিক ও ব্যক্তিগত জীবনেও। তথ্য জানার পরিধি বাড়িয়ে প্রভাব ফেলছে আমাদের দৃষ্টিভঙ্গি তৈরিতেও। আগের প্রজন্মে একজন মানুষের বাস্তব অবস্থান এবং পারিপার্শ্বিক পরিবেশ প্রায় একই ছিলো। তখন একজন মানুষের স্বপ্ন বা চাহিদা তৈরি হতো তার বাস্তব জীবনের চারপাশে বিস্তৃত সুযোগ-সুবিধা আর আকর্ষণ দেখে। সেটাতে অসম কোনো চাহিদা বা তাড়না তৈরি হতো না। তথ্য কম ছিলো, তাই চাহিদাও কম ছিলো। যে যেই সামাজিক স্তরের, তার জীবনযাপন সংক্রান্ত ধারণাও সেই পর্যায়েই পরিমিত ছিলো।

সন্তান বড় হয়ে নিজ চেষ্টায় আগে নিজের জীবনের উন্নতি করতো, সে অনুযায়ী সে জানতো তার নতুন চাহিদা, তারপর তা পূরণ করে নিতো। কিন্তু এখন ভিন্ন পৃথিবী। এখন একই সময়ে মোবাইল ইন্টারনেটে একজন ধনী ছেলে যা দেখে বড় হয়, একজন মধ্যবিত্ত ছেলেও তা দেখে তাড়িত হয়, একজন অস্বচ্ছল পরিবারের সন্তানও মনে মনে একই চাহিদার জালে আটকে হাসফাস করে। একজন ধনীর ছেলেও এসি ঘরে বসে নেট দেখে ল্যাম্বারগিনি গাড়ি কেনার সিদ্ধান্ত নেয়, একজন মধ্যবিত্ত ছেলেও গুগল ঘেঁটে মনের ভেতর প্রবল অভাব অনুভব করে একটি ল্যাম্বারগিনি গাড়ি কেনার, একজন অস্বচ্ছল সন্তানও ফেসবুকে গাড়ির ছবি দেখে মনে মনে বিদ্রোহী হয়ে যায় সে কেন এখনোই দামি গাড়ি কেনার জন্য সক্ষম হচ্ছে না। তার বয়সী অন্য ঘরের ছেলেরা কিনতে পারছে, কবে পারবে সে এটা কিনতে।

একযুগ আগেও মানুষ অন্যের হাতে নতুন মোবাইল সেট দেখতো। এতোটুকুই। কিন্তু এখন কোনো ছেলে কষ্টের টাকায় পাঁচ-সাত হাজার টাকায় কোনো মোবাইল সেট কিনলে তাতে তার প্রয়োজন মেটে ঠিকই, কিন্তু ঘরের সামনে অগুণতি মোবাইল শোরুমে নিজ হাতে দামি দামি মোবাইল ঘেঁটে দেখার সুযোগ পেয়ে ‘সস্তা’ মোবাইলে তার মন ভরা খুব কষ্ট হয়ে যায়। নব্বই দশকে যে মৌচাক বা নিউমার্কেট যেতো, সে গুলশানের দামি মলগুলোর খোঁজ রাখতো না। আর এখন যার যেমন অর্থনৈতিক বাস্তবতাই হোক, সবাই বড় বড় মলগুলোতে ঢু দিচ্ছে, নিজে পরখ করে দেখছে দামি ব্র্যান্ডের সুখ। কিন্তু পরখ পর্যন্তই, সবার সামর্থ এক নয়, সামর্থ না থাকলে দহনে পুড়ছে অনেকেই।

ফেসবুকের ওয়াল দু’বার স্ক্রল করেই অনেকে টেনশন শুরু করে নতুন রেস্টুরেন্টে গিয়ে ছবি তোলার জন্য, নতুন কোন ডে আরো সাড়ম্বরে সেলিব্রেট করার জন্য, নতুন কোন গ্যাজেট বা ডিএসএলআর কেনার জন্য, অথবা ব্যাংকক, থাইল্যান্ড যাওয়ার জন্য। এখানে খাবারের টেস্ট, নতুন ড্রেসের কমফোর্ট বা নতুন কোন স্থানের সৌন্দর্য মুখ্য নয়, মুখ্য হচ্ছে এসবের সামনে একটা সেলফি দেওয়া বা ভেতরে একটা চেক ইন দেওয়া। এখানে সঞ্চিত টাকা বা মাসিক আয় মুখ্য নয়, ক্রেডিট কার্ডে ধার বা বাবা-মার কাছ থেকে টাকা ধার করলেও চলে, এতোটা গুরুত্বপূর্ণ হয়ে যায় সব হাইপ অন্ধের মতো অনুসরণ করা। এসব না করলে প্রেমের সম্পর্ক টেকে না, বন্ধুর আড্ডায় নিজেকে অবাঞ্চিত মনে হয়, সবকিছু থেকে হাজার মাইল পিছিয়ে যাওয়ার মতো অনুভূতিতে মন গ্রাস হয়।

যুগ বদলাচ্ছে, অনেকেই যুগের হাওয়ার সঙ্গে নিজেকে ভুলভাবে জড়াচ্ছে। আগের যুগের দায়িত্ব, স্বপ্ন, মিতব্যয়িতা, আরাম, লক্ষ্য- এসব শব্দ এখন আর চলছে না। কারণ এগুলো যার যার পরিবার আর শিক্ষা থেকে আসতো। এখনকার যুগে জায়গা করে নিচ্ছে হাইপ আর ট্রেন্ড। মূল্যবোধ, নীতিবোধ, চরিত্র, ব্যক্তিত্ব- এ সবকিছুর জায়গা করে নিচ্ছে এক ‘অ্যাটিটিউড’ নামক মানসিকতা। অনুসরণভিত্তিক জীবন এখন হয়ে যাচ্ছে অনুকরণমূলক, অযৌক্তিক মোহের পারদ উঁচু হচ্ছে, যৌক্তিক ধীশক্তি ক্ষয় হয়ে নিঃশেষ হয়ে যাচ্ছে, যোগ্যতা ছাড়াই অহংকার দেখানোর প্রবণতা বাড়ছে, স্থান নিচ্ছে সীমাহীন অস্থিরতা।

ফলাফল নতুন প্রজন্মের অনেকেই বাস্তবতাকে গুরুত্ব না দিয়ে মানসিক তাড়নায় যাচ্ছেতাই ভাবে জীবন সাজাচ্ছে। যে জীবন তাকে বর্তমানে সুখের টনিক দিচ্ছে কিন্তু সন্তুষ্টি বা শান্তি দিতে পারছে না। জীবনে চলার পথে একটি অনড় লক্ষ্য থাকতে হয়, সমস্ত মনোযোগ ও পরিকল্পনা থাকতে হয় লক্ষ্যের দিকে। যে ছেলেটি সবে তার জীবনের পথে পথচলা শুরু করেছে, চলার পথের চারপাশের মোহে সে যদি এখনোই সামাজিক হাইপ, শো অফ, ট্রেন্ড ফলো করা, সুখ প্রদর্শন করা প্রভৃতি বিষয়ে দিশেহারা হয়ে যায় তাহলে ব্যর্থ হবে। সে একসময় অস্থির জীবনে ভুলেই যাবে কী তার জীবনের লক্ষ্য ছিলো। কোথা থেকে সে তার জীবনের যাত্রা শুরু করেছে, আর কোথায় যাওয়া তার লক্ষ্য ছিলো। যে লোক চলার পথে সব কুকুরের ঘেউ-ঘেউয়ের জবাব দিতে চায়, সে তাতেই ব্যতিব্যস্ত থাকে। তাই বারবার মনোযোগ হারায়, থেমে যায়। তার জন্য সঠিক সময়ে লক্ষ্যে পৌঁছে ধীরস্থির ও নিরাপদ জীবনের অধিকারী হওয়া কঠিন।

আগে ব্যক্তিগত ক্যারিয়ার বা জীবনে সফল হতে হয়। তখন অন্যসব অ্যাটেনশন এমনিতেই সেই মানুষের কাছে নিজ থেকে এসে ভিড় করে। একজন মাশরাফি বিন মুর্তজা, একজন জাফর ইকবাল বা একজন আনিসুল হক সামাজিক যোগাযোগমাধ্যমে এলে এমনিতেই লক্ষাধিক অনুসারী পেয়ে যান। কারণ তারা ব্যক্তিজীবনে সফল, তাই ভার্চুয়াল জগত এমনিতেই তাদের পিছনে ছোটে। এসব থেকে উদ্বুদ্ধ হয়ে তরুণ প্রজন্মের উচিত আগে জীবনে সফল হওয়ার লক্ষ্যে এগিয়ে চলা। সফল হতে থাকলে সেলিব্রেশন এমনিতেই আসবে এবং সে নিজেই একটি হাইপ বা ট্রেন্ডে পরিণত হবে। তাকে অন্যকিছু ফলো করতে হবে না।

Kazi Tahsin Ahmed