<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>のなちす</title>
  <link>https://kuar.blog.shinobi.jp/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://kuar.blog.shinobi.jp/RSS/" />
  <description>HP→http://sora-blue.net/~kuar/index.html</description>
  <lastBuildDate>Sun, 07 Aug 2011 00:34:04 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>[C++]あたかもメンバの別名のように振る舞う</title>
    <description>
    <![CDATA[あまりこういうことには出会わないとは思うが稀にメンバの名前を変えたいとか振る舞い方を変えたいとかあったりする。<br />
例えばWindowsでのRECT構造体。<br />
struct RECT{<br />
　int left,top,right,bottom;<br />
};<br />
こいつをちょっと不便だから<br />
struct Rect{<br />
　int x,y,width,height;<br />
};<br />
にしたいと考える。<br />
このままRectを拡張してしまえばいいじゃないかと思う人は話はここまでである。<br />
<br />
しかしまあ、このまま拡張しても不便だから。特にRECTの参照渡しをする機会が多いのでその都度<br />
RECT rect = Rect.RECT();<br />
hoge(&rect);<br />
とするのも面倒なわけである。<br />
<br />
そのままダイレクトに引数に入れるために継承を行うとする。<br />
struct Rect:public RECT{<br />
<br />
};<br />
<br />
メンバをどうするかである。プロパティとしてはx,y,width,heightとして扱いたい。<br />
xとyに関しては少々不細工であってもleftとrightのポインタを持っておけばなんとかなりそうでもない。<br />
struct Rect:public RECT{<br />
　Rect():x(&left),y(&top){}<br />
　int* x,y;<br />
};<br />
widthやheightはそうはいかない。widthはright-left、heightはbottom-topという式になる。<br />
<br />
struct Rect:public RECT{<br />
　Rect():x(&left),y(&top){}<br />
　int width()const{return right-left;}<br />
　int width(int newWidth){return right = left + newWidth;}<br />
　int height()const{return bottom-top;}<br />
　int height(int newHeight){return bottom = top + newHeight;}<br />
　int* x,y;<br />
};<br />
<br />
形はどうであれこれでひとまずは、できたかのように思える。<br />
しかしもっと自然に振舞いたいと思うわけである。<br />
*rect.x = 1;<br />
rect.width(3);<br />
これを<br />
rect.x = 1;<br />
rect.width = 3;<br />
などど記述できればまさにメンバの名前を変えたように振る舞っているといえよう。<br /><a href="https://kuar.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/-c---%E3%81%82%E3%81%9F%E3%81%8B%E3%82%82%E3%83%A1%E3%83%B3%E3%83%90%E3%81%AE%E5%88%A5%E5%90%8D%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%86" target="_blank">実際に振る舞えるようにしてみる</a>]]>
    </description>
    <category>未選択</category>
    <link>https://kuar.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/-c---%E3%81%82%E3%81%9F%E3%81%8B%E3%82%82%E3%83%A1%E3%83%B3%E3%83%90%E3%81%AE%E5%88%A5%E5%90%8D%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%86</link>
    <pubDate>Sun, 07 Aug 2011 00:34:17 GMT</pubDate>
    <guid isPermaLink="false">kuar.blog.shinobi.jp://entry/428</guid>
  </item>
    <item>
    <title>NSTextViewのカーソル位置を取得する</title>
    <description>
    <![CDATA[なかなか見つからないカーソル位置の取得関数。こんな関数名で実装されてたらそらわからんわなー。<br />
NSTextFieldのカーソル位置も同じメソッドで取得することができる。<br />
このRectはカーソルのフレームであるため、原点が左下のCocoaでは、y軸をheightだけ引く処理が必要になるであろう。<br />
NSRect rect = [textView firstRectForCharacterRange:[textView selectedRange]];]]>
    </description>
    <category>未選択</category>
    <link>https://kuar.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/nstextview%E3%81%AE%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E4%BD%8D%E7%BD%AE%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B</link>
    <pubDate>Mon, 21 Feb 2011 00:45:50 GMT</pubDate>
    <guid isPermaLink="false">kuar.blog.shinobi.jp://entry/427</guid>
  </item>
    <item>
    <title>無題</title>
    <description>
    <![CDATA[Cocoaを参考に自作しているFrameWorkの描画についての高速化の覚え書き。<br />
まず前提として、Windowに対してViewが１枚貼られている。規定となるViewである。<br />
CocoaでいうNSWindowのcontentLayerに該当する。<br />
ちなみにこのViewは常にWindowsサイズと同じサイズになるようにWindowのサイズ変更が行われると、このViewのサイズも変更される。<br />
<br />
Viewについてはレイヤー構造となっており、Viewが配列を有しており、addSubViewするとpush_backされる。<br />
ViewはsuperViewへのポインタを格納している。無論subViewsも。因みにcontentLayerのsuperViewはNULL。<br />
上の階層へ行くには連結リストを利用し、下の階層へは配列でアクセスすることになる。<br />
<br />
描画はViewがもつdrawRect(Rect rect)で行う。Viewが持つdrawRect関数に関してはsubViewに対してdrawRect関数を呼ぶだけなので画像やテキストを描画する際にはViewを継承したImageViewやTextViewを利用する。<br />
<br />
引数のrectが描画する四角形である。再描画処理は重いので必要最低限の範囲で行う。<br />
例えばWindowサイズが800*600に対して再描画するViewが100*50だったなら、Viewの100*50だけ再描画する。<br />
<br />
半透明などが絡むと混色処理が必要になるので再描画はcontentLayerからdrawRect関数を呼び出す。<br />
また、contentLayerを持っているのはWindowなので実際には再描画はWindowに対して再描画するように命令を出す。<br />
<br />
実際に関数はこんな感じ<br />
<br />
<font color="blue">struct</font> Rect{<br />
　Rect()x(0),y(0),width(0),height(0){}<br />
　Rect(<font color="blue">int</font> _x,<font color="blue">int</font> _y ,<font color="blue">int</font> _width,<font color="blue">int</font> _height)x(_x),y(_y),width(_width),height(_height){}<br />
　<font color="blue">int</font> x,y,width,height;<br />
};<br />
<font color="blue">class</font> Window{<br />
<font color="blue">public</font>:<br />
　<font color="blue">virtual void</font> drawRect(Rect rect);<br />
<font color="blue">private</font>:<br />
　View* m_contentLayer;<br />
};<br />
<font color="blue">class</font> View{<br />
<font color="blue">public</font>:<br />
　View(Rect rect);<br />
　<font color="blue">virtual void</font> drawRect(Rect rect);<br />
　<font color="blue">virtual void</font> repaint();<br />
<font color="blue">private</font>:<br />
　Rect m_rect;<br />
　<font color="blue">std::vector</font><View*> m_subViews;<br />
};<br />
<br />
<font color="blue">void</font> Window::drawRect(Rect rect){<br />
　contentLayer->drawRect(rect);<br />
}<br />
<br />
<br />
<br />
<font color="blue">void</font> View::drawRect(Rect rect){<br />
　// ここに何かしら描画処理<br />
　<font color="blue">std::vector<View*>::iterator</font> it = m_subViews.begin();<br />
　<font color="blue">std::vector<View*>::iterator</font> end = m_subViews.end();<br />
　<font color="blue">for</font>(; it != end; ++it){<br />
　　 (*it)->drawRect(rect);<br />
　}<br />
}<br />
<br />
再描画関数に関しては自身のx,yからwidth,heightだけ再描画すればいいので<br />
<br />
<font color="blue">void</font> View::repaint(){<br />
　m_window->drawRect(m_frame);<br />
}<br />
<br />
となる。因みにcontentLayerはWindowへのポインタを持っており、addSubViewを呼び出すことにより、子にもwindowへのポインタが渡されるため、addSubViewされている全てのviewはwindowにアクセスできる。<br />
画像に関してはもしも再描画したいViewが半透明ではない場合、contentLayerから描画するのは無意味である。<br />
なぜなら混色が行われない以上、そのViewから下の階層のレイヤーしか見えないのだから。<br />
<br />
<font color="blue">void</font> Window::drawRect(Rect rect,View* view){<br />
　<font color="blue">if</font>(view == <font color="blue">NULL</font>){<br />
　　contentLayer->drawRect(rect);<br />
　}<font color="blue">else</font>{<br />
　　view->drawRect(rect);<br />
　}<br />
}<br />
<br />
この実装により、２００枚ImageViewを貼ったとしても見える部分しか描画しないので処理は画像を２〜３枚貼る程度に収めることができる。<br />
ただ、if文或いは三項条件演算子を通るコストはかかるが……。<br />
実際にはsuperViewが該当のviewの背面に写るであろうviewとは限らない。<br />
というと構造はsuperViewのsubViewsの中にviewそのものが格納されている。<br />
もしviewがsuperViewから見てsubViewsの[1]以上であれば、superViewとviewの間に他のviewが存在する。<br />
しかし、そのviewは再描画するべきviewと完全に重なっている保証はないため、完全に重なっているsuperViewに対して処理を行なっている。<br />
最も、superViewのsubViewにviewが100枚とかあるとsuperViewとviewの間のviewへ問い合わせる処理にしないと最適化にならないが、<br />
ここでは少量のviewしか扱わないことを前提としてこの実装にしている。<br />
<br />
<font color="blue">void</font> View::repaint(){<br />
　m_window->repaint(m_frame,<font color="blue">this</font>);<br />
}<br />
<br />
因みに不可視 or alphaが0なら描画の必要はないため<br />
<br />
<font color="blue">void</font> View::drawRect(Rect rect){<br />
　if(m_alpha != 0){<br />
　　//ここに何かしら描画処理<br />
　　<font color="blue">std::vector<View*>::iterator</font> it = m_subViews.begin();<br />
　　<font color="blue">std::vector<View*>::iterator</font> end = m_subViews.end();<br />
<br />
　　<font color="blue">for</font>(; it != end; ++it){<br />
　　　 (*it)->drawRect(rect);<br />
　　}<br />
　}<br />
}<br />
<br />
自身が見えないのであれば当然subViewも見えないわけである。<br />
見えるようにしたければ子の描画処理をifの外へ出してやるといい。ただ、不便なのは間違いない。<br />
<br />
では、半透明だった場合を考える。半透明であれば混色が必要となる。<br />
しかし半透明だから諦めてcontentLayerから描画するのは重すぎる。<br />
なので半透明か否かをsuperViewへ問い合せて不透明ならそこから描画、半透明ならさらにsuperViewへ問い合わせ…ということにする。<br />
連結リストなのでアクセスは遅いが描画をするよりかはマシだろう。<br />
View* view::getSuperOpaqueView(){<br />
　<font color="blue">return</font> (m_superView->getAlpha == 255) ? m_superView : m_superView->getSuperOpaqueView();<br />
}<br />
<font color="blue">void</font> View::repaint(){<br />
　<font color="blue">if</font>(m_alpha == 255){<br />
　　 m_window->drawRect(m_rect,<font color="blue">this</font>);<br />
　}<font color="blue">else</font>{<br />
　　 m_window->drawRect(m_rect,getSuperOpaqueView());<br />
　}<br />
}<br />
<br />
ここでは不透明の値が255と定義されているのもとする。モノによっては1.0とかだったりするので状況に合わせて値を変えてほしい。<br />
<br />
因みにこれは人によりけりであるが、addSubViewやsetAlpha、setVisible、setFrameなどViewを弄るような関数を利用する場合<br />
自動的にrepaintするか否かである。基本的には自動でrepaintしたほうが便利だがこれでは高速化は望めない。<br />
速さを気にする人なら明示的にrepaintを行うようにするといい。どっちもという人はwindowにisAutorepaintという関数をひとつ作って、局所的にするといい。<br />
<br />
<font color="blue">void</font> addSubView(View* view){<br />
　m_subViews.push_back(view);<br />
　<font color="blue">if</font>(m_window->isAutoRepaint()){<br />
　　repaint();<br />
　}<br />
}<br />
<br />
実際に使うときは<br />
m_window->setAutoRepaint(<font color="blue">false</font>);<br />
<font color="blue">for</font>(<font color="blue">int</font> i=0;i<100;++i){<br />
　addSubView(<font color="blue">new</font> View(Rect(0,0,100,100)));<br />
}<br />
m_window->setAutoRepaint(<font color="blue">true</font>);<br />
repaint();<br />
<br />
とするとわりと高速に動作するようになる。<br />
複数のWindowを扱う時を想定して、Windowのメンバ関数にしてある。<br />
全Windowおかまいなしにしたいなら広域変数でいいだろう。<br />
<br />
ここでは特に何も書いていないがdrawRect関数には本来ならば他にも複数の引数が絡むことになり、Windows32APIであれば、HDCもしくはHWNDが、DirectXであればLPDIRECT3D9、LPDIRECT3DDEVICE9などが入ることになるであろう。故にdrawRect関数そのものは直接呼び出すことはできないであろう。最も実装によっては可能と言えば可能だが難しいと私は思う。]]>
    </description>
    <category>未選択</category>
    <link>https://kuar.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E7%84%A1%E9%A1%8C_426</link>
    <pubDate>Tue, 04 Jan 2011 10:43:15 GMT</pubDate>
    <guid isPermaLink="false">kuar.blog.shinobi.jp://entry/426</guid>
  </item>
    <item>
    <title>無題</title>
    <description>
    <![CDATA[HPを更新しました。ツイッターの登場でますますブログとHPの影が薄いです。<br />
mixiも殆どサンシャイン牧場やって他人の日記見るしかやってない！<br />
ツイッターに殆ど書きたいことを書いてしまうのでこのブログもあまり意味をなしていない状況。<br />
とりあえずはプログラムで詰まったところを書いとくみたいな感じではあるがそれもツイッターに取られてしまっている。<br />
<br />
とりあえず今回はCALayerのcontentsについての記述。<br />
CALayerのcontentsはどうもすぐに内容をreleaseしてしまうのかあとからaddSublayerするとBusErrorに。<br />
<br />
layer.contents = (id)[image CGImage];<br />
<br />
じゃあretainすりゃいいじゃんって思って<br />
[[image CGImage] retain]<br />
こいつでもダメ。<br />
<br />
CGImageRefをretainする関数があったんだけどそれでもダメ。<br />
<br />
どうしたもんかなー。]]>
    </description>
    <category>未選択</category>
    <link>https://kuar.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E7%84%A1%E9%A1%8C_425</link>
    <pubDate>Thu, 23 Dec 2010 05:54:18 GMT</pubDate>
    <guid isPermaLink="false">kuar.blog.shinobi.jp://entry/425</guid>
  </item>
    <item>
    <title>[VC++6]スクリーンセーバーのデバッグ設定</title>
    <description>
    <![CDATA[プロジェクト設定<br />
・デバッグ<br />
　　実行ファイル:○○.exe->○○.scr<br />
　　プログラムの引数:/s<br />
<br />
・リンク<br />
　　出力ファイル名：○○.exe->○○.scr<br />
<br />
これでF5でスクリーンセーバーのデバッグができる。<br />
ただし結局はOutputDebugStringやprintfが使えないので難儀である。<br />
MessageBoxは使えるが使い物にはならないし必要ならファイル出力でもするか？]]>
    </description>
    <category>未選択</category>
    <link>https://kuar.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/-vc--6-%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%BB%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E8%A8%AD%E5%AE%9A</link>
    <pubDate>Sun, 11 Apr 2010 00:10:35 GMT</pubDate>
    <guid isPermaLink="false">kuar.blog.shinobi.jp://entry/424</guid>
  </item>
    <item>
    <title>NSSliderのドラッグ処理</title>
    <description>
    <![CDATA[mouseDragged:(NSEvent*)theEventを使うように感じるがそういったメソッドは存在しない。<br />
マウスドッグではなくIBActionを使う。<br />
<br />
-(void)awakeFromNib{ <br />
&#x0009;NSSlider* slider = [[NSSlider alloc] initWithFrame:NSMakeRect(0,0,100,100)];<br />
&#x0009;[slider setTarget:self];<br />
&#x0009;[slider setAction:@selector(sliderMove:)];<br />
}<br />
-(IBAction)sliderMove:(id)sender{<br />
&#x0009;NSLog(@"move!");<br />
}<br />
<br />
ドラッグされようがクリックされようが呼び出される。]]>
    </description>
    <category>未選択</category>
    <link>https://kuar.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/nsslider%E3%81%AE%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%E5%87%A6%E7%90%86</link>
    <pubDate>Thu, 18 Mar 2010 12:11:51 GMT</pubDate>
    <guid isPermaLink="false">kuar.blog.shinobi.jp://entry/423</guid>
  </item>
    <item>
    <title>NSImageでdpiを無視する方法</title>
    <description>
    <![CDATA[NSImageはdpiを判別できないことがあるらしい。<br />
その為画像が勝手に縮小されたりするのでその回避法。<br />
<a href="http://arms22.blog91.fc2.com/blog-entry-101.html" target="_blank">http://arms22.blog91.fc2.com/blog-entry-101.html</a><br />
<br />
これで画像もちゃんと表示されるし、[image size]で正確なサイズも返ってくる。]]>
    </description>
    <category>Objective-C</category>
    <link>https://kuar.blog.shinobi.jp/objective-c/nsimage%E3%81%A7dpi%E3%82%92%E7%84%A1%E8%A6%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95</link>
    <pubDate>Sat, 20 Feb 2010 00:33:04 GMT</pubDate>
    <guid isPermaLink="false">kuar.blog.shinobi.jp://entry/422</guid>
  </item>
    <item>
    <title>ぬるぽ</title>
    <description>
    <![CDATA[Objective-CにおいてNULL(nil)のオブジェクトを参照しても何も起こらない。<br />
JavaのようにNullpointerExceptionなどは出ずただ、何も起こらない。<br />
これがあるからOutletが外れてても気付けないんだ。<br />
<br />
]]>
    </description>
    <category>Objective-C</category>
    <link>https://kuar.blog.shinobi.jp/objective-c/%E3%81%AC%E3%82%8B%E3%81%BD_421</link>
    <pubDate>Sun, 14 Feb 2010 14:32:44 GMT</pubDate>
    <guid isPermaLink="false">kuar.blog.shinobi.jp://entry/421</guid>
  </item>
    <item>
    <title>AirMacのon、offを切り替える。</title>
    <description>
    <![CDATA[ググってもなかなか見つけられないのでメモ。<br />
<br />
UNIXコマンドでAirMacを切り替える。<br />
sudo networksetup -setairportpower off<br />
sudo networksetup -setairportpower on<br />
-getairportpowerで現在の状態を確認できます。<br />
<br />
MacOS 10.5.3以下くらいならsudo ifconfig en1 up/downでも切り替わりますがそれ以降あたりからdownはきくけどonできなくなるみたいです。<br />
ifconfigのほうはあくまでもUNIX用らしくApple純正はnetworksetupとかなんとか。<br />
<br />
airportコマンドで接続先を変更。<br />
airport -s・・接続先検索<br />
airport -I・・現在の状態<br />
<br />
scselectコマンドでネットワーク環境切り替え。<br />
scselect ・・・ネットワーク一覧。<br />
scselect Automatic・・・ネットワークを自動へ切り替え<br />
<br />
sudo ipconfig set en1 DHCP・・・DHCPリース。でもたまにIPアドレスがぶっ飛ぶので多分networksetup・・<br />
というよりこのあたり一体全部networksetupでできることは全部やったほうがいい気がする。<br />
-helpに大体書いてあるので大抵のことはできる。<br />
詳しくはgoogle先生にお願いしていください。<br />
<br />
これでUNIXコマンドでネットワーク全般を全て弄ることができる。]]>
    </description>
    <category>UNIXコマンド</category>
    <link>https://kuar.blog.shinobi.jp/unix%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/airmac%E3%81%AEon%E3%80%81off%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%E3%80%82</link>
    <pubDate>Wed, 10 Feb 2010 03:20:13 GMT</pubDate>
    <guid isPermaLink="false">kuar.blog.shinobi.jp://entry/420</guid>
  </item>
    <item>
    <title>よくある凡ミス</title>
    <description>
    <![CDATA[・nilとか返ってくると思ったらOutletが外れていた。<br />
　XCodeのコンソールからはわからないので侮れない。<br />
　でもnibみたらすぐわかる。<br />
・サブクラス化しているのに他のクラスではsuperClassでキャストしてしまってメソッドなどが無いと怒られる。<br />
　Ex: CustomView.m<br />
　　　@interface CustomView : NSView{}<br />
　(他のclassで)<br />
　　　IBOutlet NSView* view;<br />
・[<b><i>NSObject</i></b> alloc] init]してない。<br />
・autoreleaseで消えてしまってる。広域宣言だろうとautoreleaseが呼ばれて消えるのでautoreleaseが呼ばれるメソッドは要注意。[NSString stringByXXXXX]とか[NSArray arrayWithXXXX]とか。]]>
    </description>
    <category>Objective-C</category>
    <link>https://kuar.blog.shinobi.jp/objective-c/%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E5%87%A1%E3%83%9F%E3%82%B9</link>
    <pubDate>Tue, 09 Feb 2010 11:17:28 GMT</pubDate>
    <guid isPermaLink="false">kuar.blog.shinobi.jp://entry/419</guid>
  </item>

    </channel>
</rss>