ASP.NET MVC + EF CodeFirstでリレーションのあるテーブルを更新する

投稿者: | 2014年9月21日

どういうわけか、ASP.NET MVCで開発するようになった訳ですが、はまったことをmemo
そもそも、まだ使い始めて1週間ぐらいなので、全然意味分からないままやってます。
なので、そういう前提で。

画像入れればわかりやすいけど、とりあえずmemoレベルで

「商品テーブル」と「商品価格テーブル」があって、One Manyのリレーションシップを作る
既存のアプリからの移行で、既存のDBはそれぞれ商品ID(主キー)、商品名と、
商品価格ID(主キー)、商品ID(外部キー)、販社ID、仕入価格がある。

その状態で、ASP.NET MVCのUpdateModelを使い、一度に両方のテーブルを更新しようとすると失敗する。
いろいろ調べたけど、解決策が見つからず、UpdateModelを使わずにちまちまフィールドごとに代入すると
問題無く動く。(結局のところ、商品価格テーブルの主キーが重複するとかそういう感じ)

で、そもそもテーブルの構造がいまいちじゃないかと思い、商品価格テーブルの方の主キーを商品IDと販社IDの
複合キーにしてみた。

そうすると、UpdateModelで問題無く更新できる。

コントローラ

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Index(Test01.Models.Product model)
        {
            var db = new Test01.Models.MyContext();

            var product = db.Products.Find(model.ProductID);
            UpdateModel(product);

            db.SaveChanges();

            return RedirectToAction("Index", new { id = model.ProductID });
        }

モデル

    public class Price
    {
        [Key]
        [Column(Order = 0)]
        public int ProductID { get; set; }
        [Key]
        [Column(Order = 1)]
        public int SupplierID { get; set; }
        public decimal ProductPrice { get; set; }
  
        public virtual Product Product { get; set; }
    }

    public class Product
    {
        [Key]
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public virtual IList<Price> Prices { get; set; }
    }

FreeBSDで pf で NATを使って jailを運用する

投稿者: | 2014年5月28日

pkg/portsの依存関係が多いときとかにjail使ったりするのでmemo

そこでpfを使ってNATを構築してみました。jailをプライベートIPで外へ出ていくパケットをNATでグローバルIPに変換してやろうという考え方です。

いろいろ試行錯誤してみましたが、結論からいうともう1つIFを作るのが手っ取り早いようです。とりあえずlo1を作ります。

引用元: FreeBSDで pf で NATを使って jailを運用するメモ | 元祖ワシ的日記 4.0.

RedmineをSAML認証に対応させる

投稿者: | 2014年5月13日

RedmineをSAML認証に対応させ、SSO出来るようにするmemo

OpenAM 11と連携させた時の設定例です。
Redmineは2.0.0以上である必要があり、正常に動作していることが前提

Ruby とか Rails とか全然わかってないので、とりあえず動いたって言うレベル

  1. GitHubから、以下のプラグインをダウンロードし、pluginsディレクトリに展開します。
    chrodriguez/redmine_omniauth_saml · GitHub.
  2. bundle installを実行し、依存関係を解決します。
  3. Redmineのルートディレクトリで、以下のコマンドを実行
    setenv RAILS_ENV production
    rake redmine:plugins
  4. 展開した中にある sample-saml-initializers.rb を Redmineのルートディレクトリにある
    config/initializers へ saml.rb としてコピー
  5. saml.rb を編集
  6. Redmineのインスタンスを再起動
  7. Redmineの管理 → プラグイン → Redmine Omniauth SAML plugin で必要に応じて設定する

saml.rbは以下の感じ

RedmineSAML = HashWithIndifferentAccess.new(
	:assertion_consumer_service_url	=> "http://redmine.example.local:9000/auth/saml/callback",
	:issuer							=> "http://redmine.example.local:9000/",
	:idp_sso_target_url				=> "http://openam.example.local:8080/OpenAM-11.0.0/SSORedirect/metaAlias/idp",
	:idp_cert_fingerprint			=> "DE:........:33", # SSL SHA-1 fingerprint
	:name_identifier_format			=> "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",
	:attribute_mapping				=> {
		:login		=> 'extra.raw_info.EmailAddress',
		:firstname	=> 'extra.raw_info.givenname',
		:lastname	=> 'extra.raw_info.sn',
		:mail		=> 'extra.raw_info.EmailAddress'
	}
)

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :saml, RedmineSAML
end