2016年6月25日土曜日

macbook pro retina mid 2012 SSD 交換

macbook pro retina display MID 2012 モデルのSSD 256Gで使ってましたが、さすがにディスク容量が足りなくて、交換する事にしました。

mSATA 512G と ebay から macbook pro 用の mSATA Adapter の組み合わせです。
後に判明したのは、星型ドライバーが足りないという事で
macbook pro retina display MID 2012 をバラすのに必要な星形ドライバ
それと、SSD を外すのに必要な星形ドライバ を買いました。

交換し終えた後ですが、こんな感じ。






Timecapsule を持っていたので、楽観視してましたが、付け替えた SSD 512G を "Case Sensitive FS" でフォーマットしたら、ハマりました。
Case Sensitve FS とは、大文字小文字を区別するファイル・システムの事なんですが、こいつを選択すると、Timemachine が見えなくなります。この状況が理解できなくて、SSD 256G に戻したら、このSSDが交換作業で飛んじゃって、元のデータがどこにも無い状態で、焦りまくり。
なんとか、新しく mac os x をインストールして、ディスク・ユーティリティのFast AID で Timemachine を復元して、必要なファイルだけを Timemachine に入って取り出す事に成功しました。Timemachine からの復元は失敗する状況です。
Adobe Creative Cloud Photographer を契約しているので、Creative Cloud をインストールしようとしたところ、「Case Sensitive FS はサポートしていません」と怒られました。調べてみると、Case Sensitive FS をサポートしているアプリケーションは少ないとの事。
泣きながら、普通のファイル・システムで SSD 512G を初期化し直したら、なんて事もなく Timemachine から前回使用していた環境を復元できるじゃないですか!!!!!

いや、もう参りました。
という事で、2万円かけずに 256G から 512G の環境に移行する事ができました。
ディスク容量があるって、幸せです。

2016年6月16日木曜日

固定小数点クラス

ずっと昔64ビット長の固定小数点クラスがほしくて、書いたやつ。 今なら、8ビット長の固定小数点クラスなんですかねー。
#pragma once
/*!
 @file fixed_float.hpp
 @brief 固定精度浮動小数点クラス・ヘッダ
*/

#include <boost/assert.hpp>
#include <boost/operators.hpp>
#include <limits>


//! 64ビット長固定精度浮動小数点クラス
class fixed64 :
 private boost::addable<fixed64>,
 private boost::subtractable<fixed64>,
 private boost::multipliable<fixed64>,
 private boost::dividable<fixed64>,
 private boost::equivalent<fixed64>,
 private boost::partially_ordered<fixed64>
{
public:
 static const int exponent_ = 16; //!< 指数部長
private:
 int64_t value_; //!< 値
public:
 //! コンストラクタ
 inline fixed64() : value_() {}
 //! コンストラクタ
 inline explicit fixed64( 
  int64_t value //!< [in] 値
 ) : value_(value << exponent_) {
  BOOST_ASSERT( value <= (std::numeric_limits<int64_t>::max() >> exponent_) );
  BOOST_ASSERT( (std::numeric_limits<int64_t>::min() >> exponent_) <= value );
 }
 //! コンストラクタ
 inline explicit fixed64( 
  double value //!< [in] 値
// ) : value_(static_cast<int64_t>(value * (1LU << exponent_))) {
 ) : value_(static_cast<int64_t>(value * pow(2.0,exponent_))) { 
  //BOOST_ASSERT( value <= (static_cast<double>(std::numeric_limits<int64_t>::max() >> exponent_) );
  //BOOST_ASSERT( (static_cast<double>(std::numeric_limits<int64_t>::min()) >> exponent_) <= value );
 }
 //! コピーコンストラクタ
 inline fixed64( 
  const fixed64& value //!< [in] 値
 ) : value_(value.value_) {}

 //! オペレータ +=
 inline fixed64& operator += (const fixed64& rhs) {
  value_ += rhs.value_;
  return *this;
 }
 //! オペレータ -=
 inline fixed64& operator -= (const fixed64& rhs) {
  value_ -= rhs.value_;
  return *this;
 }

 //! オペレータ *=
 inline fixed64& operator *= (const fixed64& rhs) {
  value_ = static_cast<int64_t>( 
   (
    (
     ((static_cast<int64_t>(value_)) * (static_cast<int64_t>(rhs.value_)))
     // 切り上げを行う
     //& pow( 2.0, exponent_ - 1 )
    )
    >> exponent_
   )
  );
  return *this;
 }
 //! オペレータ /=
 inline fixed64& operator /= (const fixed64& rhs) {
  value_ = static_cast<int64_t>(
   (static_cast<int64_t>(value_) << exponent_) / static_cast<int64_t>(rhs.value_)
  );
  return *this;
 }
 //! オペレータ =
 inline fixed64& operator = (const fixed64& rhs) { value_ = rhs.value_; return *this; }
 //! オペレータ ==
 inline bool operator == (const fixed64& rhs) const { return value_ == rhs.value_; }
 //! オペレータ <
 inline bool operator < (const fixed64& rhs) const { return value_ < rhs.value_; }

 inline double get(){
  return static_cast<double>(value_ / pow(2.0, exponent_));
 }

 inline operator double() const 
  { 
    //return double(value_ * (1 >> exponent_)) ; 
  return double(value_ / pow(2.0, exponent_));
  //return double(value_ * (static_cast<int64_t>(1) >> exponent_)) ;
  } 
 //! オペレータ =
 inline fixed64& operator = (const double& rhs) {
  value_ = static_cast<int64_t>(rhs * pow(2.0, exponent_));
  return *this; 
 }
};