ファーバーカステルのエモーションが壊れたでござる

ファーバーカステルというメーカーのエモーションという名前のボールペンが壊れた。ヤフオクで手に入れて喜んだのも束の間、リフィルを確認したあと首軸を締めようとしたら力加減がわからないままやったらそのまま首軸のネジをねじ切ってしまった。

009これがその壊れた状態。文房具歴は結構長い私だが、こんな壊れ方をしたのは初めてだ。ファーバーカステルというメーカーの文房具を扱うのも初めてだったが。ボールペンや万年筆のこの部分は大抵は頑丈にできているからそのつもりでしっかり回そうとしたらこの有様である。経年劣化・・・・もあるだろうが、この軸に使われているプラスチックの材質の印象がやわらかそうというか安っぽそうというか明らかに強度不足に思える。ドイツ製だぜ?3000円以上するボールペンだぜ?という慢心があったのかもしれない。100均で売ってるボールペンでもこんな壊れ方はしない。
胴体の木軸が修理ついでに外れてしまって中のプラスチック軸を見てみたが、これはあのガンプラのザハイパーバズーカの素材とよく似ている。うん、そりゃ折れるわ。

嘆いていても始まらないのでとりあえず治すことを考えてみる。10年以上使った上でこの壊れ方なら今までご苦労様と言うことをできるかもしれないが、配達されてきた初日にこれなのでさすがに諦めきれない。もしかして不良品を掴まされたのかも・・・と思ったりしてみたが完全に自業自得の結果で、しかも壊れる前には一応筆記してみて「このペン使いやすいわー」とか言ったりしてたので被害妄想はみっともない。もうブログのネタにするぐらいしか私には救いがない。

ほんのすこしだけこのエモーションというボールペンで筆記することができたが、評判通り書きやすかった。壊れたというレビューもいくつか目にしていたので気にはなっていたがまさか自分が壊すことになるとは思わなかった。折れることを心配しないといけないボールペンなんて有り得ない。このエモーションはデザインと書きやすさは素晴らしいが胴体は設計ミスであると思う。それかコスト削減しすぎたか。この折れた部分は筆記時に負荷がかかるのはもちろん、通常時でも内部のスプリングによるペン先の収容する構造のため負荷がかかるようになっていてこの貧弱なプラスチック素材では素人目にも駄目なのがわかる。硬質なプラスチック素材かステンレスなどの金属素材でないともたない。この梨の木のモデルは一番安いタイプで上位グレードの製品も存在しているが、この内部構造の欠陥が解消されていない限りこのペンは他人にオススメできない。

だが、治すとはいっても私にできることは限られている。まさかファーバーカステルの本社に高額な修理費用覚悟で修理依頼するわけにもいかないので自分で修理するわけだが、まあ、接着剤でくっつけることしかできない。接着剤といっても色々種類があるので私が入手できそうな範囲での選択肢としてプランは2つ

  • アロンアルファ
  • ダイソーで買った格安の接着剤

普通、壊れた物を直そうとして使う接着材としてはアロンアルファが思い浮かぶだろう。私もまずはそれで直すことを試みようと近所のスーパーで購入してきて接着してみた。だが、結果は失敗。アロンアルファは確かに瞬間で強力にくっつく。作業中に指と指がくっついて焦ったほどだ。しかし、このケースのような壊れたプラスチックをくっつけるのには向いていなかったようだ。アロンアルファに向いている接着方法はある程度の面積があって垂直方向に引張る力に対するという場合に最も適しているらしい。このボールペンの場合はどちらでもなくて接着する面積が小さすぎて、さらに力のかかり方が回転方向であるため接着をキープできなかった。せめて接着面積がもう少し広ければなんとかなったかもしれないが1ミリにみたない首軸のプラスチック部分なのでアロンアルファで接着することは諦めた。

010次に考えたのがダイソーで前に買っておいたG17という接着剤。アロンアルファでだめだったのにそれより安っぽい接着剤で大丈夫なのかとも思ったがとりあえずくっつけてみた。この接着剤の特徴は、黄色いドロっとした液体で時間が経つにつれ徐々に硬化していくという感じ。粘性が強く硬化までに時間がかかる。速乾と思いっきり書いているが嘘である。だが、時間をかけて硬化するのは欠点ではなく、その間に接着位置を微調整して正しい位置に修正できるので個人的には悪くないと思っている。正直扱いやすい接着剤ではない。うまく使うには特徴をつかむまで色々接着して慣れるしかない。私も初めて使ったときはダイソーの接着剤だしなぁ・・・と思ったりしていたが、何回も使っているうちには「まあ、使える接着剤か・・・」と思えるようになっている。一番接着剤に求められる強力に接着できるかどうかという点について、過去に色々接着してみた私の経験上はそれなりに満足できている。で、接着した結果は上の画像のような感じとなっている。見た目は多少汚くなってしまったが、この接着材は微調整がきかなくてドバっと出てしまうので大抵こんな感じになる。このブログ書いている時点ではまだ乾燥中で強く動かそうとするとグラグラする感じだが、それなりに強く接着ができているような気はしている。というかこれが駄目なら他には手がないのでがんばってもらうしかない。成功したなら後日追記する。追記しなかったら失敗したのかもしれない。でもこれが仮に直ったとしてもだよ?今後末永く愛用するというわけにはいかないし、筆記するたびに折れないか心配しながら扱わないといけないということに今気づいた。

海外通販で注文したラズベリーパイゼロが届いた

pimoroniというラズベリーパイを中心に売っている海外の通信販売サイトで注文したラズパイゼロが届いた。注文から到着まで約1周間強といったところ。普通の通販と違って海外からなので最悪届かないんじゃないかと思っていたが無事に配達された。

rp_1注文したものはラズベリーパイのスターターセットとマグカップ。マグカップは想像していたよりちょっとデカかった。外人仕様だからだろうか。ラズベリーパイゼロのセットが10英ポンド、マグカップが約6英ポンド、送料とか手数料が5.5英ポンドで合計約22英ポンド。日本円で約3000円のお買い物となった。

rp_2こんな感じで梱包されてきてちょっとワロタ。ラズベリーパイゼロの小ささが実によくわかる。

rp_3あらかじめ注文する前から覚悟していたが、このラズベリーパイゼロはGPIOが標準で取り付けられていなくて、必要なら自分でピンヘッダーをはんだ付けしなければならない。そのためにピンヘッダー付きのスターターセットを注文したのだけれども。

rp_4で、はんだ付けしてみた。ほぼはんだ付け未経験の私だったが、初めてにしてはまあまあの出来ではないだろうか。

rp_5画像の上の列右から2番めのピンのはんだ付けだけちょっと明らかに失敗してしまったが。ランドとピンをハンダで温める時間が長すぎてしまってピンヘッダのプラスチックの土台が溶けてしまった。温めないとうまくハンダが流れないし、温めすぎるとピンヘッダを傷めるしでなかなかタイミングが難しい。多すぎるよりかはということでハンダの量は少なめに必要最低限にということを目指してみた。

GPIOを使った実験はまた今度の機会に。

Pythonのメリット・デメリット

ラズベリーパイで遊んでいると避けては通れないプログラミング言語のPythonについて思ったことを記してみる。

メリット

低スペックマシンでも動く
ラズベリーパイでも
開発がやりやすい
コンパイルしなくていいってストレスフリー
linux系だと大体インストールされてる
うん
情報がたくさん

デメリット

遅い
for文とかループ処理だと時間がやたらかかる印象。特にループと再起を組み合わせたら遅さが実感できる。マシンスペックではどうにもならない。多分PHPより遅い。
玄人向け
とっつきやすいけどパフォーマンスを出すには工夫がいる。あと用途も専門的な雰囲気。

まだ触り始めたばかりであまりよくわかっていない。だが、コーディングはしやすいと思った。ウェブとか高速処理が必要な用途とかには向いていないというのもなんとなくわかった。そういうのはPHPとJAVAでいい。

更新プログラムを確認しています・・・が終わらない問題

またこの問題で嵌まってしまう。前にも苦しんだが、今日OSを再インストールしてみたところやはり苦しんでる。いろいろググって調べてみたんだがどうにも進まなかったが、なんとか先に進むことができたので誰かの役に立つかもしれないので記しておく。最低限やることだけ。

まずやること

  • 更新プログラムの自動確認を切る
  • インストールした直後の状態ではWindows Updateの更新を起動時に自動実行するように設定されている。これがまずい。タスクマネージャーのプロセスを確認すると見つかるwusa.exeというプロセスがそれである。Windows Updateに問題があるのに、それが起動時に勝手に実行されてしまうのがさらに問題というわけ。コントロールパネルのシステムとセキュリティのWindows Updateから更新プログラムの確認でその設定ができるので、何もしないように設定する。設定したら一度再起動するといいと思われる。

    次にやること

    更新プログラムの問題をググっていると個別に更新プログラムをインストールしたらいいとかそういう情報があるが、その場合は自分のOSにあった更新プログラムをインストールするように気をつける。つまり32bitなら32bit用の更新プログラム、64bitなら以下略。当たり前のことだが、どうにもならなくてパニくってるとうっかり間違えることがあるので。64bitなら更新プログラムのファイル名に64bitと書いてるけれど32bitならx86と書いてあるのがちょっと紛らわしい。

    上記はごくごく基本的な事項だけれど、どうにも更新プログラムの確認が終わらないという人は試してみてもらいたい。

    ラズベリーパイ3に無線でssh接続できなくてハマった

    ラズベリーパイでサーバーを構築して見た時の話。無線lanの設定で固定ipを割り当てて外部からssh接続しようとしたらホストが見つかりませんとエラーが表示される。有線ケーブルを接続するとなぜか無線lanに割り当てたipに対して接続できる(それじゃ無線の意味がないけれども)。

    で、原因は、電源にあった模様。コマンドラインでiwconfigを実行すると

              Power Management:on
    

    という項目がある。これをoffにしてみたところ、無線の状態でもssh接続が可能になった。設定方法は、/etc/network/interfacesを編集して、

    #auto eth0
    iface eth0 inet manual
    
    allow-hotplug wlan0
    iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    wireless-power off 
    

    上記のような感じに付け加える。そして再起動。これでssh接続できるようになった。

    importerror: No module named cryptography.hazmat.backends paramiko

    備忘録。paramikoをインストールしてpythonで実行してみようとしたらimporterror: No module named cryptography.hazmat.backendsというエラーが発生したのでその解決方法をメモ。だが、色々やりすぎてわからなくなったので関係ありそうなのをざっと羅列する。

    • apt-get install python-dev
    • apt-get install libssl-dev
    • apt-get install libffi-dev
    • pip install paramiko
    • pip install cryptography –force-reinstall ←これ重要

    ざっとこんなコマンドを実行してたらparamikoが動くようになった。

    サーバーを監視するサーバーを立てることをダラダラ考えてみる

    今現在のところ私はサーバーを複数台稼働させているのだけれど、数が増えてくると手間がかかるため一台一台順調に動いているかどうかチェックするのが煩わしくなってくる。そこで、その問題を解消するために、サーバーを監視するサーバーを立てるのはどうかと思った。サーバーが1台や2台だったらそんなことをする必要はないのだけれど、3台4台、あるいは5台6台となってくると・・・やはり必要かなと。監視サーバーにアクセスするとすべてのサーバーの状況が一瞬でわかるような構成を考えていて、まあ監視サーバーだから当然だけれども。

    ぶっちゃけて言うと、今自分が使っているウインドウズで、サーバーの状況を取得するマクロを作ってそれをバッチファイルで定期的に実行して結果を適当なファイル形式で自分が見やすいように出力するようにしたら監視サーバーを立てることは必要ないような気がする・・・。あるいはそれをWindowsアプリケーションとして作ればもっと使いやすく構築することもできるかもしれない。監視サーバーはあくまで趣味として、勉強として、作る。

    監視サーバーとしての必要な要件

    • 24時間常時稼働
    • 稼働中のサーバーが問題無く稼動しているかどうかのチェック

    とりあえず最低限の要件を満たせればいい。稼働中のサーバーが稼働しているかのチェック方法は、その監視サーバーからリモートアクセスしてレスポンスが返ってくればとりあえず稼働していると見なす。もっと踏み込んでアプリケーションが正常に処理しているかとかもチェックした方がいいが、それはおいおい考えていくとして。

    監視サーバーとして必要な具体的なソフトウェアなど

    • ubuntuかlinuxならなんでも
    • python
    • mysql
    • cron
    • php(※pythonでも可)
    • html,css
    • apache

    つまり、監視サーバーは定期的に稼働中の各サーバーにアクセスして、その結果をDBに保存(例えばサーバーの負荷の状態やアクセス可否など)、その結果をウェブアプリケーションとしてHTML出力、ウェブブラウザからアクセスして確認できるようにする・・・みたいな感じ。手間がかかるだけで難しいところは多分ないと思われる。この方法のメリットはウェブサーバーを立てるから外出先からでも容易にチェックすることができるという点。

    myriこのシステムを構築するために私が思う最適なマシンは、ラズベリーパイであると思う。現時点では。噂でラズパイはすごいと聞いていたが、実際に使ってみるとそのすごさに衝撃を受けた。ラズベリーパイ3の良さを語らしてもらうと、トランプの箱程の大きさにもかかわらずクアッドコアのCPUと1GBのメモリというスペックを持っていてしかも省電力。さらに標準で無線lanモジュールも搭載されていてその上ファンがないので無音。左が現在稼働中である私のラズベリーパイ3だけれども(これが監視サーバーという事実に今でも動揺してしまう)、電源コード1本挿しているだけのシンプルさで今までタワー型サーバー使っていたのはなんだったのかと思いたくなるくらいだ。肝心の性能はというと、ソフトウェアのインストールで若干もたつくかなと思うくらいでまったくストレスを感じない(HDDの代わりにmicroSDを使用しているのでその書き込み速度がボトルネックになっているのかもしれない)。今のところmysql,php,apacheといったLAMP環境で監視サーバーを構築しているがレスポンスはきびきびして快適な印象。以前似たようなので数年前に玄箱というものに手を出したことがあったが、それとは比較にならないほどに高性能かつ省スペースになっている。

    mysqlのインストールとデータベースとテーブルの作成

    監視サーバーが監視対象のサーバーにアクセスした結果はデータベースに保存することにする。ssh接続できた時点でサーバーがほぼ正常に稼働中であるのは確認できるが、監視サーバーっぽくするために色々情報を取得する。取得する情報は、私はサーバーOSにUbuntuを利用していて、ログイン時に、

      System load: 0.01               Memory usage: 71%   Processes:       145
      Usage of /:  71.3% of 70.32GB   Swap usage:   0%    Users logged in: 0
    
      Graph this data and manage this system at https://landscape.canonical.com/
    

    みたいな情報が表示されるのでそれを取得、DBに保存してみる。その情報はpythonで/usr/bin/landscape-sysinfoを実行すれば取得できる。したがってDBに保存する情報はサーバーIP,稼働状況、HDD容量、プロセス数、メモリ使用状況、CPU負荷、日付といった具合になり、テーブル定義としては下記のような感じになった。

    create database servers;
    create table server_stats(
    sId integer unsigned not null primary key auto_increment,
    sIp varchar(75) not null,
    sIsWork bool not null,
    sStorage float,
    sProcess integer,
    sMem integer,
    sCpu float,
    sRecDate datetime not null);
    

    ・・・正直プロセス数とかメモリ使用状況とかわかっても意味はわからないんだけれども。

    check-server.py

    上記のテーブルに取得したデータを保存するプログラムは下記のような感じ。結構適当でざっくりとした感じで納品するわけでもないからただ動けばいいやと作ったので参考までに。言語はpythonでparamikoを使用してssh接続している。argvs = sys.argvの部分は監視対象のサーバーIPを引数で取得するようにしているため、このファイルを実行するときは sudo python check-server.py 192.168.1.10 といった感じになる。サーバーのディスク容量とかメモリ使用状況といった情報は正規表現で取り出して変数に入れておいて最後にDBにinsertするといった感じ。ところどころprintがあるのはデバッグの名残で意味はない。それでこのファイルをcronで1分毎に実行するように設定した。SSH接続して軽いコマンドを1回打つだけなので負荷はまったく問題にならないと思われる。そこまで密に監視する必要がなければ10分とか1時間おきとかに設定する。

    import sys
    import paramiko
    import re
    import MySQLdb
    
    global sHdd,sMem,sProc,sCpu,sStats,sIp
    
    sStats = 0
    
    argvs = sys.argv
    sIp=argvs[1]
    port=22
    username='user'
    password='pass'
    
    cmd='/usr/bin/landscape-sysinfo'
    
    ssh=paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    try:
    	ssh.connect(sIp,port,username,password)
    	stdin,stdout,stderr=ssh.exec_command(cmd)
    	list=stdout.readlines()
    
    	sStats = 1
    
    	for line in list:
    
    		pattern1 = r'.*Usage of /:(.*)% of .*GB.*'
    		pattern2 = r'.*Memory usage:(.*)%.*'
    		pattern3 = r'.* Processes: .* (.*)'
    		pattern4 = r'.*System load:.*(\d+\.\d+).*'
    
    		#storage usage
    		if re.match(pattern1,line):
    			m = re.search(pattern1,line)
    			print 'hdd = %s' % m.group(1).strip(' ')
    			sHdd = float(m.group(1).strip(' '))
    
    		#memory usage
    		if re.match(pattern2,line):
    			m = re.search(pattern2,line)
    			print 'mem = %s' % m.group(1).strip(' ')
    			sMem = int(m.group(1).strip(' '))
    
    		#current process
    		if re.match(pattern3,line):
    			m = re.search(pattern3,line)
    			print 'prcess = %s' % m.group(1).strip(' ')
    			sProc = int(m.group(1).strip(' '))
    
    		#cpu load
    		if re.match(pattern4,line):
    			m = re.search(pattern4,line)
    			print 'cpu = %s' % m.group(1).strip(' ')
    			sCpu = float(m.group(1).strip(' '))
    
    	stdout.close()
    
    except:
    	print 'server some trouble occured.'
    
    ssh.close()
    
    print 'mysql test start.'
    connector = MySQLdb.connect(host="localhost", db="servers", user="user", passwd="pass", charset="utf8")
    cursor = connector.cursor()
    sql = u"insert into server_stats(sIp,sIsWork,sStorage,sProcess,sMem,sCpu,sRecDate) values('%s',%d,%f,%d,%d,%f,now())" % (sIp,sStats,sHdd,sProc,sMem,sCpu,)
    cursor.execute(sql)
    connector.commit()
    cursor.close()
    connector.close()
    print 'mysql test end.'
    
    
    

    ※随時加筆

    Internet Explorer11がやたら重くなった

    マザーボードのcmosクリアとかセッティング初期化とか色々やっていたらInternet Explorer11(以下ie)がやたら重くなった。重くなったというか、HDDアクセスランプが点きっぱなしで一時保存ファイルにキャッシュが保存できなくなっている様子。ieのツール-インターネットオプションから閲覧の履歴の設定と進むと、一時ファイル設定をする画面が表示されるが、そこの設定内容の使用するディスク領域が0MB、保存場所が空白、ディスク領域を新たに設定しようにも8~8の値を入力しろとか意味不明なエラーが出て設定できない、というような現象を確認。

    以下、環境と修正するためにやったことをメモ(あくまで参考までに。試してみようと思った人は自己責任で。)

    環境

    • Windows 7
    • Internet Explorer 11

    不具合の現象

    • Internet Explorerの起動時の読込が遅くなった
    • Internet Explorerの設定の一時保存ディレクトリの使用するディスク領域が0MB
    • Internet Explorerの設定の一時保存ディレクトリの使用するディスク領域の容量変更不可
    • Internet Explorerの設定のキャッシュ保存ディレクトリへのパスが空白表示

    試してみたこと

    • WebCacheフォルダ内にあるファイルを全て別の場所へ移動(≒削除)
    • 上記後、PCを再起動

    試した結果

    • 再起動後、WebCacheフォルダ内には新たにファイルが作成されていた。
    • ieの起動時の重さが解消
    • 一時ファイル設定の0MBと保存場所空白の問題も解消

    メモ

    • 一言で言えば、WebCacheフォルダ内のデータベースが何らかの理由により不具合を起こしてしまったため、それを再作成することで問題を解消した、ということになる
    • WebCacheフォルダは C:\Users\ユーザー名\AppData\Local\Microsoft\Windows に存在し、システムフォルダとして保護されているのでフォルダのメニューにある 整理-フォルダーと検索のプションから表示タブの詳細設定内にある 保護されたオペレーティングシステムファイルを表示しない(推奨)のチェックを外すことで表示される
    • 何故一時ファイルが保存できなくなったのかという原因は不明。マザーボードの設定初期化が怪しい気もするが
    • レジストリで保存場所等を変更といった作業をしてもおそらく問題解消にはならないと思われる。
    • 上記一連の記述は当方の環境に限定される状況であるかもしれないので、注意されたし。以上

    SpriteKitのrunActionを遅延させる

    SKspriteNodeを遅延させるには

    let wait = SKAction.waitForDuration(1)
    someNode.runAction(wait)
    

    とかすればすればいい。ループの中でSKActionを実行するとループ処理中のアクションはほぼ同時に実行されているように目視では見えるためループの回数だけ遅延時間を延長させる。

    for var i = 0; i < 5; i++{
        let wait = SKAction.waitForDuration(1*i)
        someNode.runAction(wait)
    }
    
    

    あくまで見た目上の演出のための遅延というか。これを関数にしてメインスレッドで複数実行とかするとSKActionの遅延中にメインスレッドが先に進行する。

    swift didbegincontactが呼ばれない

    SpriteKitの衝突判定のデリゲートメソッドdidbegincontactが呼ばれなくてハマった。シーンにデリゲートの設定をして、衝突するオブジェクトそれぞれにcategoryBitMaskとcontactTestBitMaskを衝突判定させるように設定していて、なぜこれでデリゲートが呼ばれないのかと試行錯誤

    失敗していたコードは下記のような感じ。

        var slowCarBody = SKSpriteNode(textture:sCar)
        slowCarBody.categoryBitMask = slowCarBitMask
        slowCarBody.contactTestBitMask = playerCarBitMask
        slowCar.physicsBody = slowCarBody
        gameNode.addChild(slowCar)
    

    そして下記のような感じに修正するとデリゲートが呼ばれるようになった。

        var slowCarBody = SKSpriteNode(textture:sCar)
        slowCar.physicsBody = slowCarBody
        slowCarBody.categoryBitMask = slowCarBitMask
        slowCarBody.contactTestBitMask = playerCarBitMask
        gameNode.addChild(slowCar)
    

    違いは、オブジェクトの判定サイズの設定と判定グループの設定の順番を入れ替えた点。physicsBodyをイニシャライズする前にカテゴリを設定しようとしているんだからそりゃ効かない。spriteノードを作ったから大丈夫だろうと無意識でいたので気づかなかった