DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

マグネシウム洗濯を試してみた

皆さんは「マグネシウム洗濯」というものをご存知でしょうか?

 

商品としては「洗濯マグちゃん」という商品が出ていて、中身は純粋なマグネシウムボール。

 

<洗濯マグちゃん>

 

マグネシウムは水と反応して水素を発生させます。

水酸化マグネシウムが水に溶ける事によって水がアルカリ水となり、皮脂汚れとアルカリ水が反応して石けんの役割をする。という機序で汚れを落とすそうです。

しかもその効果が半年とか一年とか持つそうで、これはスゴイ!ということで、半信半疑ながら面白そうなので早速マグネシウムボールを500g注文しました。 

f:id:DreamerDream:20201124131630p:plain

マグネシウムボールはAmazonで普通に売られています。

洗濯マグちゃん1個の中には50gのマグネシウムボールが入っているので実に10倍のマグネシウムボールです。

マグネシウムってマグネシウムリボンのように発火するイメージが強かったのですが、2mm以下のマグネシウム粉末が消防法上発火危険物に指定されているということで今回取り扱うのは6mmの粒は大粒なので問題無いそうです。

 

マグネシウムボールが届いて初めて見た時「え?これってアルミちゃうの?」と思いました。

光沢も重さもアルミにそっくりなんですよ。

ちなみにアルミの融点が660℃、マグネシウムが650℃、比重はがアルミが2.7、マグネシウムが1.7とどちらも軽量の似たような金属なので素人がパット見た目では判断できません。

 

比べ方は簡単!マグネシウムは水に入れれば水素が発生します。

f:id:DreamerDream:20201124131642p:plain

これは間違いなくマグネシウムです。

このツブツブをを洗濯ネットに入れると完成です。

f:id:DreamerDream:20201124131658p:plain

500gは結構ズッシリしているので今回は半分の250gにしました。 (といってもマグちゃんの5倍です)

 

これと洗剤をいつもの半分で洗濯すると素敵な効果が得られるというのですが、実際の洗濯後には「うん、いつも通り普通に洗えてる」以上の感想は持てませんでした。

まあマグネシウムを入れない場合と比べてないので、単純に今までが洗剤多すぎただけでは?という説も考えられますが(比べるのも面倒だし時間かかるので)、洗剤の量は半分でしばらく継続してみようと思います。

ちなみに、洗濯乾燥機なので洗濯後の乾燥までしています。

 

で、2回目の洗濯後にネットを開けてみたのがコチラ↓

f:id:DreamerDream:20201124131741p:plain

マグネシウムボールめっちゃ汚れてるやーんっ!

真ん中の一個だけ新品を入れてみたのですが、明らかにテカリが違いますね(反射してるので解り辛くなってるけど)。

 

比べてみるとこうです↓

f:id:DreamerDream:20201124131727p:plain

なんか表面ががっつり酸化しています。 洗濯2回だけですよ。

 

水にいれると殆ど反応しなくなっています。(左:旧、右:新)

f:id:DreamerDream:20201124131908p:plain

この状態で本当に半年も使えるの?無理じゃないかなあ?

 

ということで、クエン酸マグネシウムボールの効果を復活させる実験をしました。

 

【注意】マグネシウムクエン酸に浸けると水素が発生しますので換気の良い場所で行ないましょう。

 

表面の酸化したマグネシウムボールにクエン酸を加えるとこんな感じで反応します。

マグネシウムボールをクエン酸溶液に浸けて比較してみた

 

3分ぐらい浸けたら一部だけ新品の輝きを取り戻せました(左)。

今回はクエン酸を上からパラパラと振りかけただけなので、おそらくクエン酸溶液の濃い部分だけ効果があったのでは?と思います。

f:id:DreamerDream:20201124131844p:plain

マグネシウムボールの復活をさせる際はしっかり混ぜながら行なうと良さそうです。 

マグネシウムが存在している限り反応が続いてマグネシウムが小さくなっていくので最長でも5分ぐらいで切り上げましょう。

 

僕の場合、洗濯の度にいちいちこの復活祭を執り行うのも面倒なのでクエン酸を洗濯時に少量混ぜて使うことにしました。(完全に自己責任です)

クエン酸には柔軟剤のように静電気除去する働きがあるので一石二鳥です。

 

マグネシウム洗濯で検索することに関しては結構いろいろな詳しいサイトがあります。

デメリットはあまり無い感じなので、継続してみて解った点があればまたブログに書きます。

 

 

マグネシウムボールは通常5mmタイプと6mmタイプが購入出来ます。

袋が破れた時に洗濯槽の穴に落ちにくいように6mmタイプの方をオススメします。6mmというと一般的なBB弾のサイズです。

 

洗濯ネットは100均にもあるけれど、丈夫そうな「マグネシウムネット」というそのものマグネシウムを入れる用のものがAmazonに出ています↓(へえ、しらなかった)

今回は以上です。

鬼くるみ割っちゃいました 硬い鬼くるみの割り方のコツ

殻の堅ーい「鬼くるみ」とやらをいただきましたので割ってみます。

ちなみに、よくお菓子とかで使われているのは「菓子くるみ」というもので殻が薄くて人によって(何か拳法とかの達人)は手で割れるそうですが、鬼くるみは達人でも無理!

f:id:DreamerDream:20201112121545p:plain

 

鬼くるみ用の割り機というものがアマゾンで売られています。

片方が受け皿になっていて、もう一方には刃が付いています。 

 

僕の実家には古いこんな器具がありましたので今回はこれを使います。

f:id:DreamerDream:20201112121557p:plain

 

まずはくるみの殻の合わさっている方をよ〜く観察します。

表と(どっちが表か解らないけど)、

f:id:DreamerDream:20201112121608p:plain

裏をよ〜く見ます。

f:id:DreamerDream:20201112121618p:plain

 

どっちかというと真っ直ぐな方(今回の場合は後者)に真っ直ぐに刃を置いて

f:id:DreamerDream:20201112121627p:plain

ギュッと握るとパリッと気持ちよく刃が入ります。

f:id:DreamerDream:20201112121640p:plain

綺麗に入るとこんな感じです(動画)↓


鬼ぐるみ割り

 

綺麗に刃が当たっていると無理に力を入れる事無く割れます。

刃を当てる角度や面が違うとめちゃめちゃ力が必用ですし、割れても殻が欠けてしまいますし機具の刃にも良く無いです。

「あれ?硬い!!」と思ったら無理矢理押しつぶさず逆の面や少し角度を変えて試すのがお勧めです。

※無理に割ると殻が弾け飛んで危険ですので慣れないうちは上からタオル等を被せておきましょう。

 

くるみ自体が芽を出す時に割れるようになっているので必ず何処かは割れやすくなっています。

 

綺麗に割れるとこんな感じ。

f:id:DreamerDream:20201112121659p:plain

別のくるみも。

f:id:DreamerDream:20201112121730p:plain

 

最初は難しいですが、一度コツを掴むと気持ちいいほどどんどん割れます。

f:id:DreamerDream:20201112121715p:plain

 

ということで、今回は鬼くるみの割り方の紹介でした。 

備忘録 CentOS7アップデート

CentOS7のコアアップデートの自分用備忘録

f:id:DreamerDream:20201114083026p:plain

いつものようにLinuxのアップデートをしようとしましたら

sudo yum update

エラー!

Error: Package: kmod-kvdo-6.1.3.23-5.el7.x86_64 (base)
Requires: kernel >= 3.10.0-1133.el7
Installed: kernel-3.10.0-862.2.3.el7.x86_64 (@updates)
kernel = 3.10.0-862.2.3.el7
Installed: kernel-3.10.0-862.11.6.el7.x86_64 (@updates)
kernel = 3.10.0-862.11.6.el7
Installed: kernel-3.10.0-957.1.3.el7.x86_64 (@updates)
kernel = 3.10.0-957.1.3.el7
Installed: kernel-3.10.0-1062.1.1.el7.x86_64 (@updates)
kernel = 3.10.0-1062.1.1.el7
Installed: kernel-3.10.0-1127.8.2.el7.x86_64 (@updates)
kernel = 3.10.0-1127.8.2.el7
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest

これは以前にyum.confで勝手にカーネルのアップデートをしない用に仕掛けていたもので(過去記事↓)、この場合いつも以上に念入りにバックアップ作業をしてから作業をします。

dreamerdream.hateblo.jp

でないと予想外のエラーでサーバーが使えなくなる可能性もある危険な作業なのです。

dreamerdream.hateblo.jp

 

 

HDDバックアップを取っておいてから

sudo nano /etc/yum.conf

 で

#exclude=kernel*

コメントアウト

 

カーネルバージョン確認

sudo cat /etc/redhat-release

CentOS Linux release 7.8.2003 (Core)

 

アップデート

sudo yum update

(ドキドキするながーい時間・・・)

Complete!

が出たら一安心!

 

「きちんと起動してくれよー!」とお祈りしながら再起動

sudo reboot

自前のサービスの動作確認

カーネルバージョン再度確認

sudo cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

完了! 

Googleクラウドプリントサービスが終了しちゃうからRaspberryPiを使ってプリントサーバーを立ち上げた

今まで古いパソコンから印刷物を印刷するのに最近のプリンターの場合ドライバが提供されていないのでGoogleプリントサービスを介してプリントしていました。

ところが、残念なことに2020年をもってサービスが終了するというではありませんか。

f:id:DreamerDream:20201113135155p:plain

まあ無償で提供されていたものなので文句は言いません。

 

ということで代替案としてドライバーの無いPCからプリンタ接続するためにRaspberryPiでプリントサーバーを構築することにしました。

 

図にするとこういうことです。

f:id:DreamerDream:20201113142550p:plain

パソコンにプリンター用ドライバがインストール出来ないのでプリンターへ印刷データを直接送ることが出来ません。

そこで、プリントサーバー(図の場合RaspberryPi)を介して印刷データを送るということです。

 

今まではGoogleプリントサービスがこのプリントサーバーの役割を担ってくれていたのですが、これをRaspberryPiに置き換えるということです。

 

RaspberryPiのOSはraspbianですからプリンタドライバも最新のものに対応しているハズです。

<参考>

Raspberry Piでプリントサーバ、Part1 Windows & Mac編 | ものづくりエクスペリメント

 

まずはお決まりのアップデート作業です。

sudo apt-get update

sudo apt-get upgrade

 

プリントサーバーのcupsをインストールします。

sudo apt-get cups

 

インストール出来たらcupsの設定ファイルを弄ります。

sudo nano /etc/cups/cupsd.conf

追加した場所

# Only listen for connections from the local machine.
#Listen localhost:631 #<= コメントアウト
Listen 631 #<=追加
Listen /run/cups/cups.sock

.

.

# Restrict access to the server...
<Location />
Order allow,deny
Allow @Local #<=追加
</Location>

# Restrict access to the admin pages...
<Location /admin>
Order allow,deny
Allow @Local  #<=追加
</Location>

# Restrict access to configuration files...
<Location /admin/conf>
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow @Local #<=追加
</Location>

 

 

ユーザーをlpadminグループに追加します。

sudo adduser pi lpadmin

サービスを再起動させて設定を反映させます。

sudo service cups restart

 

ブラウザからIPアドレスと上で設定した接続ポート番号を打ち込みます。(https接続では無いと警告されます)

[IPアドレス]:[ポート]

f:id:DreamerDream:20201113135029p:plain

 

 

無事に接続できたらこのような画面が現れます。

f:id:DreamerDream:20201113125559p:plain

CUPS管理者向けメニューからプリンターとクラスの追加を選択します。

f:id:DreamerDream:20201113134611p:plain

ログイン画面が現れたらRaspberryPiのユーザー名とパスワードを入力しましょう。

 

プリンターの追加を選択します。

f:id:DreamerDream:20201113134628p:plain

 

一覧に使用可能なプリンターが現れます。

今回の目的の「Canon TS8130」はワイヤレスで使用可能なようです。

f:id:DreamerDream:20201113134639p:plain

 

プリンターに解りやすい名前を付けて完了です。

f:id:DreamerDream:20201113134655p:plain

 

パソコン側で共有プリンターを探すと@raspberrypiというのが見えています。

f:id:DreamerDream:20201113134716p:plain

先ほど設定したものが反映されています。

 

あとはデフォルトのプリンタとしてプリントサーバーを登録すればパソコンから印刷データが送れます。

f:id:DreamerDream:20201113134750p:plain

 

 

ちなみに、古いパソコンからプリンターを見た場合はこうなります。

f:id:DreamerDream:20201113134706p:plain

「ドライバまたはプリンタの機種を選択してください」

と表示され、そのままでは使えないことが解ります。

 

プリンターを使う場合はRaspberryPiを起動させておく必用がありますがプリントサーバーはそこまで処理能力を問われないのでRaspberryPi Zeroなら消費電力も少ないので常時起動させるにはうってつけでしょう。

PayPal決済をsandboxからliveにしたらエラーが出て決済出来なくなった -envリクエストを無くして解決-

前回、Paypalを使った決済システムを導入して「これは良いです!使えます!」と豪語していたのですが・・・

<前回記事>

dreamerdream.hateblo.jp

 

sandboxのテストを終えて実際にliveで本アカウントのIDを使って決済をテストしてみましたところ、下記のようなエラーが出て決済へ進めなくなってしまいました。

checkout.js:2844 ppxo_unhandled_error Object {stack: "Error: Invalid env: live↵ at Object.props.env.v…://www.paypalobjects.com/api/checkout.js:4929:37)",

 

どうやら今までのテストで、{env:'sandbox'}としていたリクエストが{env:'live'}と変更されたものに対して「そんなん知らん!」とお叱りを受けている様子です。

 

PayPalAPI許可設定の間違いなのか?コードに問題があるのか?はたまたAPIの許可に時間がかかっているだけなのか?

色々調べて半ば諦めかけていたのですが、丸一日かけて解決策を発見しました。

 

なんと!「envリクエストそのものを無くす」という手段で解決しました。

 

Djangoテンプレートだとこうなります。

<テンプレートの問題の一部分だけ抜粋>

paypal.Button.render({
{% if paypal_mode == 'sandbox' %}env: '{{ paypal_mode }}',{% endif %}
payment: function (resolve, reject) {

 

要するに、paypal_modeが'sandbox'じゃ無い場合はenv:自体を消す。

というコードです。

 

実際に自分のPayPal口座から決済をしてみましたが何事も無かったかのようにスムーズに決済完了しました。

 

丸一日悩んでなんじゃそりゃ!という話です。

しかし、「live」とすればOKなはずで、しかも何処を調べてもそのような記載は無いので若干気持ち悪いのですが、同じように悩んでいる方もあるんじゃないかと思い、備忘録として残しておきます。

 

また、「その解決策は絶対ちがうぞ!!」という方がおられましたら正しい情報のご一報をお待ちしています。

f:id:DreamerDream:20201112103600p:plain

ちゃんと動けば、Paypal決済はすごく良いですよー! 

DjangoサイトにPayPal決済を導入する 備忘録

個人で開発しているWebサービスにこの度PayPal決済サービスを付加することにしました。

 

PayPalは以前にAmazonのレビュー依頼で作っておいたのでそれをビジネスアカウントにグレードアップして使用することにしました。

dreamerdream.hateblo.jp

 

PayPalの魅力は何と言っても「会費無料」「世界でトップシェアの決済サービス」というところではないでしょうか?

手数料は決済の都度発生しますが、クレジットカードに銀行口座振り込み、おまけに仮想通貨にまで対応していて、尚かつ利用者がサイト上にカード情報を入力しなくて良いという安心感があります。

PayPalは開設費用は年会費も不要なので僕のような弱小サイトには強い見方です。口座が動かなければ完全無料運用可能なんですから、とりあえず試しに組み込むだけというのもアリ。

 

ビジネス用アカウントを作って本人確認が取れていればPayPal決済用のボタンをPayPalサービス上で作れるのですが、そのままだとこちらが支払確認をしてから顧客にサービスを提供する。という手作業が必用になってしまいます。

 

それらを自動化するためにはPayPalAPIを利用する必用があります。

 

とはいっても殆どこちらの先輩の書かれている記事の通りです。

akiyoko.hatenablog.jp

こちらの記事内容をこのまま参考資料として、僕自身が再構築する時に迷わないために以下に記すことにしました。

 

 

APIを利用するためのSDKgithubサイトで公開されているのでPython用のものをcloneするだけです。

github.com

 

SDKをダウンロードしたいディレクトリで

sudo git clone https://github.com/paypal/PayPal-Python-SDK

を実行するとその場にSDKディレクトリが展開されるので、

 

利用するpythonコードファイル(Djangoのview.pyなど)から「paypalrestsdk」ディレクトリが見えるようにインポートするだけ。

例)ソースコードファイルと同じディレクトリ内にSDKディレクトリをダウンロードした場合

import sys

sys.path.append(os.path.join(os.path.dirname(__file__), './PayPal-Python-SDK'))
import paypalrestsdk

 

とすることでpaypalrestsdkが利用出来るようになります。

paypalrestsdkには辞書形式で設定値を渡すだけだから設定が面倒であれば直書きでも動作可能。

 

実際に運用開始する前にデベロッパーページにて「sandbox」用のアカウントを売り手、買い手の2つ作って実際のお金を動かさずに動作試験することが出来ます。

developer.paypal.com

 

 

<sandboxで生成された試験用アカウント>

f:id:DreamerDream:20201105135903p:plain

下のコードのpaypalrestsdkに入力する[PAYPAL_CLIENT_ID],[ PAYPAL_CLIENT_SECRET]はここで作った売り手のアカウントのIDとシークレットキーを入力します。(実運用時には自分のアカウントのものに置き換えます。)

参考ページから転用(views.py)

paypalrestsdk.configure({
  'mode': [試験運用には'sandbox'、実際の動作には'live'を入力],
  'client_id': [PAYPAL_CLIENT_ID],
  'client_secret':[ PAYPAL_CLIENT_SECRET],
})


payment = paypalrestsdk.Payment({
  'intent': 'sale',

  # Payer
  'payer': {
    'payment_method': 'paypal',
  },

  # Redirect URLs
  'redirect_urls': {
    'return_url': '/execute-payment', #決済完了時のアドレス
    'cancel_url': '/pay', #キャンセル時のアドレス
  },

  'transactions': [{ 
    # Item List
    'item_list': {
    'items': [{
      'name': [商品の名前],
      'sku': [支払の内訳],
      'price': '100', #価格
      'currency': 'JPY', #日本円はJPY アメリカドルならUSD
      'quantity': 1, #量
    }]
  },
  # Amount
  'amount': {
    'total': '100', #合計金額
    'currency': 'JPY',
  },
  'description': [説明書き],
  }]
})

 

 

 

上のコードは参考ページのhtmlファイルに置かれているjavascryptコードの

paypal.request.post('/create-payment', {csrfmiddlewaretoken: '{{ csrf_token }}'})

この部分、例の場合であれば「/create-payment」に対してPOSTリクエストが送られ、Djangoからjson形式で決まった型でデータが返信されます。

この形式はカッチリと決まっているようで、任意のキーを付加したり削除したらエラーになります。

 

決済が完了したら

/execute-payment

が呼ばれて完了します。

 

非常にザックリした図ですけれど、

f:id:DreamerDream:20201105134501p:plain

PayPal決済ボタンでcreate情報取得するアクセスポイントを自サイトに設置して、

決済ボタンが押されたら自サイトにcreate情報アドレスへPOSTして、自サーバーからはjsonで支払情報を返す。

その後スクリプトがそのままPayPalサーバーと支払情報等をやりとりして(ブラックボックス)、決済完了後に完了画面へ推移する。

という流れのようです。

 

 

参考サイトではpaymentの情報をそのままDjangoのテンプレートで出力していますが、決済結果をjsonで保存する場合は一度str形式に変換してから辞書形式に直してjson形式で保存するという方法になるようです。

paymentはpaypalrestsdkの独自クラスのようでそのままでは辞書変換出来ませんでした。

文字列→辞書形式変換には演算可能なevelよりastクラスを使のが安全です。

note.nkmk.me

paypal形式を辞書形式に変換

import ast

 

str_payment = str( payment )
dic_payment = ast.literal_eval( str_payment )

 

あとは完了画面で有料サービスのURLやコンテンツのダウンロードを提供することができる他、取引毎に生成される固有のIDが「payment.id」で取得できるので、自サーバーにIDを保管しておけば決済完了時にユーザー毎の決済を確認することも出来ます。

これでユーザー毎にサービスを提供するなど自動的に任意のサービスをDjango側から提供することが出来ます。

 

ちなみに、コードのどこかが間違っていたり、POST出来なかったりすると以下の画像が一瞬だけ表示されて消えてしまいます。

f:id:DreamerDream:20201105140005p:plain

 

 

非常にザックリした内容でしたが、あくまで自分用の備忘録ですのでご了承ください。

 

 続↓ 実際の決済でエラーが出たので対処しました。

dreamerdream.hateblo.jp

 

「HelloThinkPHP」って何? サーバーのセキュリティー対策を怠らないようにしましょう

先日、僕が公開しているVPSサーバーのログを眺めていましたらこのような攻撃を受けていました。

 

GET /index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=md5&vars[1][]=HelloThinkPHP HTTP/1.1" 301 362 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"

 

HelloThinkPHPって何?とググってみましたらズバリな記事を発見しました。

www.orangeitems.com

中国では有名なローカルフレームワークの1つ「ThinkPHP」を使ったサーバーに直にこのリクエストを送りつければ乗っ取れるという非常に簡単な脆弱性を狙ったものだそうです。

2018年の記事なので既に対処済みのサーバーも多いと思うのですが未だにbotが古いサーバーを探し回っているのですね。

 

以前の記事にもこのようなフレームワークを狙った攻撃について書いた事がありますが、一様に同じ構造を持ち尚かつ有名なフレームワークは一度脆弱性が発見されるとこのようなbotが巡回して芋づる式に被害を受けてしまいます。

 

日本ではワードプレスを使ったブログ運営が主流になっていますがワードプレスも定期的にアップデートしておかないと古いプラグイン等で乗っ取り被害が出ている事もありますので人ごとではありません。

dreamerdream.hateblo.jp

dreamerdream.hateblo.jp

 

今回は注意喚起ということで簡単に纏めさせていただきました。

f:id:DreamerDream:20201019125400p:plain

 

https://cdn.profile-image.st-hatena.com/users/DreamerDream/profile.png私、(PONさん (@o_n_pon) | Twitter)を応援してくださるお優しいかたは15円から投げ銭可能ですので↓よりカンパをお願いしますm(_ _)m

kampa.me