人生初心者の雑記

すべてにおいてド素人な人がいろんなことを書くよ

ラグランジュの未定乗数法のわかりやすい考え方

ラグランジュ
f(x,y)
g(x,y)=0

勾配ベクトルはそれぞれ
A(∂f/∂x,∂f/∂y)
B(∂g/∂x,∂g/∂y)

点a,bのまわりの可動方向
C(∂g/∂y,∂g/∂x)

停留点はAとCが垂直に交わる<=>AとBが平行<=>A=λB

f:id:stalagmite:20170111235118p:plain

A=λBだけではgが全域なので、
上図のように、fとgの勾配が一致している部分(赤線)がxとyの関係式となってでてくる
ここでg=0条件を加えると

f:id:stalagmite:20170111235151p:plain

(黄線がg=0の可動域を表す)
fとgが定数倍の関係であるような場合を除いて、黄線と赤線は高々有限個の点で交わり、これが停留点となる
よって我々は次の式をとくことになる



g=0
A=λB

奇しくも、これは

H=f-λgについて
H∂/∂λ=0
H∂/∂x=0
H∂/∂y=0

を解くのと同じである

JavaScript覚書

便利なon関数

onresize

canvas

contextとは
getContext() メソッド - Canvasリファレンス - HTML5.JP

drawImageの使い方
drawImage() メソッド - Canvasリファレンス - HTML5.JP

drawImage(image, dx, dy)
drawImage(image, dx, dy, dw, dh)
drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)
これら3つはそれぞれ、image 引数として HTMLImageElement, HTMLCanvasElement, HTMLVideoElement のいずれかを取ることができます。

2017やることりすと

やること*
UE4でゲーム作る<-アセットをいろいろおいてステージぽいものをつくる<-ブループリントをつかってアクションゲームのひな型を作る

Siv3dで今作ってるゲーム作る

web上でレイマーチングがguiでできるものを作る<-web上で複数人がアクセスしてリアルタイムに反映させるものを作る[

レイトレ
レイトレ合宿4!?

RasPiでファイルサーバ
[RaspberryPI]hamachiを使ってVPN環境を構築 – o24ブログ


electronの使い方を学ぶ




習慣*
作曲する
絵を描く

DLLの作り方

暗黙リンク

fa11enprince.hatenablog.com

DLLは、vc++のプロジェクトのプロパティで設定できるライブラリディレクトリからは探されないので、DLLを使う実行ファイルのあるディレクトリにおくか、PATHを通さないといけない
https://msdn.microsoft.com/ja-jp/library/7d83bc18.aspx

暗黙リンクは、ビルド時に関数の中身のない.libファイルを実行ファイルに組み込み、実行時に.libに書いてある関数をDLLから探すという方法でDLLを使う。だから実行ファイルは使う関数のヘッダをインクルードしないといけないので、実行時に色んなDLLをとっかえひっかえ呼ぶということはできない(例えばDAWプラグインDLLは暗黙リンクではない)

明示リンク

作り方は暗黙リンクと一緒で、DLLを使う側で書くことは下の記事にかいてあるように、
プラグイン・プログラミング(2)



GetProcAddress()で装飾名で関数を指定するので、
明示リンクは装飾名がわからないといけない。装飾名の調べ方を今から書く

エクスポートした関数の修飾名の取得 VC++

DLLファイルをつくったプロジェクトファイルでプロジェクト->プロパティ->リンカー->デバッグ->マップファイルの作成(Yes)
にする

出来たmapファイルの最後のほうに

Exports

ordinal name

1 ?.....
2 ?.....


って感じで修飾名がかいてる。例えば、MyParser という名前空間の boost::variant parse_impl(std::string& ) という関数をエクスポートしたとき、nameはこんな感じになった

?parse_impl@MyParser@@YA?AV?$variant@NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$recursive_wrapper@U?$binary_operator@$0A@@MyParser@@@boost@@V?$recursive_wrapper@U?$binary_operator@$00@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$01@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$02@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$03@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$04@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$05@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$06@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$07@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$08@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$09@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$0L@@MyParser@@@4@V?$recursive_wrapper@Ufunction@MyParser@@@4@V?$recursive_wrapper@Uarrow@MyParser@@@4@V?$recursive_wrapper@Utuple@MyParser@@@4@Uvariable@MyParser@@Uvoid_@0detail@4@Uvoid_@0detail@4@@boost@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z (class boost::variant,class std::allocator >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper,class boost::recursive_wrapper,class boost::recursive_wrapper,struct MyParser::variable,struct boost::detail::variant::void_,struct boost::detail::variant::void_> __cdecl MyParser::parse_impl(class std::basic_string,class std::allocator > const &))

赤い部分が修飾名。boost使った関数だからめっちゃ長いけど、ふつうはこんな長くならんだろ
後半の括弧にかこまれているのは実際の型の名前。

だからDLLを使う側でGetProcAddress(ハンドル,?parse_impl@MyParser@@...(くっそ長い文字列))
ってかいても、一応通るがめんどい。修飾名を短くしたい。

修飾名を短くするにはDEFファイルってのをつかって自分で設定する

プロジェクトに右クリックで新規ファイルを追加
検索窓に
def
っていれると
Module Definition File
って出るから加える

こんな風に書きました。

LIBRARY "DLLTest"

EXPORTS
parse_impl @1

これでビルドすると、mapファイルがちょっと変わって

...
?parse_impl@MyParser@@...(くっそ長い文字列)
exported name: parse_impl

って感じになる。

参考
ぼやきごと/2013-08-27/VC++:C++名前空間内の関数をDLLエクスポートして使う - ルーチェ's Homepage

この記事では呼び出し規約を_stdcallにしてるけど、特に変えなくてもできた。


正常に起動できませんでした
DLLのパスが通ってない
DLLを呼ぶプログラムと DLLのプログラムのランタイムライブラリの種類が違う
MTD,MT,MTD DLLなど

Qt資料

右クリックメニュー、アクション
www.nicovideo.jp



QSignalMapper
www.off-soft.net

Qtにデバッガをいれる

www.slideshare.net

コードを書かずにQtデザイナでScrollAreaにVLayoutを適用させる

Qtデザイナでスクロールエリアにレイアウトを適用したい
f:id:stalagmite:20160604233325p:plain




スクロールエリアが空だとレイアウトのバーが暗く、適用できない。
f:id:stalagmite:20160604233328p:plain





なんか一個入れてあげると、設定できるようになる。(じゃあ最初から設定させてくれよ。やり方あるのかな?)
f:id:stalagmite:20160604233330p:plain







ScrollAreaのなかにQtデザイナの画面左側のオブジェクト群からGridLayoutを入れてしまうのは、余分なWidgetの入れ子ができてたぶんよろしくないし意図したとおりに動かねえ。
f:id:stalagmite:20160604234612p:plain






VLayoutを設定するとscrollAreaWidgetContentsの表示がそのレイアウトになる
f:id:stalagmite:20160604235031p:plain







このままだとプログラムから動的に要素を追加したときに変になるのでいろいろする


scrollAreaWidgetContentsを選択->LayoutのlayoutSpacingを変えてオブジェクト間のスペース調整する


動的に追加するオブジェクトは、追加するときにMinimumSizeを適切に設定する。そうしないとオブジェクトをたくさん追加していってスクロール範囲を超えそうになっても、ScrollAreaの中身のオブジェクトがつぶれるだけでScrollAreaは広くならない。よってWidgetを動的追加するときは、そのWidgetのMinimumサイズを設定し、Widgetがつぶれないようにする。
f:id:stalagmite:20160605000226p:plain
textsareaはScrollAreaの名前をQtDesigner上で変更したもの
ScrollAreaそのものはWidgetじゃなく、ScrollArea直下のWidget(二つ上の画像ではScrollAreaWidgetContents)がスクロールエリア内のWidgetをもつ。よって、
textsarea->widget()->layout()->addWidget()
のように書く。赤字を忘れないように

結果
f:id:stalagmite:20160605001210p:plain



child.uiの中身。



補足
ScrollArea内の要素を上詰めしたいときはVerticalSpacerを入れる。ScrollArea内の要素の追加や削除は、スペーサの手前に挿入、あるいはスペーサの手前のWidgetを削除というようにしなければならない。

f:id:stalagmite:20160605233549p:plain


削除の一例。ScrollAreaの末尾にスペーサを入れたので、ScrollAreaに最後に入れた要素を削除したいときはitemAtでスペーサの一個手前のオブジェクトを指定する。

void child::on_removebutton_clicked()
{
QVBoxLayout* layout = dynamic_cast<QVBoxLayout*>(this->ui->ScrollAreaContentWidget->widget()->layout());
if(layout->count()>=2){
//verticalspacerの手前に要素を入れなければならない。vlayoutの添え字は0から始まる。
QWidget* w = layout->itemAt(layout->count()-2)->widget();
delete w;
}
}