2018年7月24日 星期二

[Docker] Trouble shooting - Cannot mount the data volume


 Docker   Data volumes  

While mounting a host’s data volume to a container, I could not find the folder/files inside the folders.

$ ls /www/html
index.html

$ docker run -d -P -v "$(pwd)/www":/app:ro apache2-webserver /bin/bash
root@xxxx:/app# ls
root@xxxx:/app#


Here is my way to solve it,

1.  Change host’s absolute path to relative path

2.  Update the settings of VM to allow sharing certain drives or directories to Docker.

For example, in VM VirtualBox manager, find the Sharing folders and add the path.





After did so, it works like a charm.

$ ls /www/html
index.html

$ docker run -d -P -v "/www":/app:ro apache2-webserver /bin/bash
root@xxxx:/app# ls
html
root@xxxx:/app# ls html
index.html



Reference






2018年7月21日 星期六

[讀書心得] 談判心理學



(圖片來源:博客來)



雙贏是談判的根本目的

1.     創造性的談判結局是當你和對方離開談判桌時,你們都覺得自己贏了。
2.     多數情況下,人們想得到的東西並不一樣,問題在於,你是否能發現其中的不一樣之處。
3.     關心對方的利益,才能思考如何雙贏。


談判控制權

1.     不讓對方察覺到你的意圖,可以顧左右而言他、假裝漠不關心、或聲東擊西。
2.     讓自己的意見正確、有效地闡述:
ü   合理的安排討論議題的流程
ü   確認議題的重要性、分類。
3.     資訊收集整理及研究
ü   政治法律、環境因素
ü   談判對手
ü   話題的專業知識
ü   了解自身的實力:評估我方的優缺點,以在談判時做到避實就輕、截長補短
4.     方案的比較與選擇。
5.     模擬談判的過程和問題,事前準備。
6.     談判地點一般應以自己辦公室或熟悉之環境為主,利於查找資料或請示上級;
但若需觀察對手環境及讓對方可立即內部確認、或作為我方拖延藉口的特殊情況下,則可至對方單位談判。
而在初期談判或僵持不下階段,可考慮以中立地點來緩和雙方關係及緊張心理,促成雙方尋找共同點(均衡利益)。
7.     準備好最佳替代方案


制定談判策略

1.     思考對手的行動
ü   他為什麼這麼做?
ü   他想從我這邊獲得什麼?
ü   他是否有其他途徑獲得他想要的東西?
ü   換位思考
2.     步驟:
ü   了解影響談判的因素
ü   確定具體目標
ü   假設性方法:以非常規之方式探索問題及解決方式
ü   以定性或定量方式對假設進行深度分析
ü   形成具體的談判策略及計畫
3.     充分了解對方,尋找弱點和選擇我方談判人員
ü   主要決策者和談判者的職務、分工、年齡、家庭情況、經歷、專業、個性等資訊
ü   該交易對雙方的重要性程度:若該交易對某方越為重要,則該方談判實力會越弱
ü   企業商譽:商譽越高,其談判實力越強
4.     找出對手的關鍵人物
ü   直接詢問對方談判人員的許可權範圍,不須擔心會影響談判;若對方閃爍其詞時,要窮追不捨。
ü   或向對方亮出我方對談判者的許可權,提出對方應派出級別對等者參與談判。
ü   當對手為關鍵人物時,可運用尊重有禮貌之口吻,使其自尊心得到滿足。
5.     策略選擇
ü   我方處於優勢,且對該交易興趣不大:
務必使談判結果符合我方期望值的高點線。
ü   雙方旗鼓相當,且我方對該交易有興趣,但非必要:
只須讓談判結果接近我方期望值的中點線即可。
ü   我方處於劣勢,且對該交易興趣濃厚:
需做較多讓步,以不低於或略低於我方期望值的低點線為目標。

談判議程

1.     確認對手與我方談判人員的地位相同或更高,若與沒有實權或決策權的人談判,他們目的在於逼你讓步。
2.     我方絕不能退讓的條件若出現在議程上,需事先刪除。
3.     擬定假設過程想像→團隊模擬→完善方案


談判技巧

1.     開場白
ü   初次見面宜先握手致意,後做介紹; 可由主持第三者或自我介紹,須說明姓名、身分及單位。 若你介紹他人,則需說明與該人員之關係,以便讓對方了解。
ü   藉由寒暄非業務性話題來確認對手的情況和實力。 例如不經意地詢問對方搭機入住飯店後的行程詢問是否有拜訪其他客戶,來獲取對手的狀態和情報。 若對手不善於寒暄且直接切入談判話題,則可判斷其為談判生手,來確認後續的談判方式。
多數情況下,人們想得到的東西並不一樣,問題在於,你是否能發現其中的不一樣之處。
2.     開始談判的幾種方式
ü   提出一個要求作為先決條件
好處為當對方表示認可時,你就獲得了某種心理優勢並減少了後面的談判阻力。
ü   讓對方首先做出提議
當判斷出對方實力堅強且能言善道時,讓對手先做出提議可避免我方做出錯誤的決定和分析,爭取時間思考對方提議是否和我方有無共識。 可透過以下方式引導對方先發言:
保持沉默、或說「能否先談談你們的想法」。
ü   繼對方提議後,提出自己的高要求
一開始提出極端要求,比起一開始提出緩和要求多了以下優點:
使隨後的要求顯得合理傳達主要重點和有更多時間觀察對手的反應。
ü   用容易的事情來逐漸帶出主要要求
藉由先產生友好氣氛,來讓對方更容易接受後續的要求
ü   背水一戰
「這是我的第一個也是最後一個提議」來強調提議及不可更改性。
例如,「除非你們的訂單量每個月增加到一萬筆以上,我才能給你們維持上次合約的折扣」。
但使用此策略必須確認這個提議是公平和無可非議的,否則可能使談判陷入僵局或破裂。

3.     過程中打造和諧的談判氛圍
ü   以誠取信
ü   場外培養感情(邀約晚餐等方式)
ü   對手生氣時,並非解決問題的好時機,這時最好的辦法是聆聽對方,不要貿然反擊
4.     掌握談判主動權
ü   強制設定前提條件
ü   免談條款:使用於在買/賣方實力較強的情況下,避免反覆談判某些固定條款。 但反過來,當我方實力較強的情況下,則可做為削弱對手談判的實力和可能性。
ü   操作議程:藉由操作議題的先後順序選擇性或迴避討論,或刻意安排不利對手的談判時間和地點。
5.     引導策略
ü   黑臉白臉
事先演練,例如上演嚴厲老闆不經意指責業務所給予的折扣、聯合其他廠商給予錯誤的資訊
ü   高開低就
ü   吹毛求疵
一再挑剔及否定對方之產品服務或報價,迫使對方讓步
ü   薄利多銷
為求進場,先做出讓步,以期在其他案子獲得主導權。
6.     踩住自己的底線
ü   談判開始前,確認自己的利益底線
ü   將它寫到信封袋,當你感覺快到此防線時,先中斷談判,打開信封袋重新評估整個局勢
7.     讓步的技巧
ü   讓步是正常的,如果沒有讓步就不是談判了,重點在於怎麼讓得漂亮
ü   讓步過早,對手會得寸進尺
ü   讓步過晚,對於刺激或影響談判結果的成效不大
ü   如果是最後的讓步,必須態度堅定,讓對手清楚知道
8.     善用沉默
ü   不必急於回覆對手之問題,或裝傻讓對方重複或解釋該問題,以獲取更多情報
9.     把握成交的跡象
當得知對手有期限的壓力或是已進行內部流程,都是成交機率大增的跡象。
10.  提出最後通牒
ü   必須言而有信,讓對方相信是真的最後一次;否則後續再提出會無法產生效果,造成被動局面
ü   最好由位階較高者提出,較易取信於人
ü   執行前慎重考慮並與上級討論此一策略,因其易讓對方產生敵意,或甚至放棄談判
ü   根據要強硬,內容要有彈性
例如在系統導入專案,甲方可提:「因為去年我們只編這個預算,無法再給你們更高的價錢了,但是我們願意減少你們顧問飛過來開會的頻率」

談判失敗後,不要關上大門

1.     立即啟用你的備案或是延後該案
2.     並不意味一切努力都白費,感謝對方並告知希望未來能有合作的機會。畢竟地球是圓的,良好的關係有助於下個案子或重啟談判。
3.     對方拒絕提議,可能是暫時或刻意安排,不必因此而影響自己的情緒。 當對方過一陣子來電關心或希望重新對話時,表示他們並問放棄,可讓我方增加重啟談判的實力。

報價

1.     低價主義
ü   提出一個合理的價格,並公開聲明無二價
ü   留下自信堅持原則的印象
ü   適用於重複性高的談判活動開拓新市場及客戶
2.     高價主義
ü   喊價高於對手之預測
ü   若堅持到底,往往可得到比預期更好之談判結果
ü   缺點為使談判時間拉長,增加談判成本及降低談判效率。
ü   適用一次性報價、壟斷性供需,或期限較寬鬆之案子
3.     並不意味依切努力都白費,感謝對方並告知希望未來能有合作的機會。畢竟地球是圓的,良好的關係有助於下個案子或重啟談判。
4.     對方拒絕提議,可能是暫時或刻意安排,不必因此而影響自己的情緒。 當對方過一陣子來電關心或希望重新對話時,表示他們並問放棄,可讓我方增加重啟談判的實力。



合約(合同)

1.     明確定義雙方簽約當事人的資格,一般為董事長或總經理。
2.     除了主要條款,也需明訂雙方各自應盡之權利及義務,
3.     履行合約的爭議
當客觀、主觀方面發生變化,雙方應再次談判,實事求是的面對問題並確認新協定。 若談判失敗,則依爭議解決條款來處理。



2018年7月11日 星期三

[Entity Framework 6] Code First (5) - Relations


 Entity Framework   Code first    Relations  


Introduction


How to design code-first models for these relations

1.  One-to-one
2.  One-to-many
3.  Many-to-many



Environment


Entity Framework 6.2.0



Implement


Let’s see the final result as following,



Suppliers(供應商) 1 <-> 1 SupplierInCharges(供應商負責人)
Suppliers(供應商) 1 <-> 0..* Factorys(工廠)
Suppliers(供應商) * <-> * Customers(客戶)



1.Data Annotation Attribute


One-to-one

[Table("Suppliers")]
public class Supplier
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        #region One-to-one
        public virtual SupplierInCharge InCharge { get; set; }
        #endregion
}

[Table("SupplierInCharges")]
public class SupplierInCharge
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [ForeignKey("Supplier")]
        public int Id { get; set; }

        #region One-to-one
        public virtual Supplier Supplier { get; set; }
        #endregion
}



Notice that both the values of the primary keys in Suppliers and SupplierInCharges will be the same when inserting an object:Supplier.



One-to-many

[Table("Suppliers")]
public class Supplier
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        #region One-to-many
        public virtual ICollection<Factory> Factorys { get; set; }
        #endregion
}

[Table("Factorys")]
public class Factory
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required]
        public int SupplierId { get; set; }

        #region Many-to-one
        [ForeignKey("SupplierId")]
        public virtual Supplier Supplier { get; set; }
        #endregion
}



Many-to-many

[Table("Suppliers")]
public class Supplier
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        #region Many-to-many
        public virtual ICollection<Customer> Customers { get; set; }
        #endregion
}

[Table("Customers")]
public class Customer
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        #region Many-to-many
        public virtual ICollection<Supplier> Suppliers { get; set; }
        #endregion
}




2.Fluent API


We will replace Data Annotation with Fluent API, so first we remove all data annotations on the models.

Models

[Table("Suppliers")]
public class Supplier
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        #region One-to-one
        public virtual SupplierInCharge InCharge { get; set; }
        #endregion

        #region One-to-many
        public virtual ICollection<Factory> Factorys { get; set; }
        #endregion

        #region Many-to-many
        public virtual ICollection<Customer> Customers { get; set; }
        #endregion
}

[Table("SupplierInCharges")]
public class SupplierInCharge
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }

        #region One-to-one
        public virtual Supplier Supplier { get; set; }
        #endregion
}

[Table("Factorys")]
public class Factory
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required]
        public int SupplierId { get; set; }

        #region Many-to-one
        public virtual Supplier Supplier { get; set; }
        #endregion
}

[Table("Customers")]
public class Customer
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [StringLength(100)]
        public string Name { get; set; }

        [StringLength(200)]
        public string Address { get; set; }

        #region Many-to-many
        public virtual ICollection<Supplier> Suppliers { get; set; }
        #endregion
}





DbContext

public class AppDbContext : System.Data.Entity.DbContext
    {
        public AppDbContext()
            : base("name=AppDbContext")
        {

        }

        public DbSet<Supplier> Suppliers { get; set; }
        public DbSet<Factory> Factorys { get; set; }
        public DbSet<SupplierInCharge> SupplierInCharges { get; set; }
        public DbSet<Customer> Customers { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            #region Relations

            //One-to-one
            modelBuilder.Entity<Supplier>().HasRequired(m => m.InCharge).WithRequiredPrincipal(m => m.Supplier);

            //One-to-many
            modelBuilder.Entity<Supplier>().HasMany(m => m.Factorys).WithRequired(m => m.Supplier);

            //Many-to-many
            modelBuilder.Entity<Supplier>()
                .HasMany<Customer>(s => s.Customers)
                .WithMany(c => c.Suppliers)
                .Map(cs =>
                {
                    cs.MapLeftKey("SupplierId");
                    cs.MapRightKey("CustomerId");
                    cs.ToTable("SupplierCustomers");
                });

            #endregion

            #region Cascade setting
            modelBuilder.Entity<Supplier>().HasRequired(i => i.InCharge)
                .WithRequiredPrincipal(i => i.Supplier).WillCascadeOnDelete(true);
            #endregion
        }
}


Notice that we specified the column name on SupplierCustomers, so the final table will be like this,



Reference