MATLABの無名関数で分岐処理
MATLABでmap処理したいときに無名関数で分岐処理したいなと思ったら三項演算子もないしif文も使えないしどうすればいいのか調べてたらどうやらfeval使えばいいみたいなので使い方を忘備録として書く。
どうやらMATLABの無名関数は副作用のない純粋関数として設計されているらしい。
% 奇数の場合0を返し偶数の場合2倍にして返す関数 f = (@(num) ... feval((@ (list, index) list{index}), ... {0, num*2}, ... ( (mod(num, 2)==1)*1 + (mod(num, 2)==0)*2 ))); % arrayfunで配列の要素にfを適用させる result = arrayfun(f, 1:100);
(mod(num, 2)==1)*1 + (mod(num, 2)==0)*2
この奇数の場合1を返し偶数の場合1を返す式をindexとして{0, num*2}
のcell配列に添え字としてアクセスしている。
参考
constexprにおけるused before its definition
C++のconstexprで少し詰まったので忘備録として書く。
// mylib.h constexpr int square(int x);
// mylib.cpp #include "mylib.h" constexpr int square(int x){ return x*x; }
// main.cpp #include "mylib.h" int main(){ constexpr int result = square(5); static_assert(result == 25, "error"); return 0; }
上記のC++によくあるようなファイル構成のものをGCC5.3.0で-std=c++11オプションをつけてコンパイルしようとすると‘constexpr int square(int)’ used before its definitionというエラーが吐かれる。原因は以下に記述する。
N2235の4.1より
A constant expression function must be defined before its first use.
// N2235にあるサンプルコード struct S { constexpr int twice(); constexpr int t(); private: static constexpr int val; // constexpr variable }; constexpr int S::val = 7; constexpr int S::twice() { return val + val; } constexpr S s = { }; int x1 = s.twice(); // ok int x2 = s.t(); // error: S::t() not defined texpr int ff(); // ok constexpr int gg(); // ok int x3 = ff(); // error: ff() not defined constexpr int ff() { return 1; } // too late constexpr int gg() { return 2; } int x4 = gg(); // ok
原因は分かったがどんなファイル構成にすればいいのかイマイチ分からない。 誰か教えてほしい。
include "mylib.h"
ではなくinclude "mylib.cpp"
にするとか(?)
参考
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf
オブジェクト指向を学ぶ前にイデア論を学ぼう!(?)
イデア論とオブジェクト指向ってすごい似てるなぁと思い色々調べてみると同じようなことを考えている記事がたくさん出てきた。 考えることは皆同じなんだなぁ。
オブジェクト指向の世界(10):プラトン編−イデア論とクラス/インスタンス - ITmedia エンタープライズ
なぜここまで似ているのか少し考えてみるとプラトンという人間が世界を説明するイデア論という理論を提唱したようにプログラミングというある意味で世界を記述するものの中でアラン・ケイという人間がオブジェクト指向という考えを提唱するのは必然的なものなのではなかったのではないか。 つまり両者の本質は同じであるという説明で自己解決した次第です。
プログラミングパラダイムを学ぶ上で実は哲学を学ぶことは非常に有用ではないかという一つの考えが浮かんだ。 まあ日本では大学が文系と理系で区別されているという背景があり多方面に学ぶことがなかなか難しいのと本当に学んだところで直接結びつくとは限らないと思うが。
sslhを用いてsshとOpenVPNを443portで待ち受ける
sslh でport443 を有効活用して、sshもhttpsも同時に待ち受けする。
この記事を見てsslhはopenvpnも対応しているらしいので試してみることにした。
環境はHyper-V上のdebian 8.6 ip:192.168.10.2
OpenVPN設定
sudo apt-get install openvpn cd /usr/share/easy-rsa/ # 各証明書生成 . ./vars ./clean-all ./build-ca ./build-key-server server ./build-key client ./build-dh # サーバに必要な証明書を配置する cp keys/ca.crt /etc/openvpn/ cp keys/server.crt /etc/openvpn/ cp keys/server.key /etc/openvpn/ cp keys/dh2048.pem /etc/openvpn/ # /etc/share/easy-rsa/keys/ # 上記のディレクトリにクライアントに必要な各証明書ca.crt client.crt client.keyがあるのでクライアントに安全な方法で移す
openvpnサーバの設定ファイル(/etc/openvpn/server.conf)を以下に記述する。
port 1194 proto tcp dev tun ca /etc/openvpn/ca.crt cert /etc/openvpn/server.crt key /etc/openvpn/server.key dh /etc/openvpn/dh2048.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo persist-key persist-tun status openvpn-status.log verb 3
OpenVPN起動
sudo systemctl start openvpn.service
sslh設定
sudo apt-get install sslh
sslhの設定ファイル(/etc/default/sslh)を以下に記述する。
RUN=yes DAEMON=/usr/sbin/sslh DAEMON_OPTS="--user sslh --listen 192.168.10.2:443 --ssh 127.0.0.1:22 --openvpn 127.0.0.1:1194 --pidfile /var/run/sslh/sslh.pid"
sslh起動
sudo systemctl start sslh.service
まとめ
クライアント側でssh, openvpnを試したが両方無事接続することを確認した。 vpnを使用する際のsslhのレイテンシがどの程度なのかまだ検討してないので分からないが概ね問題無いのではないのかと思う。 443portは本当に貴重なので今後もsslhは活用していきたいと思う。
参考
Reveal.jsのブラウザバックの挙動について
Reveal.jsは非常に好きなPresentation Frameworkなのだがブラウザバックした時に前のスライドページに戻る挙動があまり好きではなかった。 できれば前のページに戻る挙動にしたい。調べてみたところ非常に簡単にできたので忘備録として書く。
Reveal.initialize({ // history : true, を以下に書き換える history: false, });
PowerShellでexeからicon抽出
サクッと.NETを使うときはPowerShellが非常に便利なのでexeファイルからiconを抽出するスクリプトを書いてみる
$icon = [System.Drawing.Icon]::ExtractAssociatedIcon("C:\Program Files\hoge\fuga.exe") $icon.ToBitmap().Save((Join-Path $env:UserProfile\Desktop "icon.bmp")) # 画像のフォーマットを指定したいときは以下のようにする # $icon.ToBitmap().Save((Join-Path $env:UserProfile\Desktop "icon.png"), [System.Drawing.Imaging.ImageFormat]::Png) $icon.Dispose() # リソースの開放
参考
Raspberry Piの画面をMonsterX U3.0Rでキャプチャ
Raspberry Piの画面をMonsterX U3.0Rでキャプチャしようとした時に少しハマったので忘備録として書く
使用するもの
どうやらHDMIの出力の設定をキャプチャに合わせないといけなかったらしく/boot/config.txtを以下のように書き換える
#hdmi_group=1 #hdmi_mode=1 # コメントを外して以下のようにする hdmi_group=2 hdmi_mode=82
参考
https://www.raspberrypi.org/documentation/configuration/config-txt.md
ちなみにUSBがおかしいのではないかと疑いUSB 増設ボード買ってしまったのでもったいないことをしてしまい少し悲しい