MasaHero’s blog 2023-07-03T20:40:52+09:00 MasaHero Hatena::Blog hatenablog://blog/17680117126968693886 PCの冷却 hatenablog://entry/820878482946702520 2023-07-03T20:40:52+09:00 2023-07-03T20:40:52+09:00 簡易水冷CPUクーラーの平均寿命は3年ほどらしい。その間はメンテナンスはほぼフリーだが、どうしても内部の冷却水が減っていって、最終的に冷却水不足で機能しなくなるようだ。しかもその構造上、冷却水の補充ができない。そのため、ほぼ使い捨てらしい。空冷CPUクーラーは製品にもよるが、一番壊れるであろうファン自体は取り換え可能であり、ほかに経年劣化というとヒートパイプ内の冷媒が考えられるがこれが漏れる等はあまり聞かない。この感覚でいたから、CPUクーラーの寿命で全然冷えていないことに気づけていなかった。現在のPC*1は5年ほど使っているのだが、例にもれずCPUクーラーは寿命を迎え、アイドル時でもパッケー… <p>簡易水冷CPUクーラーの平均寿命は3年ほどらしい。その間はメンテナンスはほぼフリーだが、どうしても内部の冷却水が減っていって、最終的に冷却水不足で機能しなくなるようだ。しかもその構造上、冷却水の補充ができない。そのため、ほぼ使い捨てらしい。</p><p>空冷CPUクーラーは製品にもよるが、一番壊れるであろうファン自体は取り換え可能であり、ほかに経年劣化というとヒートパイプ内の冷媒が考えられるがこれが漏れる等はあまり聞かない。この感覚でいたから、CPUクーラーの寿命で全然冷えていないことに気づけていなかった。</p><p>現在のPC<a href="#f-3b0ea370" name="fn-3b0ea370" title="パソコン工房のBTOブランドSTYLE∞ Q">*1</a>は5年ほど使っているのだが、例にもれずCPUクーラーは寿命を迎え、アイドル時でもパッケージ温度が60℃を下回らず、サーマルリミットに常時ぶち当たりつつ、シャットダウンだけは回避しているような状態になっていた。気づけたのはいくら重い処理を走らせても負荷が100%に行かないどころか、50%にも届かなくなっていたからである。購入当初からついているCPUクーラーは120mm角の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E9%A5%B8%A5%A8%A1%BC%A5%BF">ラジエータ</a>を備えた簡易水冷であり、購入当初は十分な冷却性能を発揮しておりCPU負荷100%の状態で24時間以上放置にも耐えていた。清掃はしていたので<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E9%A5%B8%A5%A8%A1%BC%A5%BF">ラジエータ</a>能力が落ちているとは考えにくく、調べたら冒頭に書いたようなことが分かった。</p><p>とりあえず、代わりのCPUクーラーを用意しようとしたが、使用しているCPUが<a class="keyword" href="https://d.hatena.ne.jp/keyword/AMD">AMD</a> Threadripperであるので選択肢はかなり狭まる。また、Threadripperに対応する空冷クーラーは軒並みでかくて、現状のケースに入らないかグラボと干渉する。水冷にしようとしても、前面に5インチベイが4つも並ぶような古めのケースのため<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E9%A5%B8%A5%A8%A1%BC%A5%BF">ラジエータ</a>の置き場は背面か天面しかない。現状背面となっているが、ここは120mm角専用であり、天面は120mm角のファンと140mm角のファンを並べるようにできているため120x240の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E9%A5%B8%A5%A8%A1%BC%A5%BF">ラジエータ</a>なら搭載可能であった。240クラスの簡易水冷で値段も安く評判もそこそこだったのでCorsair iCUE H100i ELITE CAPELLIX<a href="#f-025ca5cb" name="fn-025ca5cb" title=" [https://www.corsair.com/jp/ja/p/cpu-coolers/cw-9060046-ww/icue-h100i-elite-capellix-liquid-cpu-cooler-cw-9060046-ww] ">*2</a>を購入した。ケースに窓はないので光っても全く見えないのだが、このクラスだと大抵光るし、光らないタイプがあったとしても価格差はないというか、光るやつのほうが安いのはどういうわけなんだか。</p><p>つけて、それほど時間はたっていないが感想としては、冷却性のがそれほど上がった様には感じられないが、確実に以前のものよりうるさい。静音ファンに交換すべきだろうか。といっても、100%負荷まで当t辣できるようになったので必要最低限の冷却性は備えている。</p><p>当面はこれでしのぐが将来的には<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E9%A5%B8%A5%A8%A1%BC%A5%BF">ラジエータ</a>を外に設置するために本格水冷に移行したい。外に設置するのであればケースサイズに縛られず420mmクラスもしくはそれ以上の大きさにできる。</p> <div class="footnote"> <p class="footnote"><a href="#fn-3b0ea370" name="f-3b0ea370" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D1%A5%BD%A5%B3%A5%F3%B9%A9%CB%BC">パソコン工房</a>の<a class="keyword" href="https://d.hatena.ne.jp/keyword/BTO">BTO</a>ブランドSTYLE∞ Q</span></p> <p class="footnote"><a href="#fn-025ca5cb" name="f-025ca5cb" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a href="https://www.corsair.com/jp/ja/p/cpu-coolers/cw-9060046-ww/icue-h100i-elite-capellix-liquid-cpu-cooler-cw-9060046-ww">https://www.corsair.com/jp/ja/p/cpu-coolers/cw-9060046-ww/icue-h100i-elite-capellix-liquid-cpu-cooler-cw-9060046-ww</a> </span></p> </div> MasaHero CentOS Streamインストール hatenablog://entry/26006613664313780 2020-12-13T02:27:21+09:00 2020-12-13T02:27:21+09:00 CentOSがポリシーを変更して、RHELのクローンではなくてRHELとFedoraの中間になるそうなので、そろそろFedoraの更新を追いかけるのがつらくなってきたやつを入れ替えてみた。とりあえず必要なものだけrsyncで別のマシンにバックアップ。公式からインストールイメージを落としてきてインストール。 何も考えずネットインストール用のイメージを選択したんだが、失敗だったかもしれない。 インストールソースの設定で躓いた。 何故か選択肢にあるRedhatCDNは当然ながらRedhatとの契約が必要で使えない。 あとはURLの手入力するしかないようで、Mirrorリストを見ながら種別を"http… <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a>がポリシーを変更して、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RHEL">RHEL</a>のクローンではなくて<a class="keyword" href="http://d.hatena.ne.jp/keyword/RHEL">RHEL</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/Fedora">Fedora</a>の中間になるそうなので、そろそろ<a class="keyword" href="http://d.hatena.ne.jp/keyword/Fedora">Fedora</a>の更新を追いかけるのがつらくなってきたやつを入れ替えてみた。</p><p>とりあえず必要なものだけ<a class="keyword" href="http://d.hatena.ne.jp/keyword/rsync">rsync</a>で別のマシンにバックアップ。</p><p>公式からインストールイメージを落としてきてインストール。<br /> 何も考えずネットインストール用のイメージを選択したんだが、失敗だったかもしれない。<br /> インストールソースの設定で躓いた。<br /> 何故か選択肢にあるRedhatCDNは当然ながら<a class="keyword" href="http://d.hatena.ne.jp/keyword/Redhat">Redhat</a>との契約が必要で使えない。<br /> あとはURLの手入力するしかないようで、Mirrorリストを見ながら種別を"http"にして"<a class="keyword" href="http://d.hatena.ne.jp/keyword/ftp">ftp</a>.<a class="keyword" href="http://d.hatena.ne.jp/keyword/jaist">jaist</a>.ac.jp/pub/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a>/8-stream/"とか入れてみても何故かエラー。<br /> 最終的にはBugTrackerの情報を頼りに種別を"mirrorlist"にしたうえで"mirrorlist.<a class="keyword" href="http://d.hatena.ne.jp/keyword/centos">centos</a>.org/?release=8-stream&arch=<a class="keyword" href="http://d.hatena.ne.jp/keyword/x86">x86</a>_64&repo=BaseOS"を入れたらうまくいった。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Fedora">Fedora</a>はbtrfs押しだけど、<a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a>はXFS押しのようなので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D1%A1%BC%A5%C6%A5%A3%A5%B7%A5%E7%A5%F3">パーティション</a>からやり直した。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Redhat">Redhat</a>はXFSの上にかぶせるStraitsとかいうのを<a class="keyword" href="http://d.hatena.ne.jp/keyword/ZFS">ZFS</a>対抗で推進していたはずなんだが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a>のドキュメントには影も形もない。<br /> 代わりにVDOとかいうのがあって、これはブロックデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>のレイヤーでシンプロヴィジョニング/重複排除/オンライン圧縮を担当するみたい。<br /> ただ、インストール時には設定できないみたいなので、とりあえず領域だけ開けておく。</p><p>再起動後、Dockerをインストール。<br /> 公式のドキュメントだと<a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a>なら<a class="keyword" href="http://d.hatena.ne.jp/keyword/yum">yum</a>を使えとなっているが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a>も8はDNFへ移行済みなので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Fedora">Fedora</a>向けの記述を頼りにインストール。</p> <pre class="code" data-lang="" data-unlink>$ sudo dnf -y install dnf-plugins-core $ sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo $ sudo dnf install docker-ce docker-ce-cli containerd.io</pre><p>ここでDocker RootとしてVDOで重複排除の有効になった領域を使用すべく設定。</p> <pre class="code" data-lang="" data-unlink>$ sudo vdo create --name=vdovolume --device=/dev/sda5 --vdoLogicalSize=1TB $ sudo mkfs.xfs /dev/mapper/vdovolume</pre><p>既存のDockerRootの内容を移動したうえで、fstabに以下を追加。<br /> x-systemdで始まるのはsystemd用のオプションだが、これがないとvdoサービスが立ち上がる前にマウントしようとしてエラーを吐くっぽい。</p> <pre class="code" data-lang="" data-unlink>/dev/mapper/vdovolume /var/lib/docker xfs defaults,_netdev,x-systemd.device-timeout=0,x-systemd.requires=vdo.service 0 0</pre><p>後はバックアップを戻せば完了。</p> MasaHero ラズパイ用の電源#5 hatenablog://entry/26006613658381808 2020-11-29T19:03:34+09:00 2020-11-29T19:03:34+09:00 とりあえず前回は回路図を出してみたが、懸念点は以下の通り。 ダイオードでの電圧降下を考えると12Vではバッテリーの充電ができないのではないか、IRM-20-12からIRM-20-15に変えるべきか 入力側への突入電流に対する保護を忘れていた、このままだと20Aが流れて、もれなくブレーカを落とす それぞれ抵抗に何を使うのか決めないといけない もしかしてD3は不要? これ部品代だけで1万行くんでは バッテリの充電には13.7-14.7Vが推奨されてるんだけど、これバッテリ側で測ったとき10V以下に落ちてるよね。 D3を抜いたとしても、電源側への逆流防止ダイオードD1と電流制限のためのR3とF2は残… <p>とりあえず<a href="https://masahero.hatenablog.jp/entry/2020/11/24/221901">&#x524D;&#x56DE;</a>は回路図を出してみたが、懸念点は以下の通り。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>での電圧降下を考えると12Vではバッテリーの充電ができないのではないか、IRM-20-12からIRM-20-15に変えるべきか</li> <li>入力側への突入電流に対する保護を忘れていた、このままだと20Aが流れて、もれなくブレーカを落とす</li> <li>それぞれ抵抗に何を使うのか決めないといけない</li> <li>もしかしてD3は不要?</li> <li>これ部品代だけで1万行くんでは</li> </ul><p><br /> バッテリの充電には13.7-14.7Vが推奨されてるんだけど、これバッテリ側で測ったとき10V以下に落ちてるよね。<br /> D3を抜いたとしても、電源側への逆流防止<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>D1と電流制限のためのR3とF2は残る。<br /> D1で0.5Vぐらい、充電時は0.3A流れる予定だからR3で1.5V、F2はこの仕様だとトリップ前が4Ωぐらいらしいので1.2Vの計3.2V。<br /> まあ定格電流で放電時のバッテリー側終端電圧が8Vより下なので、何とかそれよりも上だけど低い。</p><br /> <p>突入電流に対する保護ってNTC<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A1%BC%A5%DF">サーミ</a>スタでもかませばいいんかな。<br /> 定常時は0.6Aなんだけどデータシートを見る限り突入時最大20Aとなっている。<br /> これを保護するにはどういった特性のNTC<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A1%BC%A5%DF">サーミ</a>スタが必要なんだろ。<br /> 室温での抵抗値ってどう選べばいいんだろ。<br /> 小さいと意味ないだろうし大きすぎると定常時のロスになるというか発熱が大変なことになるよね。</p> MasaHero ラズパイ用の電源#4 hatenablog://entry/26006613656549153 2020-11-24T22:19:01+09:00 2020-11-24T22:19:01+09:00 だいぶ間が空いてしまったが、一応やめてはいない。 実物を作るかどうかはともかくプリント基板を発注できるくらいの完成度までは持っていくつもり。とりあえず、回路図第一弾はできた。 回路図ダイオードはよさげなの(VS-50WQ03FN-M3)があったのでそれにを使う前提だが、抵抗に関して全く決めてないので回路図上も適当。R3とか10W流せる抵抗はないだろうから組み合わせるしかないだろうし、R1も都合よく望みの抵抗値のものがあるとも思えないのでこれも適当に組み合わせるしかないだろう。目視での検査では問題ないと思うのだがKiCAD付属のERCにかけると電源入力にあたるJ1のピン2とピン3周りでエラーが出… <p>だいぶ間が空いてしまったが、一応やめてはいない。<br /> 実物を作るかどうかはともかくプリント基板を発注できるくらいの完成度までは持っていくつもり。</p><p>とりあえず、回路図第一弾はできた。</p> <figure class="figure-image figure-image-fotolife" title="回路図"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MasaHero/20201124/20201124213735.png" alt="f:id:MasaHero:20201124213735p:plain" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>回路図</figcaption></figure><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>はよさげなの(VS-50WQ03FN-M3)があったのでそれにを使う前提だが、抵抗に関して全く決めてないので回路図上も適当。R3とか10W流せる抵抗はないだろうから組み合わせるしかないだろうし、R1も都合よく望みの抵抗値のものがあるとも思えないのでこれも適当に組み合わせるしかないだろう。</p><p>目視での検査では問題ないと思うのだがKiCAD付属のERCにかけると電源入力にあたるJ1のピン2とピン3周りでエラーが出る。何か設定を間違っているのだろうか。</p><p>構成としてはJ1が入力で、ACのライブと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%E5%A1%BC%A5%C8%A5%E9">ニュートラ</a>ル、さらにアースの3極。そのままPS1であるIRM-20-12へ内蔵の保護回路を信じて直接つなげる。</p><p>PS1で<a class="keyword" href="http://d.hatena.ne.jp/keyword/AC/DC">AC/DC</a>変換してDC12Vとした後、+12Vを電源入力監視としてN-<a class="keyword" href="http://d.hatena.ne.jp/keyword/MOSFET">MOSFET</a>のゲートにつなぐ。適当に直結してるけど手に入りやすいN-<a class="keyword" href="http://d.hatena.ne.jp/keyword/MOSFET">MOSFET</a>のゲートの耐圧に合わせて分圧する必要があるかも。このN-<a class="keyword" href="http://d.hatena.ne.jp/keyword/MOSFET">MOSFET</a>でオープンコレクタではなくオープンドレイン出力を行う。GPIO側でプルアップしてやればラズパイへの出力として使えるはず。</p><p> +12Vは逆流防止の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>(D1)を挟んで、バッテリ(<a class="keyword" href="http://d.hatena.ne.jp/keyword/J3">J3</a>)とDC/DCコンバータ(IC1)へ。バッテリの充電側つまりD3側は抵抗(R3)で電流制限したつもりだけど、リセッタブルヒューズ(F2)も入れて0.4A以上流れないようにしている。バッテリの放電側(D4側)は特に制御してない。過放電対策とかやっぱり必要だろうか。</p><p>DC/DCコンバータ(IC1)の直前には一応6Aのヒューズ(F1)を挿入して過負荷対策。IC1には、無効化スイッチ入力と出力電圧調整ピンがあるのでそれぞれに適切そうなのを接続。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/DIP">DIP</a> SW(SW1)をONにするとIC1は機能停止する。可変抵抗(R2)で最終出力の5Vを調整。+VOUTには逆流防止の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>(D2)を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%AB%A4%DE%A4%B7">かまし</a>て出力へ。</p><p>初めての電気回路設計なのでいろいろ不安だが、各素子のスペックシートを眺める限りこれで一応動作するはず。</p> MasaHero ルータ乗り換え hatenablog://entry/26006613632460297 2020-09-25T22:52:55+09:00 2020-09-25T22:52:55+09:00 YAMAHA NVR510からYAHAMA RTX1210へ乗り換えた。 オールインワンVoIPルータから中小規模拠点向けVPNルータへの乗り換えとなったわけだが、乗り換えた理由はネット回線を実は2回線契約しているから。2つの回線を有効利用するためにはWAN側のポートが2ポート以上必要で、そういった製品となるともう家庭用ではなく、小規模拠点向けも通り越して、中規模拠点向けとなってしまう。ちょうどヤフオクであったのでRTX1210を購入した。定価だと2倍以上するが、発売されてもう6年も経っているせいか、中古価格的には新品のNVR510とどっこい。移行自体は、同じメーカなので楽だった。NVR510… <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/YAMAHA">YAMAHA</a> NVR510からYAHAMA RTX1210へ乗り換えた。<br /> オールインワン<a class="keyword" href="http://d.hatena.ne.jp/keyword/VoIP">VoIP</a>ルータから中小規模拠点向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/VPN">VPN</a>ルータへの乗り換えとなったわけだが、乗り換えた理由はネット回線を実は2回線契約しているから。2つの回線を有効利用するためにはWAN側のポートが2ポート以上必要で、そういった製品となるともう家庭用ではなく、小規模拠点向けも通り越して、中規模拠点向けとなってしまう。</p><p>ちょうど<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E4%A5%D5%A5%AA%A5%AF">ヤフオク</a>であったのでRTX1210を購入した。定価だと2倍以上するが、発売されてもう6年も経っているせいか、中古価格的には新品のNVR510とどっこい。</p><p>移行自体は、同じメーカなので楽だった。NVR510側でUSBフラッシュに設定ファイルを書き出して、ちょっと編集してRTX1210側に刺して起動すれば、ほぼほぼ前の設定を受け継いでくれる。あとは、2機種間の差異部分を詰めていけば設定完了。</p><p>移行して思ったのだが、純粋なパケット処理能力的には後発のNVR510のほうが上かもしれない。2回線で負荷分散すること自体は重い処理とは到底思えないのだが、CPU能力が明らかにRTX1210側のほうが劣っているためか、NVR510では行かなかったCPU使用率70%突破が発生した。RTX1210自体の後継機の発売が望まれる。</p><p>RTX1210自体が2014年発売開始なので、もうそろそろ後継機のアナウンスがあってもおかしくない。後継機の型番は、順当にいけばRTX1220だろうか。<a class="keyword" href="http://d.hatena.ne.jp/keyword/ISDN">ISDN</a>系の機能はもう必要ないので消えるとして、その分筐体自体をもう少し小さくしてくれると嬉しい。CPUは、現状のPower系のシングルコアから、RTX830のようなArm系のマルチコアへ変更だろうか。</p> MasaHero ラズパイ用の電源#3 hatenablog://entry/26006613621023766 2020-08-28T23:03:17+09:00 2020-08-28T23:03:17+09:00 スローペースだがまだまだ続くよ。 以下の続き。 masahero.hatenablog.jp検討の結果、鉛蓄電池(VRLA)を電源入力喪失時のバックアップとして利用する。回路の構成としては、以下の通り。 商用電源(単相AC 100~200V)からDC 12Vへ降圧及び整流する部分 電流制限回路を挟んでDC 12Vでバッテリーを充電する部分 バッテリー DC 12VからDC 5V(+10%, -0%)へ降圧する部分 ぞれぞれ基本的には既製品で構成していく。 具体的には以下を利用する。 AC/DCコンバータとしてMEAN WELL のIRM-20-12 バッテリーとしてB B BatteryのBP… <p>スローペースだがまだまだ続くよ。<br /> 以下の続き。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmasahero.hatenablog.jp%2Fentry%2F2020%2F07%2F27%2F021657" title="ラズパイ用の電源#2 - MasaHero’s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://masahero.hatenablog.jp/entry/2020/07/27/021657">masahero.hatenablog.jp</a></cite></p><p>検討の結果、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%F4%C3%DF%C5%C5%C3%D3">鉛蓄電池</a>(VRLA)を電源入力喪失時のバックアップとして利用する。</p><p>回路の構成としては、以下の通り。</p> <ul> <li>商用電源(単相AC 100~200V)からDC 12Vへ降圧及び整流する部分</li> <li>電流制限回路を挟んでDC 12Vでバッテリーを充電する部分</li> <li>バッテリー</li> <li>DC 12VからDC 5V(+10%, -0%)へ降圧する部分</li> </ul><p>ぞれぞれ基本的には既製品で構成していく。<br /> 具体的には以下を利用する。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/AC/DC">AC/DC</a>コンバータとしてMEAN WELL のIRM-20-12</li> <li>バッテリーとしてB B BatteryのBP1.2-12-T1</li> <li>DC/DCコンバータとして<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%BC%C5%C4%C0%BD%BA%EE%BD%EA">村田製作所</a>のOKR-T/3-W12-C</li> </ul><p>電流制限回路はさすがに既製品がなかったので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%AF%A5%EA%A1%BC%A5%C8">ディスクリート</a>で組むとして、あとは安全回路として入力側に異常電流防止のヒューズ、出力側に逆流防止用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>かな。<br /> これでやっと基板設計に取り掛かることが出来る。</p> MasaHero Zabbix Proxy導入で躓いたとこ hatenablog://entry/26006613618457771 2020-08-23T04:55:19+09:00 2020-08-23T04:55:19+09:00 振り返れば当たり前なんだが気づくのに3時間ぐらいかかったので戒めに書いておく。なんやかんやあって、30台以上のラズパイを管理しているので監視用にZabbixを導入している。 システム部門でもなく生産技術の人間なので、サーバを新たにたてるわけにもいかず、部門NASとして導入しているSynologyのDS718+でZabbix ServerとZabbix FrontendをDockerで起動させ、DBはIoT用としてシステム部門に用意してもらっているものに間借りさせている。今までは、用途的に必要があり社内LANに直接つながるものばかりだったので特に問題なかったが、社内LANとはつながらない設備内固… <p>振り返れば当たり前なんだが気づくのに3時間ぐらいかかったので戒めに書いておく。</p><p>なんやかんやあって、30台以上のラズパイを管理しているので監視用にZabbixを導入している。<br /> システム部門でもなく生産技術の人間なので、サーバを新たにたてるわけにもいかず、部門<a class="keyword" href="http://d.hatena.ne.jp/keyword/NAS">NAS</a>として導入しているSynologyのDS718+でZabbix ServerとZabbix FrontendをDockerで起動させ、DBはIoT用としてシステム部門に用意してもらっているものに間借りさせている。</p><p>今までは、用途的に必要があり社内LANに直接つながるものばかりだったので特に問題なかったが、社内LANとはつながらない設備内固有のLAN内に設置するもの(以降Aと呼称)が出てきた。<br /> 幸い同一の設備内LANには別用途ですでに社内LANにもつながっている個体(以降Bと呼称)がいるので、そいつにZabbix Proxyを導入することで対処しようとした。</p><p>で、単純にBで"sudo apt install zabbix-proxy-sqlite3"としてインストールして"/etc/zabbix/zabbix-proxy.conf"いじって、AのZabbix Agnetの向き先をBとしてリロードしたら以下のエラーメッセージ。</p> <pre>No active checks on server: host [****] not found </pre><p>Zabbix Proxy側には以下のようなメッセージ。</p> <pre>cannot send list of active checks to [***]: host [***] not found </pre><p>Zabbix Server側の設定を見直したり、Agent側の設定を変えたりしたけど状況変わらず。<br /> そもデフォルトの設定ではServerとProxy間の設定情報の更新は1時間ごとなので、Sever側の設定を変更しても最長1時間Proxyには影響を与えない。<br /> それにしてもおかしいと思いログを見直したらProxy側に以下のようなメッセージもあるのに気づく。</p> <pre>failed to update local proxy configuration copy: invalid table name "interface_<a class="keyword" href="http://d.hatena.ne.jp/keyword/snmp">snmp</a>" </pre><p>ググったら以下が引っかかる。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.zabbix.com%2Fforum%2Fzabbix-troubleshooting-and-problems%2F398099-failed-to-update-local-proxy-configuration-copy-invalid-table-name-interface_snmp" title="failed to update local proxy configuration copy: invalid table name &quot;interface_snmp&quot; - ZABBIX Forums" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.zabbix.com/forum/zabbix-troubleshooting-and-problems/398099-failed-to-update-local-proxy-configuration-copy-invalid-table-name-interface_snmp">www.zabbix.com</a></cite></p><p>そういえば、数カ月前にServer側を4.4から5.0LTSにバージョンアップしたなあと思いだすも、以前調べたときはAgentとバージョンが異なってもServer側のほうが上なら問題ないとなっていたから気にしていなかったし、ラズパイ自体もその間にStretchからBusterに上げていたからバージョン不一致は解消されたんではと思っていた。<br /> しかしながら<a class="keyword" href="http://d.hatena.ne.jp/keyword/Debian">Debian</a>側の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>はBusterでも4.0なのね。<br /> 普段使ってるの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Fedora">Fedora</a>だからディストリのバージョンを最新にしたらパッケージ自体もアップストリームのほぼ最新を追随してると無意識に思っちゃったけど、そういえば<a class="keyword" href="http://d.hatena.ne.jp/keyword/Debian">Debian</a>はそんなことないわ、むしろStable=OLDな世界だったわ。</p><p>upstreamからパッケージ持ってきてProxyのバージョンも5.0LTSに上げたら、何の問題もなくServer上でProxyの先のAgentを認識できた。<br /> まあ、設定自体は正しかったし当然ではある。</p><p>結論として、Agent自体はServerより古いバージョンでも問題ないけどProxyはServerと同じバージョンじゃないとダメ。</p> MasaHero ラズパイ用の電源#2 hatenablog://entry/26006613605018029 2020-07-27T02:16:57+09:00 2020-08-28T20:15:33+09:00 以下の続き。 masahero.hatenablog.jp 要求仕様を満たすために考えるべきことは、まずどうやって入力消失後30秒間出力を維持するか。 とりあえずぱっと思いつくのは以下の2つ。 コンデンサ 二次電池 それぞれのメリット/デメリットは以下の通り。 コンデンサ メリット 充電は特に制御が必要ない 5年程度では劣化を特に気にする必要がない程度には長寿命 デメリット 放電時は残容量に従い線形に電圧が低下するので電圧を一定に保つには何らかの制御が必要 容量が少ない 二次電池 メリット 放電時の電圧変動が少ない 比較的容量確保が楽 デメリット どのタイプの二次電池かにもよるが大抵充電制御が… <p>以下の続き。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmasahero.hatenablog.jp%2Fentry%2F2020%2F07%2F25%2F080329" title="ラズパイ用の電源#1 - MasaHero’s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://masahero.hatenablog.jp/entry/2020/07/25/080329">masahero.hatenablog.jp</a></cite></p><br /> <p>要求仕様を満たすために考えるべきことは、まずどうやって入力消失後30秒間出力を維持するか。<br /> とりあえずぱっと思いつくのは以下の2つ。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%F3%BC%A1%C5%C5%C3%D3">二次電池</a></li> </ul><p>それぞれのメリット/デメリットは以下の通り。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a> <ul> <li>メリット <ul> <li>充電は特に制御が必要ない</li> <li>5年程度では劣化を特に気にする必要がない程度には長寿命</li> </ul></li> <li>デメリット <ul> <li>放電時は残容量に従い線形に電圧が低下するので電圧を一定に保つには何らかの制御が必要</li> <li>容量が少ない</li> </ul></li> </ul></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%F3%BC%A1%C5%C5%C3%D3">二次電池</a> <ul> <li>メリット <ul> <li>放電時の電圧変動が少ない</li> <li>比較的容量確保が楽</li> </ul></li> <li>デメリット <ul> <li>どのタイプの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%F3%BC%A1%C5%C5%C3%D3">二次電池</a>かにもよるが大抵充電制御が必要</li> <li>寿命を気にする必要あり</li> </ul></li> </ul></li> </ul><p><br /> どちらにするか決めるためにも、求めるものを整理していく。</p><p>ラズパイシャットダウンの時間確保用なので最終の出力電圧は5V、ラズパイの最新モデル4Bが資料によると最低2.5Aを必要としているようなので最低でも<img src="https://chart.apis.google.com/chart?cht=tx&chl=5%20%5Ctimes%202.5%20%3D%2013" alt="5 \times 2.5 = 13"/>で13Wを30秒間出力できるもの。<br /> 13Wを30秒なので、<img src="https://chart.apis.google.com/chart?cht=tx&chl=13%20%5Ctimes%20%2830%20%2F%2060%20%2F%2060%29%20%3D%200.1083..." alt="13 \times (30 / 60 / 60) = 0.1083..."/>でだいたい110mWh、ないし<img src="https://chart.apis.google.com/chart?cht=tx&chl=13%20%5Ctimes%2030%3D390" alt="13 \times 30=390"/>で390J。</p><p>容量だけを考えると<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%F3%BC%A1%C5%C5%C3%D3">二次電池</a>ならかなり小さいものでも余裕で確保できるが、小さいものだと出力2.5Aを確保できない。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%F3%BC%A1%C5%C5%C3%D3">二次電池</a>から選択する場合は、容量よりも電流量がネックになる。<br /> ちょっと調べてみた限りではリチウムイオンだとかニッケル水素は2.5Aを確保しようと思ったら2.5Ah以上が必要みたい。<br /> 電池のデータシートにやたらとCが出てきて、最初<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B2%D9">電荷</a>の単位クーロンだと思ってて意味不明すぎたんだが、どうも全然別の単位で全容量を1時間で放出しきる電流量が1Cらしい。紛らわしすぎる。<br /> リチウムイオンだとかニッケル水素の電池が1C以上取り出しちゃいけないようなので、30秒間だけのはずが1時間以上持つものが出来上がってしまう。<br /> 期待していなかった<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%F4%C3%DF%C5%C5%C3%D3">鉛蓄電池</a>が重いけどこの用途には向いてるみたい<a href="#f-1c6e4990" name="fn-1c6e4990" title="BP3-6-T1 [https://www.digikey.jp/products/ja?keywords=BP3-6-T1:embed:cite] ">*1</a>。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>の場合、大容量を確保しようと思うと電気二重層タイプになる。<br /> しかし電気二重層タイプは耐圧が著しく低いので仮に2Vで充電するとして、かつ出力電圧維持の都合上容量の7割までしか使えないとすると必要な静電容量は<img src="https://chart.apis.google.com/chart?cht=tx&chl=Q%3D%5Cfrac%7B1%7D%7B2%7DCV%5E2" alt="Q=\frac{1}{2}CV^2"/>だから<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cfrac%7B390%7D%7B0.3%7D%20%5Ctimes%202%20%5Ctimes%20%5Cfrac%7B1%7D%7B2%5E2%7D%3D650" alt="\frac{390}{0.3} \times 2 \times \frac{1}{2^2}=650"/>で650F。<br /> 650Fを1つで確保はできないので6つぐらいを束ねることを考える<a href="#f-ce0c0746" name="fn-ce0c0746" title="6つなのは充電電圧2Vだと直列にしたとき12Vとなって扱いやすいから">*2</a>。<br /> となると、束ねた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>間の電圧に偏りが生じないよう制御する必要が出てくる。<br /> 需要はあるみたいで専用にICが出てる<a href="#f-24a9f834" name="fn-24a9f834" title="[https://www.rohm.co.jp/products/power-management/battery-management/edlc-monitoring-ics/bd14000efv-c-product:embed:cite]">*3</a>。<br /> ただ、なんといってもでかい。<br /> 2.5V/150Fという製品があるが直径35mmの高さ50mmと中々でかいものが6個とバランス制御用ICでかなり実装面積が必要となるし、お値段が1個2000円ぐらいするからラズパイ本体よりも高くなること必須。</p> <div class="footnote"> <p class="footnote"><a href="#fn-1c6e4990" name="f-1c6e4990" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">BP3-6-T1 <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.digikey.jp%2Fproducts%2Fja%3Fkeywords%3DBP3-6-T1" title="BP3-6-T1 B B Battery | バッテリ製品 | DigiKey" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.digikey.jp/products/ja?keywords=BP3-6-T1">www.digikey.jp</a></cite> </span></p> <p class="footnote"><a href="#fn-ce0c0746" name="f-ce0c0746" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">6つなのは充電電圧2Vだと直列にしたとき12Vとなって扱いやすいから</span></p> <p class="footnote"><a href="#fn-24a9f834" name="f-24a9f834" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text"><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.rohm.co.jp%2Fproducts%2Fpower-management%2Fbattery-management%2Fedlc-monitoring-ics%2Fbd14000efv-c-product" title="4-6セル直列対応 車載向け蓄電素子セルバランスLSI - BD14000EFV-C | ローム株式会社 - ROHM Semiconductor" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.rohm.co.jp/products/power-management/battery-management/edlc-monitoring-ics/bd14000efv-c-product">www.rohm.co.jp</a></cite></span></p> </div> MasaHero ラズパイ用の電源#1 hatenablog://entry/26006613603965346 2020-07-25T08:03:29+09:00 2020-07-25T08:03:29+09:00 仕事でもいつの間にか30台程度のラズパイが私の管理下にある今日この頃。 ラズパイの電源系をなんとかしたい。仕事で買う場合は社内ネットにつなぐ必要上ICT部門経由でケースやACアダプタとのセット品を購入しているのだが、今のところ5~6台がセット品にもかかわらず電圧不足の警告が出る。 まあ、CPUをフルで使わせることはそうないので出てても問題ないといえばないのだが気になる。また、ただでさえ長期運用時に信頼度が怪しいMicroSDに対して、工場の現場に配置している都合上電源ぶち切り運用が重なり、1年程度で壊れるものが続出。 まあ、事前に予想できていたことなので、内部ストレージはバッファ扱いで必要なデ… <p>仕事でもいつの間にか30台程度のラズパイが私の管理下にある今日この頃。<br /> ラズパイの電源系をなんとかしたい。</p><p>仕事で買う場合は社内ネットにつなぐ必要上ICT部門経由でケースやACアダプタとのセット品を購入しているのだが、今のところ5~6台がセット品にもかかわらず電圧不足の警告が出る。<br /> まあ、CPUをフルで使わせることはそうないので出てても問題ないといえばないのだが気になる。</p><p>また、ただでさえ長期運用時に信頼度が怪しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/MicroSD">MicroSD</a>に対して、工場の現場に配置している都合上電源ぶち切り運用が重なり、1年程度で壊れるものが続出。<br /> まあ、事前に予想できていたことなので、内部ストレージはバッファ扱いで必要なデータは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wi-Fi">Wi-Fi</a>が有効な時に別に立ててあるサーバに吐き出させている。<br /> だから壊れたからといって大きなデータの欠落等が出るわけではないが、壊れてから気付いて新しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/MicroSD">MicroSD</a>に入れ替えて元に戻すまで、データが途切れることは確かだし、何より現場から回収して事務所で再セットアップしてまた設置しに行くのが手間。</p><p>ということで、ラズパイを安定して運用できるだけの出力があり、電源入力消失時にラズパイ側に伝えラズパイのシャットダウンの間は電力を供給できる電源が欲しい。<br /> 既製品があれば購入するが、既製品を探すことと並行して基板設計の勉強がてら自分で設計してみようかとも思う。</p><p>設計する場合の仕様は以下の通り。</p> <ul> <li>入力: 単相AC100V 商用電源 3極<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CD%A4%B8%BC%B0">ねじ式</a>端子台(N/L/E)</li> <li>出力: 4極<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CD%A4%B8%BC%B0">ねじ式</a>端子台(V+/GND/SOUT/SGND) <ul> <li>電力 <ul> <li>電圧: 5V(+10%,-0%)</li> <li>電流: 定格3A</li> </ul></li> <li>信号 <ul> <li>電源入力消失伝達用にオープンコレクタ出力を1系統</li> <li>通常時はクローズで電源入力消失時にオープンとなり、その後30秒間は電力出力を維持</li> </ul></li> </ul></li> <li>形状: <a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Zeroのケースと同程度の大きさ(79x38)</li> </ul><p>KiCADかDesignSparkPCBで図面を引いてみる。</p> MasaHero Python+TkでD&D 3 hatenablog://entry/26006613542044210 2020-03-29T13:03:29+09:00 2020-08-04T20:51:46+09:00 以前書いたものの原因が分かった。 masahero.hatenablog.jpワイド文字列がダメみたい。 "CallWindowProcW"みたいに最後に"W"がつく関数をすべて"A"に置き換えると動作する。Pythonというかpywin32側の仕様が変わったのだろうか。 <p>以前書いたものの原因が分かった。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmasahero.hatenablog.jp%2Fentry%2F2019%2F09%2F06%2F225017" title="Python+TkでD&amp;D 2 - MasaHero’s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://masahero.hatenablog.jp/entry/2019/09/06/225017">masahero.hatenablog.jp</a></cite></p><p>ワイド文字列がダメみたい。<br /> "CallWindowProcW"みたいに最後に"W"がつく関数をすべて"A"に置き換えると動作する。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>というかpywin32側の仕様が変わったのだろうか。</p> MasaHero Python+TkでD&D 2 hatenablog://entry/26006613422929862 2019-09-06T22:50:17+09:00 2019-09-06T22:50:17+09:00 以前以下のような記事を書いた。 masahero.hatenablog.jp時間もたってこのままでは動作しなくなっているようなので修正版を作った。 Python 3.6.9では動作するが、Python 3.7.3では元のウィンドウプロシージャを呼び出す箇所で"Access violation"が発生する。原因調査中。分かる人がいたら教えて。 <p>以前以下のような記事を書いた。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmasahero.hatenablog.jp%2Fentry%2F20111201%2Fp1" title="Python+TkでD&amp;D - MasaHero’s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://masahero.hatenablog.jp/entry/20111201/p1">masahero.hatenablog.jp</a></cite></p><p>時間もたってこのままでは動作しなくなっているようなので修正版を作った。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> 3.6.9では動作するが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> 3.7.3では元のウィンドウプロシージャを呼び出す箇所で"<a class="keyword" href="http://d.hatena.ne.jp/keyword/Access">Access</a> violation"が発生する。原因調査中。分かる人がいたら教えて。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> ctypes <span class="synPreProc">from</span> ctypes.wintypes <span class="synPreProc">import</span> HWND, UINT, WPARAM, LPARAM <span class="synPreProc">import</span> sys <span class="synPreProc">import</span> collections WM_DROPFILES = <span class="synConstant">0x0233</span> GWL_WNDPROC = -<span class="synConstant">4</span> WINPROC = ctypes.c_void_p() drop_files = collections.deque() <span class="synPreProc">@</span><span class="synIdentifier">ctypes.WINFUNCTYPE</span>(ctypes.c_void_p, HWND, UINT, WPARAM, LPARAM) <span class="synStatement">def</span> <span class="synIdentifier">drop_func</span>(hwnd, msg, wp, lp): <span class="synConstant">&quot;&quot;&quot;D&amp;D用のコールバック</span> <span class="synConstant"> ファイルのドラッグアンドドロップイベント(WM_DROPFILES)を検出して、</span> <span class="synConstant"> ドロップされたファイル名を保持する。</span> <span class="synConstant"> ここでウィンドウ(tk)を使用するとハングアップするのでデータ保存だけ行う。</span> <span class="synConstant"> &quot;&quot;&quot;</span> hwnd = HWND(hwnd) wp = WPARAM(wp) lp = LPARAM(lp) <span class="synStatement">if</span> msg == WM_DROPFILES: count = ctypes.windll.shell32.DragQueryFile(wp, -<span class="synConstant">1</span>, <span class="synIdentifier">None</span>, <span class="synIdentifier">None</span>) <span class="synIdentifier">print</span>(count) <span class="synStatement">for</span> tmp <span class="synStatement">in</span> <span class="synIdentifier">range</span>(count): szFile = ctypes.c_buffer(<span class="synConstant">260</span>) ctypes.windll.shell32.DragQueryFile(wp, tmp, szFile, ctypes.sizeof(szFile)) <span class="synStatement">try</span>: drop_files.append( szFile.value.decode(sys.getfilesystemencoding())) <span class="synStatement">except</span> <span class="synType">UnicodeDecodeError</span>: drop_files.append( szFile.value.decode(<span class="synConstant">&quot;mbcs&quot;</span>)) ctypes.windll.shell32.DragFinish(wp) msg = ctypes.c_uint(msg) <span class="synStatement">return</span> ctypes.windll.user32.CallWindowProcW(WINPROC, hwnd, msg, wp, lp) <span class="synStatement">def</span> <span class="synIdentifier">dd_activate</span>(hwnd): <span class="synConstant">&quot;&quot;&quot;D&amp;Dを有効にする</span> <span class="synConstant"> :param int hwnd: 有効にするウィンドウのハンドル</span> <span class="synConstant"> :return: None</span> <span class="synConstant"> &quot;&quot;&quot;</span> ctypes.windll.shell32.DragAcceptFiles(hwnd, <span class="synIdentifier">True</span>) <span class="synStatement">global</span> WINPROC WINPROC = ctypes.c_void_p( ctypes.windll.user32.GetWindowLongPtrW(hwnd, GWL_WNDPROC)) ctypes.windll.user32.SetWindowLongPtrW(hwnd, GWL_WNDPROC, drop_func) </pre> MasaHero 2018年08月25日のツイート hatenablog://entry/17680117126968705363 2018-08-25T00:00:00+09:00 2019-02-18T23:00:53+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1033278432476418048'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1033278432476418048',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1033278432476418048"></div> </div> MasaHero 2018年08月23日のツイート hatenablog://entry/17680117126968705481 2018-08-23T00:00:00+09:00 2019-02-18T23:00:55+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1032640436471394305'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1032640436471394305',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1032640436471394305"></div> </div> MasaHero 2018年08月18日のツイート hatenablog://entry/17680117126968705603 2018-08-18T00:00:00+09:00 2019-02-18T23:00:56+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1030658137039073283'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1030658137039073283',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1030658137039073283"></div> </div> MasaHero 2018年08月15日のツイート hatenablog://entry/17680117126968705715 2018-08-15T00:00:00+09:00 2019-02-18T23:00:57+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1029683919333949440'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1029683919333949440',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1029683919333949440"></div> </div> MasaHero 2018年08月12日のツイート hatenablog://entry/17680117126968705814 2018-08-12T00:00:00+09:00 2019-02-18T23:00:59+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1028557066695192576'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1028557066695192576',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1028557066695192576"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1028553388038864896'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1028553388038864896',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1028553388038864896"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1028550893556228096'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1028550893556228096',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1028550893556228096"></div> </div> MasaHero 2018年08月05日のツイート hatenablog://entry/17680117126968705932 2018-08-05T00:00:00+09:00 2019-02-18T23:01:00+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1025891254259732480'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1025891254259732480',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1025891254259732480"></div> </div> MasaHero 2018年07月28日のツイート hatenablog://entry/17680117126968706055 2018-07-28T00:00:00+09:00 2019-02-18T23:01:01+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1023078072533360640'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1023078072533360640',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1023078072533360640"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1023075184666968064'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1023075184666968064',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1023075184666968064"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1023071858747420672'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1023071858747420672',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1023071858747420672"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1023070777304858629'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1023070777304858629',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1023070777304858629"></div> </div> MasaHero 2018年07月27日のツイート hatenablog://entry/17680117126968706193 2018-07-27T00:00:00+09:00 2019-02-18T23:01:03+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1022499201563996160'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1022499201563996160',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1022499201563996160"></div> </div> MasaHero 2018年07月17日のツイート hatenablog://entry/17680117126968706289 2018-07-17T00:00:00+09:00 2019-02-18T23:01:04+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1019180076041043969'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1019180076041043969',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1019180076041043969"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1019178188335865856'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1019178188335865856',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1019178188335865856"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1018931671549132800'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1018931671549132800',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1018931671549132800"></div> </div> MasaHero 2018年07月16日のツイート hatenablog://entry/17680117126968706426 2018-07-16T00:00:00+09:00 2019-02-18T23:01:05+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1018848133823033344'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1018848133823033344',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1018848133823033344"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1018847144009195520'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1018847144009195520',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1018847144009195520"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1018846309367926784'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1018846309367926784',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1018846309367926784"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1018844642241138690'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1018844642241138690',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1018844642241138690"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1018843142764814337'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1018843142764814337',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1018843142764814337"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1018841609566326785'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1018841609566326785',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1018841609566326785"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1018838948485959680'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1018838948485959680',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1018838948485959680"></div> </div> MasaHero 2018年07月14日のツイート hatenablog://entry/17680117126968706610 2018-07-14T00:00:00+09:00 2019-02-18T23:01:07+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1018141908751831040'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1018141908751831040',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1018141908751831040"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1018071997236953090'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1018071997236953090',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1018071997236953090"></div> </div> MasaHero 2018年06月12日のツイート hatenablog://entry/17680117126968706727 2018-06-12T00:00:00+09:00 2019-02-18T23:01:08+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1006484192975192065'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1006484192975192065',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1006484192975192065"></div> </div> MasaHero 2018年06月09日のツイート hatenablog://entry/17680117126968706846 2018-06-09T00:00:00+09:00 2019-02-18T23:01:09+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1005334489046716416'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1005334489046716416',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1005334489046716416"></div> </div> MasaHero 2018年06月03日のツイート hatenablog://entry/17680117126968706957 2018-06-03T00:00:00+09:00 2019-02-18T23:01:11+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1003176801886060546'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1003176801886060546',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1003176801886060546"></div> </div> MasaHero 2018年05月28日のツイート hatenablog://entry/17680117126968707086 2018-05-28T00:00:00+09:00 2019-02-18T23:01:12+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1000806017561657345'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1000806017561657345',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1000806017561657345"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1000804845186703360'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1000804845186703360',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1000804845186703360"></div> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-1000781009946734592'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('1000781009946734592',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-1000781009946734592"></div> </div> MasaHero 2018年05月05日のツイート hatenablog://entry/17680117126968707229 2018-05-05T00:00:00+09:00 2019-02-18T23:01:13+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-992759556458467329'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('992759556458467329',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-992759556458467329"></div> </div> MasaHero 2018年04月16日のツイート hatenablog://entry/17680117126968707341 2018-04-16T00:00:00+09:00 2019-02-18T23:01:14+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-985838632110977025'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('985838632110977025',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-985838632110977025"></div> </div> MasaHero 2018年04月08日のツイート hatenablog://entry/17680117126968707471 2018-04-08T00:00:00+09:00 2019-02-18T23:01:16+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-982954328678805504'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('982954328678805504',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-982954328678805504"></div> </div> MasaHero 2018年04月05日のツイート hatenablog://entry/17680117126968707609 2018-04-05T00:00:00+09:00 2019-02-18T23:01:17+09:00 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f)… <div class="twitter-tweet-wrapper"> <script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-981884636409356288'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('981884636409356288',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-981884636409356288"></div> </div> MasaHero