Skip to content

Home

How to Fix Ruby Gems Permission Error on Mac OS X Yosemite

The Problem

Hello and welcome back to Continuous Improvement, the podcast where we explore solutions to common problems faced by developers. I'm your host, Victor, and in today's episode, we'll be discussing how to resolve a permission error when trying to install a gem on Mac OS X Yosemite.

So, you're trying to install a gem, but you come across the following error message: "ERROR: While executing gem … (Gem::FilePermissionError) You don’t have write permissions for the /Library/Ruby/Gems/2.0.0 directory." What can you do to fix this issue?

The solution involves a few steps, but don't worry, I'll guide you through them. Let's get started.

Step 1 is to install Rbenv and Ruby-build. Open your terminal and enter the following command: "brew install rbenv ruby-build". This will install the necessary tools.

Now, we need to add Rbenv to your configuration file so that it starts automatically. If you're using the Zsh shell, enter the following commands: "echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc" and "echo 'eval "$(rbenv init -)"' >> ~/.zshrc".

If you are using a different shell, such as Bash, modify your ~/.bash_profile with the same commands.

Step 2 requires you to restart your shell. Close your terminal completely and reopen it to apply the changes we made.

In Step 3, we'll install Ruby, set it as your global version, and rehash. Enter the following commands in your terminal: "rbenv install 2.0.0-p247" to install Ruby, "rbenv global 2.0.0-p247" to set it as the global version, and "rbenv rehash" to update the Ruby environment.

Great! Now we're ready for Step 4. You can now proceed to install gems without encountering any permission issues. Simply use the command "gem install [gem-name]" to install your desired gem.

And there you have it folks, a step-by-step guide to overcome the permission error when installing a gem on Mac OS X Yosemite. With these instructions, you'll be able to install gems hassle-free.

Well, that's all for today's episode of Continuous Improvement. I hope you found this information helpful. If you have any questions or suggestions for future episodes, feel free to reach out to me. Thank you for tuning in, and until next time, happy coding!

如何修復Mac OS X Yosemite上的Ruby Gems權限錯誤

問題

當我嘗試在Mac OS X Yosemite上安裝一個gem時,我遇到了以下錯誤:

錯誤:在執行gem時...(Gem::FilePermissionError)您沒有/Library/Ruby/Gems/2.0.0目錄的寫入權限。

解決方案

步驟1:安裝Rbenv

首先,您需要安裝Rbenv和Ruby-build:

brew install rbenv ruby-build

接下來,將Rbenv添加到~/.zshrc中,使其自動啟動:

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc

:如果您不使用Zsh,請修改您的~/.bash_profile,而不是~/.zshrc

步驟2:重新啟動你的Shell

關閉您的終端並重新打開它以應用更改。

步驟3:安裝Ruby,設置全局版本並重新排序

現在,安裝Ruby並將其設置為您的全局Ruby版本:

rbenv install 2.0.0-p247
rbenv global 2.0.0-p247
rbenv rehash
步驟4:像往常一樣安裝Gems

現在您可以繼續安裝gems,而不會遇到權限問題。

gem install [gem-name]

您的gem現在應該成功安裝了!


Survival Tips for Non-Korean Speakers in Busan and Vicinity

Aleumdaun! This is how Koreans describe something as "lovely." They often use this phrase to talk about the scenic beauty of Busan, Gyeongju, and Jinhae, particularly in the spring when cherry blossoms are in full bloom.

Who doesn't love traveling? Korea is an under-explored country where most visitors usually don't venture beyond Seoul. Each of us has our own travel priorities and preferences. Personally, I love spontaneous travel, as it provides a break from my regular work schedule. It’s exhilarating to put myself in unfamiliar situations, where I don’t know the language or even have internet on my iPhone. It’s a daring step out of my comfort zone.

Here are some survival tips for non-Korean speakers visiting Busan:

Make New Friends

While staying in a guesthouse instead of a hotel, I met a savvy businessman, a talented doctor, and a lovely ajumma (Korean auntie). Though my limited Korean skills make verbal communication challenging with those who don’t speak English, remember that two-thirds of human interaction is nonverbal. A friendly smile and a warm greeting are universal. I spent an entire afternoon conversing through pictures and gestures. Koreans have a knack for turning strangers into friends. They are not only polite but also some of the kindest people I’ve met. To stay connected, consider downloading the Kakao Talk app.

Get a High-Level Overview

Before exploring, get an overview of the city to avoid getting lost. Busan Tower, at 120 meters high, provides a splendid panorama. From its top deck, you'll get a 360-degree view of Busan, including the magnificent Gwangan Bridge.

Relax and Enjoy

Haeundae Beach is extraordinary, to say the least. The sight of the ocean will take your breath away. Nearby, you'll find attractions like Oryukdo Island, APEC Naru Park, and an aquarium. If you tire of walking, coffee shops like TwoSome Place, Tom n Tom, or Caffeine Gurunaru offer cozy retreats. Also, don't miss SpaLand Centum City, located in the world’s largest department store, Shinsegae. It’s the perfect place to unwind.

Keep an Open Mind

Busan's charm isn't just in its tourist spots; even a simple walk down the streets is captivating. From pig guts to pancakes, the city’s markets offer a unique blend of tradition and modernity. For delicious street food, head to the Busan International Film Festival (BIFF) square. If you’re a shopaholic, you’ll love the underground mall at Seomyeon and the bustling area near Nampo station. Also, the Jagalchi Fish Market is a must-visit for seafood lovers.

Learn About the Culture

Gyeongju, located north of Busan, was the capital of the Silla dynasty for nearly a thousand years. It's a heritage site featuring grassy tombs of ancient royalty. Bulguksa Temple is often at the top of visitors' lists. It costs only 4,000 won for entry into this World Heritage site.

Enjoy Breathtaking Scenery

Every spring, Jinhae-gu, west of Busan, hosts a ten-day cherry blossom festival. The 1.5-kilometer long tunnels of flowers are a must-see. When a gust of wind makes the petals fall, it's a surreal and romantic scene.

So, grab your passport and join me on a trip to Busan for an exciting weekend getaway! Hopefully, this article inspires you to explore Korea and immerse yourself in its culture. To be honest, my body may have returned to the office, but my soul is still in Korea. Add me to your list of travel companions; I'm excited to discover more beautiful places and share them with you. Kamsa-Hamnida, which is the Korean way to say a heartfelt thank you.


Survival Tips for Non-Korean Speakers in Busan and Vicinity

Hello and welcome to Continuous Improvement! I'm your host, Victor. Today, we're going to whisk you away to the breathtaking city of Busan in South Korea. Now, I know what you're thinking: "Why Busan? Isn't Seoul the place to be?" Well, my friends, Busan is a hidden gem that deserves some love. So, get your backpack ready, because we're about to embark on an exciting weekend getaway!

First things first, let's talk about making new friends. Language barriers can be real hurdles, but fear not! The people of Busan are known for their kindness and hospitality. Even if you don't speak Korean, a warm smile and a friendly greeting can go a long way. Trust me, I've had countless conversations using pictures and gestures. Oh, and be sure to download the Kakao Talk app to stay connected!

Now that we've made some friends, it's time to explore. But before we dive in, let's get a high-level overview of the city. Busan Tower is a must-visit spot, standing tall at 120 meters. From its top deck, you'll be treated to a panoramic view of Busan, encompassing the beautiful Gwangan Bridge. It's the perfect way to get your bearings and avoid getting lost!

Alright, it's time to relax and enjoy the natural wonders of Busan. Haeundae Beach is nothing short of extraordinary. The sight of the vast ocean will leave you breathless. And if you're in the mood for more attractions, there's Oryukdo Island, APEC Naru Park, and even an aquarium nearby. Need a break? Cozy up in one of the city's charming coffee shops, like TwoSome Place or Caffeine Gurunaru. And don't forget to indulge in some well-deserved relaxation at SpaLand Centum City – the world's largest department store!

Now, let's talk about keeping an open mind. Busan's charm extends beyond its tourist spots. Take a stroll through the city's markets and experience the fusion of tradition and modernity. From delicious street food at the Busan International Film Festival (BIFF) square to underground shopping malls and bustling areas near Nampo station, there's something for everyone. And if you're a seafood lover, make sure to visit the Jagalchi Fish Market – a true seafood paradise!

To truly immerse yourself in Korean culture, a visit to Gyeongju is essential. This historic city, located just north of Busan, was once the capital of the Silla dynasty. Discover the grassy tombs of ancient royalty and marvel at the magnificent Bulguksa Temple – a UNESCO World Heritage site. Trust me, your inner history buff will thank you!

And last but certainly not least, let's not forget about the breathtaking cherry blossoms in Jinhae-gu. During the ten-day cherry blossom festival, you'll find yourself surrounded by 1.5 kilometers of blooming trees. Trust me when I say it's a scene straight out of a fairytale – a sight you won't want to miss.

Well, there you have it, folks! Our whirlwind tour of Busan comes to an end, but the memories and experiences will last a lifetime. I hope this episode has inspired you to pack your bags and explore this beautiful city. As always, don't forget to add me to your list of travel companions as I continue my own adventures.

Thank you for joining me on Continuous Improvement. Until next time, safe travels and remember: there's always room for continuous improvement in our lives!

釜山及其周邊地區非韓語使用者的生存秘訣

Aleumdaun! 這是韓國人用來形容 "可愛" 的詞語。他們經常用這個詞來形容釜山,慶州,以及晉海,在春天樱花盛开时的風景之美。

誰不喜歡旅行?韓國是一個尚未被充分探索的國家,大部分的遊客通常不會超出首爾的界限。我們每個人都有自己的旅行優先事項和偏好。對我來說,我喜歡即興的旅行,因為它讓我可以從日常的工作行程中走出來。把自己放在一個我不知道語言,甚至手機都沒有互聯網的陌生情況讓我覺得充滿刺激。這是我走出舒適區的大膽一步。

以下是一些非韓語使用者在釜山旅行的生存秘訣:

交朋友

在住宿公寓而不是酒店的時候,我遇到了一位精明的商人,一位才華橫溢的醫生,以及一位可愛的ajumma(韓語阿姨)。雖然我的韓語技能有限,與那些不會說英語的人進行口頭交流有些困難,但是請記住,人類互動的三分之二是非語言的。友好的笑容和熱情的問候是通用的。我用了一個下午的時間與他們通過圖片和手勢進行對話。韓國人有一種讓陌生人變成朋友的天分。他們不僅有禮貌,而且是我所遇到的最善良的人。如果你想保持聯系,那麼可以考慮下載Kakao Talk應用程序。

獲取高級概述

在開始探索之前,先獲取城市的概覽,避免迷路。釜山塔高120米,提供了絕佳的全景視角。從塔頂看到的壯麗的廣安橋和釜山的360度全景。

放鬆並享受

海雲台海灘非常特別,至少可以說。海洋的景色會讓你屏息。附近有一些景點,如鵝鹿島,APEC Naru公園和水族館。如果你累了,像TwoSome Place ,Tom n Tom ,或Caffeine Gurunaru 這樣的咖啡店都提供舒適的空間。另外,別忘了世界最大的百貨公司新世界中的SpaLand Centum City ,這是放鬆身心的完美去處。

保持開放的心態

釜山的魅力不僅體現在其旅遊景點上;即使是在街上的簡單行走也是吸引人的。從豬腸到鬆餅,市場上的美食展示了傳統與現代的獨特融合。對於美食街,你可以前往釜山國際影展(BIFF)的广场。如果你是购物狂,你一定会喜欢西面的地下购物中心和南浦站附近的繁忙地区。另外,对于海鲜爱好者来说,札嘎其海鲜市场是必须要去的地方。

了解文化

位於釜山北部的慶州,曾經是新羅王朝的首都直到一千年。它是一個遺產景點,那裡有古代皇族的草墓。在遊客的列表上,佛國山寺經常處於首位。進入這個世界遺產的入場費只需4,000韓元。

欣賞壯麗的風景

每年春天,位於釜山西部的晉海區會舉辦為期十天的樱花节。長1.5公里的花隧道是必看的。當一陣風吹來時,花瓣飄落,這是一種超現實而浪漫的場景。

所以,拿起你的護照,和我一起來釜山進行一場令人興奮的周末之旅吧!希望本文能激勵你探索韓國,沉醉在它的文化中。坦白說,我的身體可能已經返回了辦公室,但我靈魂依然在韓國。把我加到你的旅行伙伴名單中吧,我希望能發現更多美麗的地方,並和你分​​享。Kamsa-Hamnida,這是韓國人說表示衷心感謝你的方式。


Java: Variables are Always Passed by Copy

I am learning Java. One important concept to understand is whether function arguments are passed by copy or by reference.

Passing by copy means that when a variable is passed to a function, a copy of that variable is made. Passing by reference means that the code in the function operates on the original variable, not on a copy.

In Java, variables are always passed by copy. Let's explore this through three scenarios:

Case 1: Passing Primitives

void incrementValue(int inFunction) {
  inFunction++;
  System.out.println("In function: " + inFunction);
}

int original = 10;
System.out.println("Original before: " + original);
incrementValue(original);
System.out.println("Original after: " + original);

The result is:

Original before: 10
In function: 11
Original after: 10

The original value didn't change.

Case 2: Passing Primitives Wrapped in Objects

void incrementValue(int[] inFunction){
  inFunction[0]++;
  System.out.println("In function: " + inFunction[0]);
}

int[] arOriginal = {10, 20, 30};
System.out.println("Original before: " + arOriginal[0]);
incrementValue(arOriginal);
System.out.println("Original after: " + arOriginal[0]);

The result is:

Original before: 10
In function: 11
Original after: 11

The original value did change! This happens because complex object variables are references. A reference variable points to a location in memory. When a variable is passed to a function, a new reference is always created. Both references point to the original object or value.

int[] original = {10, 20, 30};

original[0] --> | 10 | <-- inFunction[0]
                | 20 |
                | 30 |

Both array elements point to the same memory location.

Case 3: Passing Strings

void changeString(String inFunction){
  inFunction = "New!";
  System.out.println("In function: " + inFunction);
}

String original = "Original!";
System.out.println("Original before: " + original);
changeString(original);
System.out.println("Original after: " + original);

The result is:

Original before: Original!
In function: New!
Original after: Original!

Remember, Strings are immutable. When passed to a function, a new String is created, leaving the original String unaltered.

Java: Variables are Always Passed by Copy

I am learning Java. One important concept to understand is whether function arguments are passed by copy or by reference.

Welcome to "Continuous Improvement," the podcast where we explore valuable concepts and strategies to help you enhance your skills and knowledge. I'm your host, Victor, and today we'll be diving into the intriguing world of function arguments in Java. Specifically, we'll explore the question of whether these arguments are passed by copy or reference. But before we get started, don't forget to hit that subscribe button so you never miss an episode. Now, let's jump right in.

So, one of the important things to understand when learning Java is how function arguments are handled. Are they simply a copy of the original variable or a reference to the actual variable? Well, in Java, variables are always passed by copy, and that's what we're here to discuss.

[Background Information]

Let's explore three different scenarios to demonstrate how function arguments behave in different contexts.

[Case 1: Passing Primitives]

First, let's consider passing primitives. In Java, when we pass a primitive variable to a function, a copy of that value is made. The original variable remains unaffected. Let me walk you through an example.

[Code Explanation]

We have a method called incrementValue that takes an integer argument. Inside the method, we increment this argument by one. Let's see what happens when we pass the original variable with a value of 10.

[Code Execution and Output Explanation]

As you can see from our execution, the original value remains unaffected. It remains at 10, even though we incremented the value inside the function. This is because the function received a copy of the variable, not the original variable itself.

[Transition]

Now, let's move on to our next scenario.

[Case 2: Passing Primitives Wrapped in Objects]

In this case, we'll consider passing primitives that are wrapped inside objects, like arrays. Unlike passing just primitives, passing primitives wrapped in objects involves passing a reference to the object. Let me explain further.

[Code Explanation]

We have a method called incrementValue that takes an integer array as an argument. Inside the method, we increment the value at the first index of the array by one. Let's see what happens when we pass the arOriginal array with a value of {10, 20, 30}.

[Code Execution and Output Explanation]

As you can observe, the original value did change this time! This is because the array is a complex object, and when we passed it as an argument, we actually passed a reference to the original object. Both references, the one inside the function and the one outside, pointed to the same memory location.

[Transition]

Lastly, let's discuss the behavior when passing Strings.

[Case 3: Passing Strings]

We all know that Strings in Java are immutable. So what happens when we pass a String as an argument to a function? Let's find out.

[Code Explanation]

We have a method called changeString that takes a String as an argument and assigns it a new value. Let's see what happens when we pass the original String with a value of "Original!"

[Code Execution and Output Explanation]

As you can see, even though we assigned a new value to the inFunction argument inside the method, the original String remained unaltered. This is because Strings in Java are immutable, and when passed as arguments, a new String object is created, leaving the original String unchanged.

[Closing Segment]

And there you have it! A closer look at function arguments in Java, where we've explored whether they are passed by copy or by reference. Remember, in Java, variables are always passed by copy, regardless of whether they are primitives or wrapped inside objects. It's important to understand these concepts to avoid any unexpected behavior in your code.

[Final Thoughts]

Thank you for tuning in to this episode of "Continuous Improvement." I hope you found this discussion on function arguments in Java useful for your programming journey. If you have any questions or would like us to cover specific topics in future episodes, feel free to reach out to us. Until next time, keep coding and continuously improving!

Java:變數總是以複製的方式傳遞

我正在學習Java。理解是否函數參數是通過複製還是引用傳遞的一個重要觀念。

複製傳遞意味著當一個變數被傳遞給函數時,會製作該變數的一個副本。引用傳遞則意味著函數中的程式碼運作在原始變數上,而非其副本上。

在Java中,變數始終會通過複製來傳遞。讓我們通過以下三種情況來探索這一點:

情況1:傳遞基本類型

void incrementValue(int inFunction) {
  inFunction++;
  System.out.println("In function: " + inFunction);
}

int original = 10;
System.out.println("Original before: " + original);
incrementValue(original);
System.out.println("Original after: " + original);

結果如下:

Original before: 10
In function: 11
Original after: 10

原始值並未變動。

情況2:將基本類型包裹在對象中傳遞

void incrementValue(int[] inFunction){
  inFunction[0]++;
  System.out.println("In function: " + inFunction[0]);
}

int[] arOriginal = {10, 20, 30};
System.out.println("Original before: " + arOriginal[0]);
incrementValue(arOriginal);
System.out.println("Original after: " + arOriginal[0]);

結果如下:

Original before: 10
In function: 11
Original after: 11

原始值有變動!這是因為複雜對象變數是引用。引用變數指向內存中的位置。當變數被傳遞到函數時,始終會創建新的引用。兩個引用都指向原始對象或值。

int[] original = {10, 20, 30};

original[0] --> | 10 | <-- inFunction[0]
                | 20 |
                | 30 |

兩個陣列元素都指向相同的內存位置。

情況3:傳遞字符串

void changeString(String inFunction){
  inFunction = "New!";
  System.out.println("In function: " + inFunction);
}

String original = "Original!";
System.out.println("Original before: " + original);
changeString(original);
System.out.println("Original after: " + original);

結果如下:

Original before: Original!
In function: New!
Original after: Original!

請記住,字符串是不變的。當傳遞給函數時,會創建新的字符串,使原始字符串保持不變。

3 Reasons to Love React

Recorded at the Hong Kong JavaScript and Node.js meetup on March 3, 2015:

Today, I want to discuss React, a JavaScript library for creating user interfaces. I've used it for several projects, and the more I work with it, the more I appreciate its features. I'll explain why I find React so compelling and why you should consider using it too.

As a software engineer, I understand the daily challenges developers face. Before using React, coding often felt uncomfortable, particularly when building user interfaces. There are numerous possible states, and testing all of them is impractical. You might encounter mutable DOM issues or unpredictable user inputs. Your UI might not behave as expected, or it might not scale well with large applications.

Programming is an art—specifically, the art of organizing complexity. ReactJS helps you manage this complexity when building UIs.

What Is React?

React serves as the 'view' in MVC (Model-View-Controller). Unlike full frameworks like MeteorJS, React focuses primarily on the UI. It is developed by Facebook and Instagram and is employed in their production environments. For example, the comment box you see on Facebook.com is a React component.

Why React?

I'll focus on three key points: React components, performance, and handling dynamic data.

1. React Components

In my previous role as a MeteorJS developer, I found traditional templating languages like Handlebars or Spacebars limiting. React, on the other hand, utilizes components instead of templates. This modular approach allows for more flexibility, reusability, and testability.

2. Performance

Thanks to the invention of the Virtual DOM, React offers impressive speed. Traditional approaches often require the entire page to re-render, even for minor changes. The Virtual DOM minimizes such expensive operations by updating only the changed parts of the DOM.

3. Managing Dynamic Data

State management is a significant challenge in UI development. React solves this problem by adopting a one-way data flow, which improves maintainability and simplifies debugging.

Closing Thoughts

In summary, React stands out for its simplicity and power. It enables the development of reusable, testable components. It offers excellent performance and effectively handles dynamic data.

That's all for now! Any questions?

Here are the slides: Slide Presentation

3 Reasons to Love React

Welcome back to another episode of Continuous Improvement! I'm your host, Victor, and today we have an exciting topic to discuss - React, a JavaScript library for creating user interfaces. I recently attended a meetup in Hong Kong where I heard a fantastic talk about React, and I want to share my insights with all of you.

But before we dive in, I would like to remind you to check out the blog post that inspired today's episode. You can find the link to it in the show notes. Make sure to give it a read for a more detailed understanding of React.

Now, let's get started. React serves as the 'view' in the MVC (Model-View-Controller) architecture. Developed by Facebook and Instagram, it's widely used in their production environments, including popular platforms like Facebook.com. So you know it's reliable and robust.

One of the primary reasons why React stands out is its use of components instead of traditional templates. As a former MeteorJS developer, I found templates limiting. But with React, you can build modular, reusable, and testable components that give you more flexibility in your UI development.

Another significant advantage of React is its performance. Thanks to the Virtual DOM, React offers impressive speed. Unlike traditional approaches where even small changes require the entire page to re-render, the Virtual DOM optimizes this process by updating only the parts of the DOM that have actually changed. This results in faster rendering and a smoother user experience.

Now, let's talk about managing dynamic data. UI development can be challenging, especially when it comes to state management. React solves this problem by adopting a one-way data flow. This means that data flows in a single direction, making it easier to track and manage. It improves maintainability and simplifies debugging, which is a game-changer when working on complex UIs.

In summary, React offers simplicity and power when it comes to building user interfaces. It allows you to create reusable, testable components, ensuring code reusability and reducing development time. Its impressive performance, thanks to the Virtual DOM, keeps your UI running smoothly. And the one-way data flow simplifies state management, making your code more maintainable and debugging easier.

That's all for today's episode of Continuous Improvement. I hope you found this discussion on React enlightening. If you have any questions or want to dive deeper into this topic, feel free to reach out to me on social media or leave a comment on the blog post.

Thanks for tuning in, and until next time, keep improving!

[End of episode]