たこ焼き用の鉄板を買ってシーズニングした
目次
はじめに
どうも,かわつあんです. 今日は日常の当たり障りのない日記を,Quiitaリスペクトなフォーマットのこのブログで書いちゃおうと思います.
タイトルからもわかりますが,私,鉄製のたこ焼き機を買いました. そのことについて簡単に書こうと思います.
鉄製たこ焼き機と私
実は最近,大学の先生と先輩とたこ焼きパーティをした時,初めて鉄製のたこ焼き機で作ったたこ焼きを食べました.
めっちゃ美味い.
衝撃的においしかったです.これ鉄製のたこ焼き機のおかげなのか,材料のおかげなのかわかりませんが,とにかく美味しくて,その日からずっと気になっていました.
そして気が付けば1週間後には注文して今日届きました. こちらです.
想像以上に分厚くてめっちゃ重かったです. アマゾンで買いました.
イワタニ(Iwatani) たこ焼プレート CB-P-T https://www.amazon.co.jp/dp/B0000DIJBV/ref=cm_sw_r_cp_api_i_UYTYDbARB4MZJ (フッ素加工のものはまじで意味がないので,買うことをお勧めしません.)
これを買うきっかけは先日のタコパでしたが,実はわたし前々から目をつけていました.というのも私は以前から鉄は良いぞおじさんだったからです.
私は大学学部生時代に,居酒屋でバイトをしていましてその時に初めて鉄と出会いました. それから鉄の良さに気づいて,そのバイトをやめても鉄の良さが忘れられなくて,鉄は良いぞおじさんになってしまいました.
現在はこの有様です.
中華鍋と大小のフライパンがあります.
鉄製の良さは詳しくは省略しますが,簡単にいうと①油を馴染ませることでこびりつかない点と,②熱容量が大きいため熱を溜め込み美味しく調理できる点,③半永久的に使える点です.
しかし,使い始めは鍋に油が馴染まず,鍋が育ってないので結構こびりつきます. しかも,今回紹介するシーズニングというものを行わないと,上手く育たずリセットしないといけません.
でも,そんな鉄鍋たちを育てるのが楽しいんですよね〜
それに尽きますね,使うたびに育つ鍋に愛着が湧きます. 凝り性な方には是非鉄製の鍋をお勧めしたいです.
シーズニング
鉄製の鍋やたこ焼き機の使い始めにはシーズニングをしないといけません.
シーズニングは簡単にいうと,錆止めを焼いて油をなじませることです.
鉄製のものはすぐに錆びるので,錆びないように錆止めがついた状態で販売されてます.その錆止めはアチアチに熱すると焼ききれるそうです.その後,油をじっくり馴染ませれば完成です.ホントはもっと複雑ですが,今回は簡単にします.
実際に今回買ったたこ焼き機に行いました. これは焼いてるところです.
もともと真っ黒だったのですが,錆止めが取れたのかマットな質感になってます ちなみに他のブログでは、赤くなるまでとありますが,その赤ってサビなんじゃないかな...? (ちなみに鉄鍋の場合,正しく焼くと青みがかった色になります.)
とりあえずは,このくらいにして鉄鍋が冷めたら油を入れて弱火でじっくり鍋に油をなじませます.
めっちゃ油もったいないですが,しょうがないです. 20-30分くらいしたら,また冷まして余分な油を取って出来上がりです!
いい感じに仕上がりました〜.明日早速使う予定です.
さいごに
今回は鉄製のたこ焼き機を買ったので,鉄は良いぞおじさんとしてシーズニングの説明をして,実際にシーズニングを行いました。
明日使う予定ですが、たぶん最初はこびりつくと思います、、、 まぁその辺の実際の使用感も今後日常の日記としてまとめていこうと思います。
ではまた(✿╹◡╹)
pythonistaがC++で複素数の配列を扱ってみる.
目次
はじめに
どうも,かわつあんです.前回は複素数C++で扱って,前々回は配列を扱いました.今回は複素数の配列をちょこっと触ってみます.
まずはじめに断っておくと,C++の複素数配列はデフォルトの配列やarray
クラスでも複素数を扱えるようです.しかし,私はvector
の方が便利だと個人的に感じたので,今後vector
で配列を扱っていく予定です.
では,いきましょう〜
C++で複素数の一次元配列
それではC++での複素数配列をvector
クラスで扱っていきます.
それでは早速適当な複素数の配列を生成してみたいと思います,と言いたいところですが,その前に比較のためにpythonだとどう書くかを書いておきます.
import numpy as np zary = np.array([1+1j, 2+2j, 3+3j]) print(zary)
出力結果
[1.+1.j 2.+2.j 3.+3.j]
こんな感じです.
listのままでもいいですが,numpy.ndarray
の方がブロードキャストなどを使って計算しやすいですよね.
次はC++で同じことをやってみます.
#include <iostream> #include <complex> #include <vector> using namespace ::std; int main(){ vector<complex<float> > zary; zary.push_back(complex<float>(1,1)); zary.push_back(complex<float>(2,2)); zary.push_back(complex<float>(3,3)); cout << zary[0] << endl; cout << zary[1] << endl; cout << zary[2] << endl; }
出力結果
(1,1) (2,2) (3,3)
無事に複素数の配列を生成できました.vector<型>
というふうに定義するため,
型
のところに,complex<float>
などを入れればいいみたいです. しかし,なぜかvectorの初期化がpush_back以外ではできなかったです...
=>できました!C++14でコンパイルするとできました.以下にその時のコードを貼っておきます.
#include <iostream> #include <complex> #include <vector> using namespace ::std; int main(){ vector <complex<float> > zary={complex<float> (1,1), complex<float> (2,2), complex<float> (3,3)}; cout << zary[0] << endl; cout << zary[1] << endl; cout << zary[2] << endl; }
コンパイル時に以下のようにオプションをつけました.
c++ complex.cpp -std=gnu++14
C++は11と14でいろいろ違うみたいですね. そこら辺は今後に気をつけていきます.(たまにコンパイルできてたのは,たまたまc++14を使ってたのか?)
C++で複素数の二次元配列
二次元配列も一次元配列と同じようにできるので,pythonとc++を比較で一気に書いちゃいます.
pythonだと
import numpy as np zary = np.array([[1+1j, 2+1j, 3+1j], [1+2j, 2+2j, 3+2j], [1+3j, 2+3j, 3+3j]]) print(zary)
実行結果
[[1.+1.j 2.+1.j 3.+1.j] [1.+2.j 2.+2.j 3.+2.j] [1.+3.j 2.+3.j 3.+3.j]]
C++だと
#include <iostream> #include <complex> #include <vector> using namespace ::std; int main(){ vector <vector <complex<float> > > zary; zary={{complex<float> (1,1),complex<float> (2,1),complex<float> (3,1)}, {complex<float> (1,2),complex<float> (2,2),complex<float> (3,2)}, {complex<float> (1,3),complex<float> (2,3),complex<float> (3,3)} }; for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ cout << zary[i][j] << " "; } cout << endl; } }
実行結果
(1,1) (2,1) (3,1) (1,2) (2,2) (3,2) (1,3) (2,3) (3,3)
無事に,pythonと同じようにc++でも複素数の配列を使えるようになりました.pythonはやっぱり簡単だし,c++はやっぱり書くのがめんどくさいですね.まあ,それぞれの言語のコンセプトに合っていると思いますので,しょうがないと思います.
さいごに
今回は,複素数の配列をC++で扱い,pythonと比べてみました. C++でも慣れれば難しくなく(書くのはすごく面倒ですが)複素数の配列を扱えるみたいですね.
これまでの記事を通して,C++である程度は計算ができるようになりました.今後は早速C++で計算をしようと思いますが,最終的なゴールであるC++ をpythonから呼ぶためには,配列をポインタかあるいは参照で扱わないといけません.せっかくなので,ポインタと参照についてC++とpythonで比較して,次回まとめようかと思います.
ではまた(✿╹◡╹)
pythonistaがC++で複素数を扱ってみる.
目次
はじめに
どうも,かわつあんです. 今日はpython歴2年の私がC++で複素数をつかっていろいろしたいと思います.
複素数は今日の物理の計算や工学などでは必要不可欠なものとなっています. 私がC++で最終的にやりたい計算も複素数を扱いますので,実際に複素数を扱ってみて思ったことをまとめれたらと思います.
複素数とは
基本的にほとんどの人が知ってそうですが,簡単にまとめておきます.(厳密な説明ではないです.)
複素数とは,実数で扱えない計算を扱えるように拡張した数です. 普通は負の数の平方根は存在しませんが,複素数では虚数を導入することで,負の数の平方根を扱えるようにしました. 複素数は実部と虚部からなり,それぞれをとするとのように書きます.
書き出したらキリがないので,このくらいにしておきます. 詳しくはwikiなどをどうぞ.
C++で複素数を扱う
それでは,C++複素数について扱おうと思いますが,pythonとの比較も行なっていこうと思います. 以下では,pythonで先にコードを作成および実行し,その後それと等価のことをC++で行なっていきます.
a = 4 + 3j print(a)
実行結果
(1+1j)
このようにpythonでは,虚数単位をで表します.これは,工学系では電流(密度)をとして扱うことが多いため代わりに虚数単位をとして表現する思想からきているようです. (ちなみに理学系では逆に電流をと書くことが多いです)
#include <iostream> #include <complex> using namespace ::std; int main(){ complex<float> a; a = complex<float>(4,3); cout << a << endl; }
実行結果
(4,3)
C++では(実部, 虚部)のようにして複素数を扱うようです.またcomplex
クラスをインクルードしないと複素数を定義できません.
すこし面倒ですが,そもそもCやC++は複素数を扱う前提ではなかったみたいなのでしょうがないとは思います.
ここでは,complex<float>
としており,複素数の実部および虚部はそれぞれfloat
型にしていますが,int
やdouble
にもできます.(int
型で複素数をあつかうのはあまり現実的ではありませんが.)
四則演算
複素数の演算もいろいろ行なってみます. まずは四則演算です.
pythonだと
a = 4 + 3j b = 5 + 5j print("{} + {} = {}".format(a, b, a+b)) print("{} - {} = {}".format(a, b, a-b)) print("{} * {} = {}".format(a, b, a*b)) print("{} / {} = {}".format(a, b, a/b))
実行結果
(4+3j) + (5+5j) = (9+8j) (4+3j) - (5+5j) = (-1-2j) (4+3j) * (5+5j) = (5+35j) (4+3j) / (5+5j) = (0.7-0.1j)
バッチリです.手計算とも相違ないので,問題なさそうです.
続いてC++だと
#include <iostream> #include <complex> using namespace ::std; int main(){ complex<float> a,b; a = complex<float>(4,3); b = complex<float>(5,5); cout << a <<" + "<< b <<" = "<< a+b << endl; cout << a <<" - "<< b <<" = "<< a-b << endl; cout << a <<" * "<< b <<" = "<< a*b << endl; cout << a <<" / "<< b <<" = "<< a/b << endl; }
出力結果
(4,3) + (5,5) = (9,8) (4,3) - (5,5) = (-1,-2) (4,3) * (5,5) = (5,35) (4,3) / (5,5) = (0.7,-0.1)
問題なく計算できました!
複素数特有の計算
四則演算の次は,複素数特有の計算をしてみます. 具体的にはとしたときの 実部と虚部と,複素数の大きさ,偏角,複素共役です.ここら辺が計算できれば,大体の計算はできると思います.
それではいきましょう.まずはpythonから.
import cmath z = 4 + 3j print("Re(z) = {}".format(z.real)) print("Im(z) = {}".format(z.imag)) print("|z| = {}".format(abs(z))) print("arg(z) = {}".format(cmath.phase(z))) print("z* = {}".format(z.conjugate())
比較的に簡単に計算できました. 偏角だけはモジュールでの関数がないみたいですね. numpyを使うといろいろ使えるmethodも変わりますが,ここでは割愛します.
#include <iostream> #include <complex> using namespace ::std; int main(){ complex<float> z; z = complex<float>(4,3); cout << "Re(z) = " << z.real() << endl; cout << "Im(z) = " << z.imag() << endl; cout << "|z| = " << abs(z) << endl; cout << "arg(z) = " << arg(z) << endl; cout << "z* = " << conj(z) << endl; }
実行結果
Re(z) = 4 Im(z) = 3 |z| = 5 arg(z) = 0.643501 z* = (4,-3)
計算できました.complex
をインクルードしてしまったら,大体の計算ができるみたいでいいですね!
複素数特有の演算は慣れてしまえばC++でも簡単にできそうでよかったです.
さいごに
今回はC++で複素数を扱って,いろいろな計算をしました.pythonのコードと適宜比較しましたが,少しの差異はあれども,C++でもそんなに難しくなく計算ができそうなので,ほっとしています.
次回は,複素数と配列を組み合わせた複素数配列を少しだけ扱ってみようと思います.
次回が終われば,ひとまずC++の演算の確認は終了して,ctypes
にも触れて行こうと思います.
どうぞお付き合いください〜
ではまた(✿╹◡╹)