Quantcast
Channel: mattintosh note
Viewing all 878 articles
Browse latest View live

SHURE 製イヤホン用 MMCX ケーブルを自作

$
0
0

製作依頼があったので SHURE製イヤホン用 MMCX ケーブルを自作してみた。

自分が使っているのは M-AUDIOIE-10 なんだけど、この頃は2ピンタイプが多かったような(?)。最近では MMCX プラグを使った製品が多いらしい(?)。

さて、今回借りたのは SHURE SE215 Special Edition(SE215 SPE)。左耳側が断線気味なのでケーブルを作って欲しいとのこと。リケーブルは今回は初めてだそうなのでお手頃価格で材料を揃えることにした。

https://lh3.googleusercontent.com/-oQ0HlNdG-j8/Vf16qHmL0pI/AAAAAAAANH4/MwJ_RAqCBxc/s800-Ic42/CRW_0699.jpg

材料は以下の通り。オヤイデと千石電商でひと通り揃う。MMCX プラグはオヤイデのものは接触不良が多いというようなレビューを見かけたので千石電商で購入した。細かいパーツの値段は曖昧。通販よりお店で直接買ったほうが色々安い。

※分岐コネクターキットのスライダーの仕様が変わってる?みたいで、今回購入したのは径が大きくてあまりスライダーの意味を成さなかった。


まずはステレオミニプラグ側から。こっちの方がパーツの値段が高いので集中力が欠けてミスらないうちに先に仕上げてしまう。ホットのL側に被覆を追加する人もいるみたいだけど、上手くハンダ付けが出来れば恐らく必要ない。半田付けとケーブルの固定が済んだらアウターを被せてオシマイ。

https://lh3.googleusercontent.com/-EVEMGjQLQnQ/Vf16pC-705I/AAAAAAAANHs/9Yw47Tg6ROo/s800-Ic42/CRW_0702.jpg

続いて MMCX プラグ。芯がとても小さい。なお、画像左のカバーは今回使用しない(多分、イヤホン用として使う場合にかなり長くなってしまう)。

https://lh3.googleusercontent.com/-sGwftBk6ulg/Vf16qpzkInI/AAAAAAAANH8/gYqNkHI2ENk/s800-Ic42/CRW_0705.jpg

先に芯側を作る。シールドをプラグの外側でハンダ付けすることも考えたが、内側でハンダ付けすることにした。被覆と配線は外側から10mm、5mm、2.5mmで取り除いた。芯にはハンダを流すための穴が開いており、芯の先はシャープペンシル(画像は0.3mmのシャープペンシル)の芯と同じくらいのサイズなのでシャープペンシルを使うとハンダ付けや通電テストがしやすい。

https://lh3.googleusercontent.com/-g6AIVtotrU4/Vf16xMpmu6I/AAAAAAAANII/KIvbGTYbgwM/s800-Ic42/CRW_0707.jpg

ハンダを流し込む。後から画像で確認したら微妙に返しがついていた(挿入時の固定用?)。向き的に逆からコテを当てたほうがよかったかも…。穴は小さいけど案外簡単にハンダが流れる。

https://lh3.googleusercontent.com/-tyO_h7XcK90/Vf16yZSfCWI/AAAAAAAANIU/fbK9A8N7KOs/s800-Ic42/CRW_0709.jpg

芯をアウターにセットしてシールド部分をハンダ付け。ハンダを多くするとケーブルが固くなってしまうので量に気をつける。芯の方に「接着剤を使った」っていう人がいたけどこのスペースでどうやって注入したんだろう。芯に塗ってから挿入したのかな。

(この時にケーブルにLRの目印をつけておくといいかも)

https://lh3.googleusercontent.com/-RQ1WKz-kiK4/Vf16x_O2pOI/AAAAAAAANIQ/v8D6JBH8vYk/s800-Ic42/CRW_0712.jpg

熱収縮チューブ(長さ20mmくらい)とオスギボシ端子用のカバーを付ける。

https://lh3.googleusercontent.com/-m4zZn73XMzo/Vf1638jbRAI/AAAAAAAANIc/RQ-uZoYGD8k/s800-Ic42/CRW_0713.jpg

出来上がり。

https://lh3.googleusercontent.com/-FRM3nr4U5cA/Vf165FugY4I/AAAAAAAANIo/VXeKz4bWcI8/s800-Ic42/CRW_0714.jpg

ユニットに取り付けてみたところ。Lの印は適当…(ごめんね)。挿入時は「カチッ」とした感触で接触は良さそう。

https://lh3.googleusercontent.com/-KAjhzDDMd8o/Vf166O7neAI/AAAAAAAANIs/jBbtTNX0YhU/s800-Ic42/CRW_0718.jpg

全体はこんな感じ。

カスタムイヤホンケーブルできた! #SHURE #SE215

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

借り物なので簡単なレビューだけど、純正より音のヌケはよくなった感じ。あと、メガネ着用の場合はこっちの方が断然装着しやすい。

自分も今のイヤホンでこのケーブル使ってるけど中〜高域が強い傾向なのかなぁ。

今回は MMCX プラグの筒を使わなかったけど、もし使うならメスギボシ端子用カバーがちょうどいいのかなぁ。装着具合はどんなもんだろうか。

こんなもんで良ければ何セットか作ってオークションに出してみてもよかったかな。


失敗しない透明ブックカバーの付け方(ミエミエ、ブッカー君など)

$
0
0

追記:もっと簡単な方法があったのでそちらも紹介。 mattintosh.hatenablog.com


もう何年も漫画を買っていなかったのですが、今年に入ってからぼちぼち買うようになりました。

んで、書店で透明ブックカバーをプレゼントでもらったんですが、つけてみたら案外良かったので今後は本を買ったら透明ブックカバーをつけるようにしました。

その書店でもらったのは多分、コアデのミエミエだと思うのですが、調べてみると色々な製品が出てるんですね。入手しやすそうなのは以下の3製品。

  • ミエミエ
  • ブッカー君
  • コミック番長

今はミエミエとブッカー君のどちらかを買っていますが、これらは羽(?)側にノリがついています。コミック番長だけは帯側にノリが付いているようで、自分の好みと合わないので買ってません。

ちなみにミエミエとブッカー君はパッケージに記載されているサイズに違いがあるのですが、中身はほとんど同じです。パッケージのサイズだけ見るとブッカー君の方が高さが低いように思えますが、よく見てみるとミエミエはカバーそのもののサイズ、ブッカー君は対応本のサイズになっています。実際にはブッカー君の方が気持ち若干背が低い…ような感じです(B6用の場合)。

さて、透明ブックカバーというと悩みは付け方でしょうか。パッケージに記載されている方法ではどう頑張っても上手に貼ることはできません(自分の場合は)。

なので簡単で綺麗に貼れる方法を考えてみました。

道具は使いません。強いて言うなら本本体。

透明ブックカバーの取り付け方

※本の内容が一部写ってしまうのはご了承ください…。

まずは裏表紙だけをセットして透明カバーの帯を通さずに本に一回りさせます。このとき本の帯は外しておきます(冊子とかを中に挟んでいる場合はそちらも外しておいた方がいいかも)。帯は買った状態によって若干浮いた状態になっていたりするので透明カバーを付ける際に歪みの原因になります。

https://scontent.xx.fbcdn.net/hphotos-xat1/t31.0-8/12141175_950751674987924_8734565971902963765_o.jpg

適度に引っ張って調整したら軽く折り目をつけます。引っ張るときは透明カバーを若干引っ張り気味につけて、表紙を閉じて伸ばす感じにするといいです。折り目を付ける前に折り返し部分の内と外の両端が平行になるようにしておきます。

https://scontent.xx.fbcdn.net/hphotos-xat1/t31.0-8/12140109_950751668321258_8765890632666215251_o.jpg

軽く折り目をつけたら折り返し部分を一度外し、表紙の上で折り返します。先程と同様に両端のズレに注意して更に折り目をつけます。このとき、山折り部分が表紙から1〜2mmくらいはみ出る感じにしておきます(慣れれば指先の感覚でだいたいわかるようになります)。

https://scontent.xx.fbcdn.net/hphotos-xat1/t31.0-8/r270/12140180_950751664987925_8808939531449481412_o.jpg

まだまだ緩いですが折り目がつきます。

https://scontent.xx.fbcdn.net/hphotos-xap1/t31.0-8/12068489_950751671654591_1223427822238502740_o.jpg

これから更に折り目をつけていきますが、この状態で折り目をつけようと力を入れると写真のように歪みが出てしまいます。

https://scontent.xx.fbcdn.net/hphotos-xal1/t31.0-8/12087138_950751761654582_6005928886138613170_o.jpg

そこで、写真のように羽の部分を丸め込むようにして裏から折り目をつけるようにすると力を入れても歪みが出にくくなります。折り目をつける位置は帯を越えたあたりがいいです。このときも両端のズレに注意しておきます。

https://scontent.xx.fbcdn.net/hphotos-xta1/t31.0-8/12109958_950751768321248_7815533346854958418_o.jpg

ここまでいくときっちり折り目がつきます。

https://scontent.xx.fbcdn.net/hphotos-xpt1/t31.0-8/12039165_950751781654580_498815567339230050_o.jpg

本を透明カバーから外し、折り返し部分の上に載せ、剥離紙を少し剥がして最後の調整をしておきます。本を軽く手で抑えてゆっくり剥離紙を引っ張れば綺麗に仕上がります。粘着部に本を載せた状態で剥離紙を剥がしてもいいかもしれません。

https://scontent.xx.fbcdn.net/hphotos-xpt1/t31.0-8/12109925_950751824987909_1962881253317710939_o.jpg

仕上がりはこんな感じ。

https://scontent.xx.fbcdn.net/hphotos-xat1/t31.0-8/12045675_950751848321240_1225393403990616442_o.jpg

本を入れるときは透明カバーの袋の深い方から入れます。浅い方から入れると深い方を入れる際に透明カバーが破れることがあります。本に帯を取り付け、カバーと帯を調整したら本を斜め下方向に寄せておき、反対側もセットしたら完成です。

https://scontent.xx.fbcdn.net/hphotos-xtl1/t31.0-8/12039135_950751874987904_7152261318136147091_o.jpg

本を入れたあとの仕上がりはこんな感じです。

https://scontent.xx.fbcdn.net/hphotos-xal1/l/t31.0-8/12094853_950751884987903_5941844564281019387_o.jpg

自分はこの方法にしてから貼りミスがなくなりました。折る回数が多いので時間がかかりそうに思いますが、慣れれば1冊2分くらいでしょうか。何度も貼ったり剥がしたりするよりは早いと思います。何より貼りミスによる精神的ストレスがありません。

あと、冒頭で「ミエミエとブッカー君に違いはほとんどない」みたいなことを書きましたが、実はちょっと違いがあります。

次の写真は上がミエミエ、下がブッカー君です。帯のついている位置がブッカー君の方が外になっています。「ミエミエだと厚い本につけられない!」っていうときはブッカー君を使ってみるとつけられるかもしれません。

https://scontent.xx.fbcdn.net/hphotos-xta1/t31.0-8/12138507_950768081652950_8379941068754556269_o.jpg

最後に今日の使わせていただいたもの。王様達のヴァイキングはおすすめです!

王様達のヴァイキング 1 (ビッグコミックス)

王様達のヴァイキング 1 (ビッグコミックス)

ディメンションW(1) (ヤングガンガンコミックス)

ディメンションW(1) (ヤングガンガンコミックス)

失敗しない透明ブックカバーの付け方【改】(ミエミエ、ブッカー君など)

$
0
0

前回、「失敗しない透明ブックカバーの付け方」という記事を書きました。

昨日、また本にカバーをつけていたんですが、なんか違うなぁ…と。なんだろう?

しばし脳内会議した結果。

俺「最初から本にカバーついてるんだからそれ型紙にして折ればいんじゃね?」

あぁそれだ( ゚д゚)


というわけで「本にもともとついているカバーに合わせて透明ブックカバーを折る」という改良方法をやってみました。今回は本の帯を付けた状態でやってますが外しておいた方がベター。

あらかじめ本を片方セットして、透明ブックカバーの帯側のカバーを外しておきます。

https://scontent.xx.fbcdn.net/hphotos-xta1/v/l/t1.0-9/12119105_951867901542968_7942313039763241571_n.jpg?oh=8f01bc3ef33deb0135cec4605fa39188&oe=569B846B

本のカバーに合わせて透明ブックカバーを折ります。本のカバーの方は若干クセがついているのでしっかり伸ばしておきます。(透明ブックカバーの帯に通しておいた方がいいのか?)

https://scontent.xx.fbcdn.net/hphotos-xpt1/v/t1.0-9/12109300_951867898209635_817005539426633948_n.jpg?oh=ec194f7d336409c8b71dea3fd719343f&oe=569274F2

その状態で表紙を閉じて位置確認。

https://scontent.xx.fbcdn.net/hphotos-xtp1/v/t1.0-9/12122665_951867911542967_6631240452740312951_n.jpg?oh=38da2db272750d4150445744dd2859b0&oe=56D16BAD

透明ブックカバーだけ外して前回と同じ方法でクセ付け。

https://scontent.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/12074805_951867961542962_7105779883604979746_n.jpg?oh=f1a83ca3059bdbeb333bb18fe7f0b04b&oe=568BF460

本を外して重石にして貼り付け。ここもちょっと改良で、本の背中側を利用した方がいいですね。

https://scontent.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/12065510_951867981542960_5390683143494667976_n.jpg?oh=6feb10ff2699d38cfda5e5f4a4fc94ec&oe=56D1A0C8

完成。

https://scontent.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/r180/12115936_951867978209627_6650709218151692052_n.jpg?oh=d5637d8a11e08d7342dbf9155782b55c&oe=56D35F97

本にもともとカバーがついているタイプはこの方法の方が楽ですね。カバーがついていないタイプはこの方法が使えませんが、その場合は本の角が鋭利になっているので前回の方法の最初の段階である程度折り目が付けられます。

今回はA5用のブッカー君も買ってきたんですが、ミエミエよりも高さ低めになっているので本にジャストフィットすることがわかりました。これからはB6用はミエミエ、A5用はブッカー君かなぁ。

ブッカー君、ちょっと切り口が雑な気がするんだけど…。

では良い読書ライフを〜。

IKEAのBILLYを改造 #ikeahack

$
0
0

先日、IKEAの BILLY を購入したんですが、ずーっと悩みがありました。

A5 コミックと相性が悪い。

上から本に合わせて棚板をセットしていくとどうしても一番下の段の高さが不足してしまいます。

https://scontent.xx.fbcdn.net/hphotos-xlf1/v/t1.0-9/10393929_952513171478441_4515652453737975400_n.jpg?oh=167b52e745d768a32f9e2f52d0cc9c77&oe=56960A01

ただ、ダボ穴に本を合わせていってみると、BILLY 自体の高さは足りているらしく、棚の高さだけが問題なようです。ということでダボ穴を追加することにしました。

BILLY のダボ穴の径は3.5mm、上下のダボ穴間の距離は32mmなので16mmの位置に穴を追加します。

センターポンチで目印をつけ、低速で板の表面を削ります。その後、穴を深くしていきますが、垂直ガイドがないので今回はサークルカッターの台座を垂直ガイド兼ストッパーとして使いました。ストッパーが無い場合はドリルの刃にテープを巻いて目印にしたりするといいかもしれません。

https://scontent.xx.fbcdn.net/hphotos-xta1/v/t1.0-9/12065519_952513281478430_475137188905018312_n.jpg?oh=18d769b3b9247ac9ec7c250446fb2eac&oe=5685C753

穴開け後。

https://scontent.xx.fbcdn.net/hphotos-xta1/v/t1.0-9/11147568_952513258145099_474961410590567221_n.jpg?oh=66b084e864516e9cb67e4cdc7a435470&oe=568C7C2D

ダボをセットしてみます。深さは特に問題ない様子。この作業を上段下段1箇所ずつ行っていきます。

https://scontent.xx.fbcdn.net/hphotos-xat1/v/t1.0-9/12088446_952513254811766_58172754802484865_n.jpg?oh=f87fe31525f422e5614768cf5fe53c41&oe=5693AEC7

両面テープで固定していた裏板が取れてしまったので皿ネジ固定に変更。ネジは2.1×13mm。板が柔らかいのでドライバーだけでいけました。

https://scontent.xx.fbcdn.net/hphotos-xpt1/v/t1.0-9/12079615_952513318145093_941398580077833187_n.jpg?oh=5e1e91b66634dea39e48ac3c51a029da&oe=56C8EE5B

すべての段がほぼ均等な高さで設置できるようになりました(下の段の方がダボ穴多いですが、間違えて穴開けちゃいました…)。真ん中の段だけは既存のダボ穴を使っています。穴開けの位置は正確だと思うのですが、一番下の段だけ数mm低くなるみたいです。

https://scontent.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/10440988_952513354811756_1385116522569979270_n.jpg?oh=8e62f22977a22157954e0ad2ae72b91e&oe=568CF3EE

あとはMORLIDEN(ガラス扉)を付け直してA5コミック用の BILLY は作業終了。

実際に棚の間隔を測ってみましたが、上から224mm、222mm、222mm、216mmくらいでした。

お次は扉なしで使っている BILLY で、ダボの段をずらしてディスプレイラックにしていたものなんですが、やっぱり角度が足りないなぁ、ということでディスプレイ設置用の穴を開けちゃいました。

最上段のダボ穴を基準に位置決め。手前と奥のダボ穴の距離は192mmだったかな?奥のダボ穴から88mmのあたりに穴を開けると既存のダボ穴を併用して固定ができるようになります。

https://scontent.xx.fbcdn.net/hphotos-xat1/v/t1.0-9/12108975_952513361478422_4081458625252189385_n.jpg?oh=7d608a43d9bb7f32e07e18d1ff9e3144&oe=568EDB64

BILLY の棚板の奥行きは B5 サイズピッタリなのでとりあえずこの前のサンクリのカタログなんかを置いてみました。手前についているレールは天井なんとかというので(ジョイナーの一種?)ホームセンターで2m150円くらいで売ってるものを両面テープで固定してます。

https://scontent.xx.fbcdn.net/hphotos-xat1/v/t1.0-9/12096246_952513514811740_6325247145588598872_n.jpg?oh=3fbd5d4097e0f6d15636fe281679d96d&oe=569728A1

今日の作業はここまで。

ディスプレイ棚をつけてみたものの、やっぱり奥の既存穴を使った方がよかったかなぁ、と。でも BILLY は手前には扉用のダボ穴があるけど、奥にはないんですよね。なので最上段の奥で引っ掛けるとなると自前で穴を開けなきゃいけないわけで。明日またやりましょうかね。

IKEAさん、もうちょっと BILLY に遊び心を追加してくれると嬉しいですー。(なんか昔はこの設置をするためのオプションがあったらしい…?)

IKEAのBILLYを改造 Part.2 「ディスプレイ棚完成編」 #ikeahack

$
0
0

連休も最終日なので朝から IKEAHACK です。

https://scontent.xx.fbcdn.net/hphotos-xtp1/v/t1.0-9/12096218_952898741439884_5280875592271614257_n.jpg?oh=0aaaca490af068f17ee64ab80e7072dc&oe=568F2BD0

昨日の状態だと斜め掛けした棚の後ろのスペースが非常にもったいないのでダボ穴を追加して奥へ移動。

つっかえ棒を使いつつ、仮の位置決め。採寸してて気づいたんですが、BILLY のダボ穴って正方形になるように開いてるんですね。

https://scontent.xx.fbcdn.net/hphotos-xpt1/v/t1.0-9/12072670_952898744773217_2082807260203007281_n.jpg?oh=f28ad6f426c79fb666a7f625151872a1&oe=568DEA11

仮止め後の様子見。今回はこんな感じに仕上げることにしました。後ろの棚にはB5までの本が入りますが、ちょっと入れるのにコツがいるかも…。

https://scontent.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/12115924_952898738106551_7107691878125711393_n.jpg?oh=7b18bf5a241679eac42e59ef337efcb1&oe=56CBDD40

ダボ穴を開けて棚をセットしてみました。角度的にもこれが限界ですかね。自分が持っている BILLY のダボは角がついているのでこの角度でも棚が落ちてくることはないんですが、ネット上の写真を見てみると皿のようなタイプもあるようで、その場合はこの角度では難しいと思います。

https://scontent.xx.fbcdn.net/hphotos-xla1/v/t1.0-9/12079495_952898718106553_753713370132811717_n.jpg?oh=1b2622ac11118904b2ff849a44271a10&oe=56C61428

部屋にあったものを適当に配置してみました。ディスプレイ棚のレールは薄い漫画ならぎりぎり入ります。このレールも将来的にはもうちょっとちゃんとしたものにしたいなぁ。

https://scontent.xx.fbcdn.net/hphotos-xaf1/v/t1.0-9/1796477_952898791439879_1398688966050348923_n.jpg?oh=d948eb6810a60bfe432b1a9c0d5d40cc&oe=5696D8CA

作業後に気づいたんですが、CAD で型を印刷してそれに合わせて穴をあければよかったかなぁ、と。ただ、実際にあけた穴の位置と CAD 上の穴の位置はほぼ同じ位置だったので結果オーライ?でした。でも実物と CAD 上のデータで棚の間の隙間が違う…。CAD の方でどこかが寸法間違っている模様。

https://scontent.xx.fbcdn.net/hphotos-xat1/v/t1.0-9/12065727_952865781443180_6064483975301428434_n.jpg?oh=f9caf9d50dabbc608f383f6093699d53&oe=568A7FE8

とりあえず理想に近い感じに出来上がったので今回の DIYはこれにて終了。次回は CAD で事前に設計してから作業したいなぁ。

date コマンドで「○ヶ月前」

$
0
0

1 month agoとか使えない dateコマンドで「○ヶ月前」ってどうやって出すのかな…と。

例えば6ヶ月前の場合。(引数がなければ ${gap}-6

自分なりに考えてみたものだと JavaScript.getMonth()のように1〜12月を0〜11に変換してそれを戻すっていう感じになったんだけど他にいい方法あるのかしら?

gap=${1:--6}set -- $(($(date +%Y) * 12 + $(date +%m) - 1))set -- $(printf'%04d%02d'$(((${1} + ${gap}) / 12)) \$(((${1} + ${gap}) % 12 + 1)))target_date=${1}

追記

dateコマンドに予め演算子と算術式用の $(())を入れておいて evalで展開すれば dateコマンドは1回で済む。

typeset-i gapgap=${1:--6}set -- $(evalprintf %04d%02d $(    date +'$(((%Y*12+%m-1+${gap})/ 12))            $(((%Y*12+%m-1+${gap})%%12+1))'))target_date=${1}

JavaScript で外部のテキストファイルを読み込んで表示

$
0
0

JavaScriptの復習、みたいな。

仕事で毎月同じようなメールを送るのだが、Outlookのテンプレートだと全員で共有するがなんかめんどくさい。そこで、HTML でメールのテンプレートページを作成し、そこからコピーすればいいというような案を考えてみた。

そこでちょいと面倒になってくるのが「署名」。自分だけが使うなら HTML に JavaScript直書きで書いてしまってもかまわないのだけど、HTML が読めない人が多い現場だとそういうわけにもいかない。

なので外部のテキストファイルの内容を HTML にインポート出来ないかどうか調べてみたところ XMLHttpRequestというのを使えばできるらしい。

function writeSignature() {var xhr = new XMLHttpRequest();
    xhr.addEventListener("load", function(){var e = document.getElementById("*");
        for (var i = 0, j; j = e[i]; i++) {if (j.className === "signature") {
                j.innerHTML = xhr.responseText;
            }}});
    xhr.open("get", "./templates/signature.txt");
    xhr.send();
}function Init() {
    writeSignature();
}window.onload = Init;

あとは HTML に以下のように書いておけば JavaScriptが署名を挿入してくれる。

<preclass="signature"></pre>

昔から JavaScriptって馴染みがなくて、気づいたら Javaの資格を先に取ってしまっていた。改めて JavaScriptを始めてみると「あぁ、こういうことをやっていたのか」と理解できるようになってちょっぴり嬉しい。

もっと早いうちに覚えておけばよかったかなぁ。


追記

addEventListenerが使えないブラウザ用に .onloadで設定する方法もあるらしい。

    xhr.onload = function(){var e = document.getElementById("*");
        for (var i = 0, j; j = e[i]; i++) {if (j.className === "signature") {
                j.innerHTML = xhr.responseText;
            }}};

帳票システムの出力を整形する

$
0
0

仕事で帳票を出す作業があるんだけど、その帳票が古めかしい HTML で出力されてくる。

その帳票を IEから印刷するんだけど、HTML なのでテーブルの中間だろうと問答無用でページ分割してしまう。

「なんとか見やすくならないものかねぇ…」

と思って、IEをポチポチ弄ってると F12 で開発者用コンソールが出せるらしい。あぁ、これならなんとか改ページの挿入もできそう。

■やること

  1. テーブルを途中で改ページされないように印刷する
  2. ページ分割した際の垂直位置を top にする
  3. 文字の折り返しを禁止する
  4. 謎の height="40"を削除する

「1」は page-break-***を入れればいいのだけど、IEはすでにページをまたがっている要素に対して page-break-beforeを追加してもダメらしい。そのためダミー要素を追加してそちらで改ページを仕掛けるのだけど、テーブルとテーブルの間にテキストノードが入っていたりするので指定したテーブルの一つ前のテーブルに page-break-afterを設定することにした。

「2」はテーブルがいくつか入れ子になっているので一番親となるテーブルにだけ vertical-align: topを設定する。

「3」はテーブルがウィンドウサイズに合わせて文字を折り返してしまうので white-space: preでそれを禁止する(nowrapだとはみ出る可能性があるので使わない)。

「4」はなぜかよくわからんが1行だけ height="40"がセットされているところがある…のでそこを削除する。(テンプレートの作成ミスではないだろうか)

各テーブルには id属性がセットされているのでそれを利用する。ここでは T1のような名前にする。

HTML の構造はこんな感じだったかなぁ(かなり適当)。

<tableid="T0"><tr><td>■帳票1
            <tableid="T1"><tr><td></td></tr></table><br>■帳票2
            <tableid="T2"><tr><td></td></tr></table><br>■帳票3
            <tableid="T3"><tr><tdheight="40"></td></tr></table><br>■帳票4
            <tableid="T4"><tr><td></td></tr></table></td></tr></table>
(function(){var RT, e, i, j;
    
    // 基幹テーブル
    RT = document.getElementById("T0");
        
    // 指定のテーブルの1つ前のテーブル後に改ページ挿入
    e = RT.getElementsByTagName("table");
    for (i = 1; j = e[i]; i++) {switch (j.id) {case"T2":
            case"T3":
            case"T4":
                e[i - 1].style.pageBreakAfter = "always";
                break;
        }}// テーブルセルスタイル指定
    e = RT.getElementsByTagName("*");
    for (i = 0; j = e[i]; i++) {switch (j.tagName.toLowerCase()) {case"table":
                // 将来使う予定?break;
            case"td":
                j.style.lineHeight    = "1"; // 行間
                j.style.textAlign     = "left"; // 水平位置
                j.style.verticalAlign = "middle"; // 垂直位置
                j.style.whiteSpace    = "pre"; // 折り返しif (j.hasAttribute("height")) j.removeAttribute("height"); // height 属性削除break;
        }}// 親テーブルセルスタイル指定
    e = document.getElementById("T1").parentElement;
    e.removeAttribute("style"); // スタイル初期化
    e.style.verticalAlign = "top"; // 垂直位置指定})();

改ページを入れる基準になるテーブルは配列に入れてたんだけど JavaScriptには inみたいなメソッドがない…のだろうか(最近できるようになったみたい?)。 それほどテーブルの指定は多くないので switchで対応することにした。

家に IE使える環境がないので開発者向けツールに貼り付けて動くかどうかはわからない。


追記

JavaScriptについてちょっと調べていたら、いろんな書き方が散在していていったいどの書き方が一般的(?)なのかわからなくなってきた。

自分はどちらかというと変数をあまり使いたがらないダメなタイプ(?)なので無名関数で組むのが好きかなぁ(lengthで配列の長さを変数に入れるために変数を用意するとか嫌なんだよなぁ)。

(function(){// 基幹テーブルvar RT = document.getElementById("T0");
    
    // td 要素一括指定スタイルvar td_style = {
        lineHeight   : "1",      // 行間
        textAlign    : "left",   // 水平位置
        verticalAlign: "middle", // 垂直位置
        whiteSpace   : "pre",    // 折り返し};
    
    // 指定のテーブルの1つ前のテーブル後に改ページ挿入
    (function(){var e = RT.getElementsByTagName("table");
        for (var i = 1; e[i] != null; i++) {switch (e[i].id) {case"T2":
                case"T3":
                case"T4":
                    e[i - 1].style.pageBreakAfter = "always";
                    break;
            }}})();
    
    // テーブルセルスタイル一括指定
    (function(){var e = RT.getElementsByTagName("*");
        for (var i = 0; e[i] != null; i++) {switch (e[i].tagName.toLowerCase()) {case"table":
                    // 将来使う予定?break;
                case"td":
                    for (var k in td_style) e[i].style[k] = td_style[k];
                    if (e[i].hasAttribute("height")) e[i].removeAttribute("height"); // height 属性削除break;
            }}})();
    
    // 親テーブルセルスタイル指定
    (function(){var e = document.getElementById("T1").parentElement;
        e.removeAttribute("style"); // スタイル初期化
        e.style.verticalAlign = "top"; // 垂直位置指定})();
})();

JavaScript memo

$
0
0

配列にその要素が含まれているかどうかを確認するのにループを使うのが嫌だったので(数も少なかったし)switchで対応していたけど、なんとなく不便な気がしてきた。

ハッシュの場合は inでそのキーが存在するかどうかを確認する方法があるようなのでこれを使ってみた。

var h = {"T2": null,
  "T3": null,
};
var a = ["T1", "T2", "T3", "T4"];
for (var i = 0; a[i] != null; i++) {if (a[i]in h) alert("h has " + a[i]);
}

いちいち "key": nullを書くのは面倒だけどスクリプトの好きなところに書いたりできるのでまぁいいか。

※modern.IEIE 9 でテストしてみたところ .indexOf()が使えるようなのでこちらの方が簡単か。

あと昨日、要素が height属性を持っているか調べるのに .hasAttribute("height")を使ったスクリプトを書いたけど、これ IE対応してないのね…。なので以下のようにしてみた。

if (e["height"] != null) alert(e.tagName + " has height");

う〜ん、なんかよろしくない感じがする。.removeAttribute()が使えるなら .hasAttribute()も使えるようにして欲しい。本当に IEは面倒だ。

ImageMagick を使ってテキストデータを画像に変換する

$
0
0

以前、フォント見本を出力するのに ImageMagickを使ってテキストを画像に変換したんだけどその方法を残してなくてちょっと忘れたのでメモしておく。

テキスト変換も色々オプションが多いのだけど端的に書くと以下のコマンドで任意のテキストを画像にすることができる。

convert label:'ImageMagick' out.gif

オプションを変更すれば前景色や背景色の変更、フォントやフォントサイズの変更ができる。

せっかくなので convert --helpの出力を画像にしたものを貼り付けておく(クッソ長いけど)。ターミナルで色々試しながら実行するときは色などを変数に入れておくと楽かも。

convert -background steelblue4 -bordercolor steelblue4 -border 20x20 -fill whitesmoke -font DejaVu-Sans-Mono-Book -pointsize16 label:@- out.gif

実際には awkで最終行の改行コードを取り除いたりしているので以下のようになる。

convert --help | awk '{if(NR>1){print a}a=$0}END{printf a}' | convert -background steelblue4 -bordercolor steelblue4 -border 20x20 -fill whitesmoke -font DejaVu-Sans-Mono-Book -pointsize16 label:@- out.gif

今回は label:@-で標準入力からのデータから画像に変換しているのでキャンパスサイズはテキストの量によって異なる。逆に、caption:@-を使う場合は横幅などのサイズを指定し、それに合わせてテキストを流しこむことができる。

JavaScript の style.cssText と style.styleProperty

$
0
0

style.cssTextstyle.stylePropertyがよくわかってなかったのでメモ。

style.cssTextで書いた場合はもともとあった style属性を一新する。下の例で言うと color: redはなくなり、text-decoration: underlineのみが有効になる。

var e = document.getElementById("body");
e.style.cssText = "color: red";
e.style.cssText = "text-decoration: underline";

style.cssTextで追記する場合は以下のような方法が使える。

var e = document.getElementById("body");
e.style.cssText  = "color: red";
e.style.cssText += "text-decoration: underline";
var e = document.getElementById("body");
e.style.cssText = "color: red";
e.style.cssText = e.style.cssText + "text-decoration: underline";

style.stylePropertyの場合は style属性の内容に追加し、そのプロパティが既に存在する場合は置き換える。

var e = document.getElementById("body");
e.style.color = "red";
e.style.textDecoration = "underline";

!importantの指定は style.stylePropertyでは出来ない(?)ので style.cssTextで行う。


sheet.insertRuleを使う場合は stylesheet.style.cssTextなんかとごっちゃになるのでこちらもメモ。insertRuleではなく cssTextで一気に追加することもできるようだ(ただし、上記のように毎回リセット)。

var e = document.createElement("style");
document.head.appendChild(e);
e.sheet.insertRule("p { font-family: monospace; }", 0);
e.sheet.insertRule("p { color: gray; }", e.sheet.cssRules.length);
document.body.appendChild(
    document.createElement("p").appendChild(
        document.createTextNode(e.sheet.cssRules.length)
    )
);

システム側で強制的に挿入される <style>要素のルールを全て削除する場合は .sheet.deleteRule(index)でいいのかな…。

var e = document.getElementsByTagName("style");
for (var i = 0; e[i] != null; i++) {while (e[i].sheet.deleteRule(0));
}

IEで試したときに .cssText = "";で一括削除出来たような気がするけど、document.getElementsByTagName("style")document.styleSheets使ってたかどうか覚えてないんだよな…。

上の方法だと無限ループになりそうだから下の方法で要素ごと消すほうが楽そうだ。

var e = document.getElementsByTagName("style");
while (e[0]) {
    e[0].parentElement.removeChild(e[0]);
}

ImageMagick で艦これの改装画面を自動アレンジ

$
0
0

https://lh3.googleusercontent.com/-cXo1g_TKFC8/VmLnwv-6pgI/AAAAAAAANKQ/Jyh_YCQcdp0/d-h-Ic42/0000.png

久しぶりに ImageMagickを弄ってて反射効果の復習がしたかったので艦これ艦隊これくしょん)の改装画面をキャプチャーしたものを convert 1回でアレンジするスクリプトを書いてみた。

必要なものは以下の画像6枚。艦これの画面は正確にクロップすれば800×480のはず。これは GIMPを使うと Autocrop Image が使えるので簡単。

https://lh3.googleusercontent.com/-IGYa9ua1AlE/VmLn2laCogI/AAAAAAAANKk/5hECAMkTf28/s400-Ic42/20151203_a01.pnghttps://lh3.googleusercontent.com/-mzMsNiSIYxE/VmLn2gfhM1I/AAAAAAAANK0/9lSIvoQ7DRo/s400-Ic42/20151203_a02.pnghttps://lh3.googleusercontent.com/-oktJyTlp6kg/VmLn2k_BHnI/AAAAAAAANKo/uOg06_TfgSA/s400-Ic42/20151203_a03.pnghttps://lh3.googleusercontent.com/-b4kMCc5i9HY/VmLn3Fx_gII/AAAAAAAANK4/JFt9YeIJcl8/s400-Ic42/20151203_a04.pnghttps://lh3.googleusercontent.com/-Y0FKkKVz0E4/VmLn3pGdK2I/AAAAAAAANK8/F152quJUNnA/s400-Ic42/20151203_a05.pnghttps://lh3.googleusercontent.com/-VpOKFDRHmsU/VmLn3sX9gMI/AAAAAAAANLA/zTSOlEfVw5o/s400-Ic42/20151203_a06.png

フォントは Font Squirrelで手に入る Boycott を使用。

www.fontsquirrel.com

あとは以下のスクリプトの引数に画像ファイルをつけて実行するだけ。工程を何度かに分ければもう少しわかりやすいスクリプトになるけど1回で済ませたかったので若干カオスな状態に…。

#!/bin/kshset-efor f
dotest-f"${f}"donew=487h=373x=313y=97m=20bg=gray5
convert \'('\'('"$1"-crop${w}x${h}+${x}+${y}\! -alpha on '('+clone-flip-size${w}x$((${h}/2)) gradient:gray60-black -alpha off -compose CopyOpacity -composite')'-append-background transparent -crop$((${w}+${m}))x$((${h}+(${h}/2)+${m}))-$((${m}/2))-$((${m}/2))\! -compose Over -flatten')'\'('"$2"-crop${w}x${h}+${x}+${y}\! -alpha on '('+clone-flip-size${w}x$((${h}/2)) gradient:gray50-black -alpha off -compose CopyOpacity -composite')'-append-background transparent -crop$((${w}+${m}))x$((${h}+(${h}/2)+${m}))-$((${m}/2))-$((${m}/2))\! -compose Over -flatten')'\'('"$3"-crop${w}x${h}+${x}+${y}\! -alpha on '('+clone-flip-size${w}x$((${h}/2)) gradient:gray40-black -alpha off -compose CopyOpacity -composite')'-append-background transparent -crop$((${w}+${m}))x$((${h}+(${h}/2)+${m}))-$((${m}/2))-$((${m}/2))\! -compose Over -flatten')'\'('"$4"-crop${w}x${h}+${x}+${y}\! -alpha on '('+clone-flip-size${w}x$((${h}/2)) gradient:gray40-black -alpha off -compose CopyOpacity -composite')'-append-background transparent -crop$((${w}+${m}))x$((${h}+(${h}/2)+${m}))-$((${m}/2))-$((${m}/2))\! -compose Over -flatten')'\'('"$5"-crop${w}x${h}+${x}+${y}\! -alpha on '('+clone-flip-size${w}x$((${h}/2)) gradient:gray50-black -alpha off -compose CopyOpacity -composite')'-append-background transparent -crop$((${w}+${m}))x$((${h}+(${h}/2)+${m}))-$((${m}/2))-$((${m}/2))\! -compose Over -flatten')'\'('"$6"-crop${w}x${h}+${x}+${y}\! -alpha on '('+clone-flip-size${w}x$((${h}/2)) gradient:gray60-black -alpha off -compose CopyOpacity -composite')'-append-background transparent -crop$((${w}+${m}))x$((${h}+(${h}/2)+${m}))-$((${m}/2))-$((${m}/2))\! -compose Over -flatten')'\+append-background${bg}-compose Over -flatten\')'\-bordercolor${bg}-border$((${m}/2))x$((${m}/2))\-font Boycott-Regular \-fill white \-pointsize96-draw'fill-opacity 1 gravity South text 0,60 "Combined Fleet Girls Collection"'\-pointsize32-draw'fill-opacity 1 gravity South text 0,30 "Kantai Collection -KanColle-"'\
    /tmp/0000.png

原寸大だとこんな感じ。

横に長過ぎるからちょっとレイアウト変えたほうがいいかなぁ…。


左角の切り抜き加工を追加した。座標指定で切り抜かないで、マスクを作成して切り抜くことにした。透明化を維持したまま反射部分を作るのが複雑…。

#!/bin/kshset-efor f
dotest-f"${f}"donew=487h=373x=313y=97m=10bg=gray4
convert \\(\\(\("${1}"\(-size 800x480 xc:black -fill white -draw"path \"M $((${x}+20)),${y} L $((${x}+${w})),${y} L $((${x}+${w})),$((${y}+${h})) L $((${x}+20)),$((${y}+${h})) L ${x},$((${y}+${h}-20)) L ${x},$((${y}+20)) Z\""-alpha off \)-compose CopyOpacity -composite-trim+repage\)\(+clone-flip\(-size${w}x$((${h}/2)) xc:black -fill gradient:gray50-black -draw"path \"M 20,0 L ${w},0 L ${w},${h} L 20,${h} L 0,$((${h}-20)) L 0,20 Z\""-alpha off \)-compose CopyOpacity -composite\)-append-background transparent -compose Over -flatten-trim+repage-bordercolor transparent -border${m}x${m}\)\\(\("${2}"\(-size 800x480 xc:black -fill white -draw"path \"M $((${x}+20)),${y} L $((${x}+${w})),${y} L $((${x}+${w})),$((${y}+${h})) L $((${x}+20)),$((${y}+${h})) L ${x},$((${y}+${h}-20)) L ${x},$((${y}+20)) Z\""-alpha off \)-compose CopyOpacity -composite-trim+repage\)\(+clone-flip\(-size${w}x$((${h}/2)) xc:black -fill gradient:gray40-black -draw"path \"M 20,0 L ${w},0 L ${w},${h} L 20,${h} L 0,$((${h}-20)) L 0,20 Z\""-alpha off \)-compose CopyOpacity -composite\)-append-background transparent -compose Over -flatten-trim+repage-bordercolor transparent -border${m}x${m}\)\\(\("${3}"\(-size 800x480 xc:black -fill white -draw"path \"M $((${x}+20)),${y} L $((${x}+${w})),${y} L $((${x}+${w})),$((${y}+${h})) L $((${x}+20)),$((${y}+${h})) L ${x},$((${y}+${h}-20)) L ${x},$((${y}+20)) Z\""-alpha off \)-compose CopyOpacity -composite-trim+repage\)\(+clone-flip\(-size${w}x$((${h}/2)) xc:black -fill gradient:gray30-black -draw"path \"M 20,0 L ${w},0 L ${w},${h} L 20,${h} L 0,$((${h}-20)) L 0,20 Z\""-alpha off \)-compose CopyOpacity -composite\)-append-background transparent -compose Over -flatten-trim+repage-bordercolor transparent -border${m}x${m}\)\\(\("${4}"\(-size 800x480 xc:black -fill white -draw"path \"M $((${x}+20)),${y} L $((${x}+${w})),${y} L $((${x}+${w})),$((${y}+${h})) L $((${x}+20)),$((${y}+${h})) L ${x},$((${y}+${h}-20)) L ${x},$((${y}+20)) Z\""-alpha off \)-compose CopyOpacity -composite-trim+repage\)\(+clone-flip\(-size${w}x$((${h}/2)) xc:black -fill gradient:gray30-black -draw"path \"M 20,0 L ${w},0 L ${w},${h} L 20,${h} L 0,$((${h}-20)) L 0,20 Z\""-alpha off \)-compose CopyOpacity -composite\)-append-background transparent -compose Over -flatten-trim+repage-bordercolor transparent -border${m}x${m}\)\\(\("${5}"\(-size 800x480 xc:black -fill white -draw"path \"M $((${x}+20)),${y} L $((${x}+${w})),${y} L $((${x}+${w})),$((${y}+${h})) L $((${x}+20)),$((${y}+${h})) L ${x},$((${y}+${h}-20)) L ${x},$((${y}+20)) Z\""-alpha off \)-compose CopyOpacity -composite-trim+repage\)\(+clone-flip\(-size${w}x$((${h}/2)) xc:black -fill gradient:gray40-black -draw"path \"M 20,0 L ${w},0 L ${w},${h} L 20,${h} L 0,$((${h}-20)) L 0,20 Z\""-alpha off \)-compose CopyOpacity -composite\)-append-background transparent -compose Over -flatten-trim+repage-bordercolor transparent -border${m}x${m}\)\\(\("${6}"\(-size 800x480 xc:black -fill white -draw"path \"M $((${x}+20)),${y} L $((${x}+${w})),${y} L $((${x}+${w})),$((${y}+${h})) L $((${x}+20)),$((${y}+${h})) L ${x},$((${y}+${h}-20)) L ${x},$((${y}+20)) Z\""-alpha off \)-compose CopyOpacity -composite-trim+repage\)\(+clone-flip\(-size${w}x$((${h}/2)) xc:black -fill gradient:gray50-black -draw"path \"M 20,0 L ${w},0 L ${w},${h} L 20,${h} L 0,$((${h}-20)) L 0,20 Z\""-alpha off \)-compose CopyOpacity -composite\)-append-background transparent -compose Over -flatten-trim+repage-bordercolor transparent -border${m}x${m}\)\+append-background${bg}-compose Over -flatten\\)\-bordercolor${bg}-border${m}x${m}\-font Boycott-Regular \-fill white \-pointsize96-draw"fill-opacity 1 gravity South text 0,52 \"Combined Fleet Girls Collection\""\-pointsize32-kerning20-draw"fill-opacity 1 gravity South text 0,20 \"Kantai Collection -KanColle-\""\
    /tmp/0000.png

Twitter用にサイズ調整したもの。

艦これ一覧めいかー(仮?)

$
0
0

まとめとかで見かけるアレを作るためのスクリプトを作ってみました。ImageMagickが必要ですが…。

艦これの画面画像(800x480ピクセル)があれば横2や横3などのレイアウトで一覧を簡単に作ることができます。

■2列レイアウト

https://lh3.googleusercontent.com/-frN_ssfR064/VmcVFYmZnzI/AAAAAAAANLw/hFJQDz2XxHA/d-Ic42/units.png

■3列レイアウト

https://lh3.googleusercontent.com/-mVjHn1Suqb4/VmcYSxlpPgI/AAAAAAAANL8/pfnBpXx8BBg/d-Ic42/units.png

■3列レイアウト(文字カスタマイズ版)

https://lh3.googleusercontent.com/-2qOkCRoL1n0/VmcnOAnfz4I/AAAAAAAANMM/ENLqaUyVgaI/d-Ic42/units.png

#!/bin/sh# 出力ファイル名out=units.png

# 座標w=486h=372x=314y=96# 横のサイズcolumns=2# 文字色fill=#00000040# フォントfont="Noto-Sans-CJK-JP-Bold"# フォントサイズpointsize=64( convert -verbose "${1}" -crop ${w}x${h}+${x}+${y}\! -gravity Center -font ${font} -pointsize ${pointsize} -fill ${fill} -annotate 0"" miff:- | \( convert -verbose "${2}" -crop ${w}x${h}+${x}+${y}\! -gravity Center -font ${font} -pointsize ${pointsize} -fill ${fill} -annotate 0"" miff:- | \( convert -verbose "${3}" -crop ${w}x${h}+${x}+${y}\! -gravity Center -font ${font} -pointsize ${pointsize} -fill ${fill} -annotate 0"" miff:- | \( convert -verbose "${4}" -crop ${w}x${h}+${x}+${y}\! -gravity Center -font ${font} -pointsize ${pointsize} -fill ${fill} -annotate 0"" miff:- | \( convert -verbose "${5}" -crop ${w}x${h}+${x}+${y}\! -gravity Center -font ${font} -pointsize ${pointsize} -fill ${fill} -annotate 0"" miff:- | \( convert -verbose "${6}" -crop ${w}x${h}+${x}+${y}\! -gravity Center -font ${font} -pointsize ${pointsize} -fill ${fill} -annotate 0"" miff:- | \  montage -tile ${columns}x -resize 100% -geometry +0+0 fd:3 fd:4 fd:5 fd:6 fd:7 fd:8${out}8<&0)7<&0)6<&0)5<&0)4<&0)3<&0)

本当はオプションとか追加した方が使い勝手がいいんですけどメモ書きのようなものなので簡単に…。

convertを6回も使わないのでも -append+appendを組み合わせれば一回で作れちゃいます。わざわざ6回も convertを使っているのは montageにデータを渡すため。montage-tileオプションで縦や横の数を指定できるのに convertにはそれがない(はず)。ちょいちょいレイアウトを変えるとなると montageを使ったほうが楽なんですね。

よく見かけるものには順番が書いてないので艦の順番をオーバープリントしてみました。これを作る前に Twitterなんかで改めて一覧の画像を見てみるとみんな結構ずれてるんだなぁ〜と思ったり。一枚一枚画像編集ソフトとかで作ってるのだろうか。

この前作った反射効果とか入っているものはマスク処理で悩んでるのでまたそのうち。

ちょっとだけ真面目に「艦これ一覧めーかーカッコカリ」

$
0
0

昨日適当に作った艦隊これくしょんの改装画面一覧を作成するスクリプトを Gist で公開しました。

艦隊これくしょんの改装画面を自動的にトリミングし、任意の列数に配置します。艦娘の配置順をわかりやすくするウォーターマーク追加オプション付きです。

f:id:mattintosh4:20151210005426p:plain

gistfile1.sh image-1.png image-2.png image-3.png image-4.png image-5.png image-6.png

■必要なもの

■オプション

2つ用意してあります。オプション指定の順番は関係ありません。また、どちらか1つでも指定することができます。

  • -mウォーターマークを追加します。艦娘の並び順がわかりやすくなります。
  • -c {1-6}:列の数を1〜6の間で指定します。このオプションが指定されていない場合は -c 2と同じです。

ウォーターマーク有3列

gistfile1.sh -m-c3 image-1.png image-2.png image-3.png image-4.png image-5.png image-6.png

f:id:mattintosh4:20151210010049p:plain

ウォーターマーク有6列

gistfile1.sh -m-c6 image-1.png image-2.png image-3.png image-4.png image-5.png image-6.png

f:id:mattintosh4:20151210010237p:plain

ImageMagick で「艦これ一覧めーかーカッコカリ改」

$
0
0

前回の「艦これ一覧めーかーカッコカリ」はただ単に並べるだけでしたが、今回の「改」ではアレンジを加えてみました。

mattintosh.hatenablog.com

bg_compose="{mode}"を書き換えることでホロっぽい背景に変更可。ImageMagickplasma:キャンパスは毎回異なった模様を作成するので気に入ったパターンが生成されるかは運次第なところが面白いですね。フォントサイズが少し大きいので調整予定。これまでは改装画面を使ってたけど、今回は編成の[詳細]を表示した状態のものを使用。

サンプル

■ bg_compose="None"

f:id:mattintosh4:20151211224731p:plain

■ bg_compose="Modulate"

f:id:mattintosh4:20151211222539p:plain

■ bg_compose="Blend"

f:id:mattintosh4:20151211223019p:plain

■ bg="gradient:Gold-Gray40" bg_compose="Modulate"

f:id:mattintosh4:20151211235400p:plain

※フォントサイズ修正

■ bg="gradient:Gold-Gray40" bg_compose="Modulate" p=0

f:id:mattintosh4:20151212000006p:plain

※フォントサイズ修正

ソースコード

Gist に置いてあるので随時変わる可能性があります。

パースをもうちょっと上手に使いたいなぁ…(´・ω・`)


カラオケメーカー by VLC

$
0
0

久しぶりに MacBook Airを使っていて、なぜか「今聴いている音楽をカラオケ音源で聴きたいな」とか思ったのでやってみた。

ここで言う「カラオケ音源」とは ヘッドフォンのプラグが中途半端に抜けた状態のアレのことである(何を言ってるのかわかると思うが)。

で、ffmpegにそんなフィルターなかったかなーと man ffmpeg-filtersを見てみたけど載ってない。でも自分の記憶の中には何かを使って簡単にそんなことを出来た記憶が残っている。まぁマルチメディアファイルを弄ると言えば ffmpegVLCだろうということで VLCのオーディオフィルターを見てみると「カラオケ」というのがあった。そうそう、これこれ。

さて、これをコマンドラインから使うとなるとどうなるのか。簡単な話で transcode モジュールに afilter=karaokeと書けばいいだけだ。

今回のスクリプトではストリームチェインを使わずにグローバルオプションを使うことにした(この2つは微妙に違いがある)。

使い方は以下のように引数にオーディオファイルを渡すだけ。例えば audio.wavというファイルを渡せば audio_karaoke.wavというファイルが出来上がる。

./gistfile1.sh audio.wav

Macでバンドル版を使っているという場合は、恐らく vlcにパスが通ってないので VLC変数で指定することになるはず(うちはセルフビルド版と MacPorts版なのでバンドル版のことは忘れたんじゃ)。

VLC=/Applications/VLC.app/Contents/MacOS/VLC ./gistfile1.sh audio.wav

たまにはこういうので聞いてみるのも面白い。

カラオケメーカー by VLC の続き

$
0
0

前回の続きです。今回はサンプルを作ってみました。

mattintosh.hatenablog.com

ソースは YouTube Audio Library から借りてきました。(音声入りで改変自由な音源探すのが一番面倒だった)

こちらはオリジナル。

www.youtube.com

こっちが VLCのカラオケフィルターを適用したもの。

www.youtube.com

動画の作成には ffmpegを使用しました。YouTubeアップロードする動画の推奨エンコード設定(詳細) - YouTube ヘルプを見ると、MOOV フラグ(ファストスタート)、クローズドGOP、などを追加するような記載があったので追加してみました。

ffmpeg -v info -i"${1}"\-c:v libx264 -preset slow -r25-pix_fmt yuv420p -psnr\-c:a aac -strict experimental \-movflags faststart \-filter_complex'[0:a]showspectrum=s=640x480:mode=separate[out]'\-map'[out]'-map0:a \-x264optscrf=18:bframes=2:cabac=1:open_gop=1\-y"${out}".mp4

普段はだいたい MacUbuntuを使ってるんですが Ubuntuのデフォルトって ffmpegではなく libav なんですよね。動画の変換だけしているときは「どっちもそんなに変わらないじゃん?」と思ってたんですが、Ubuntuの libav-tools では音声から動画を作成する avectorscopeとか showspectrumが使えないという…なんてこった。

Excel VBA のメモ

$
0
0

ブックを開いたときにい全てのシートに同じ余白を設定する

全てのドキュメントで常に同じ余白を自動設定したいときに。ファイルをいちいちマクロ付きで保存しなきゃいけないなどの面倒くささは残る。

また、BlackAndWhite(Boolean)を設定すれば白黒印刷も自動化できるので、経費削減などで白黒印刷を推奨している現場では役に立つ(かもしれない)。

PrivateConst MARGIN_OUTER AsSingle=1.5PrivateConst MARGIN_INNER AsSingle=3PrivateSub Workbook_Open()With ThisWorkbook
    For i =1To Worksheets.CountWith.Worksheets(i).PageSetup
            .HeaderMargin  = Application.CentimetersToPoints(MARGIN_OUTER).FooterMargin  = Application.CentimetersToPoints(MARGIN_OUTER).TopMargin     = Application.CentimetersToPoints(MARGIN_INNER).RightMargin   = Application.CentimetersToPoints(MARGIN_INNER).BottomMargin  = Application.CentimetersToPoints(MARGIN_INNER).LeftMargin    = Application.CentimetersToPoints(MARGIN_INNER).BlackAndWhite =True'白黒印刷EndWithNextEndSub

PageSetup オブジェクト (Excel)

ファイル選択ダイアログを表示する

PrivateConst INPUTFILE_COUNT AsByte=2Sub main()Dim i AsLongDim inputfile(INPUTFILE_COUNT -1)AsVariantFor i =0ToUBound(inputfile)
        inputfile(i)= Application.GetOpenFilename(,, i +1&"つ目のファイルを選択してください")If inputfile(i)=FalseThenExitSubNextEndSub

Application.GetOpenFilename メソッド (Excel)

ブックを開いた時に自動実行する関数と閉じるときに自動実行する関数

  • Sub Workbook_Open()
  • Sub Workbook_Close()

新しいブックを作成してデータを書き込む

マクロを実行するためのファイルと CSVファイルなどのファイルをインポートしたデータを同じファイルに保存してしまうとファイルサイズが増えてしまうので結果を新しいブックに書き込む。

Private new_wb_ws1 As Worksheet
Private new_wb_ws2 As Worksheet

PrivateFunction CreateNewWorkbook()Dim tmp AsLongDim new_wb As Workbook
    tmp = Application.SheetsInNewWorkbook'新しいブックのシート数設定を保存
    Application.SheetsInNewWorkbook =2Set new_wb = Workbooks.AddWith new_wb
        Set new_wb_ws1 =.Worksheets(1)Set new_wb_ws2 =.Worksheets(2)EndWith
    Application.SheetsInNewWorkbook = tmp
EndFunctionSub main()Call CreateNewWorkbook
    new_wb_ws1.Cells(1).Value=1
    new_wb_ws2.Cells(1).Value=2EndSub

Workbooks.Add メソッド (Excel)

🍎 Nihonshu アップデート情報 2015年12月31日 🍷

$
0
0

Twitterでは先週あたりに告知していたのですが、久しぶりに Wine をビルドしました。最近はすっかり Linuxユーザなので Macを起動することすら減ってしまいました。

Wine の更新に伴うソースコードの修正だけで、細かい動作確認とかはしてません。ごめんなさい。

ちょっと色々遊んでみました。

※「カスタムメイド3D2」は成人向けゲームです。

ダウンロードはいつも通りまとめのページから。

matome.naver.jp

Twitterで NXWine、Nihonshu、EasyWine、MikuInstaller-Kai-Kit、Wineskin についての使い分けのお問い合わせをいただいたので少し書いておきます。

NXWine は一番最初に配布していたもので、DirectXなどのネイティブライブラリが入っています。ゲームによってはネイティブライブラリを必要とするものがあり、通常は自分でインストールしたり、Winetricks を使ってインストールします。NXWine は起動時のローダにそれらのインストールと初期設定を自動で行う仕様にしてあります(た、確か…)。また、当時は Objecttive-C とかが書けなかったので AppleScriptで簡易インターフェイスをつけています。

Nihonshu は Wine のソースコードを弄って「日本語版 Windows」として起動するようにしてあります。その他、OS Xのメニューバーを自動非表示にしたりする機能があります。これは好みが分かれるところなのですが、1280x720 のディスプレイでゲームを起動したりすると OS Xのメニューバー分、縦の解像度が不足してしまい、結果、アプリケーションウィンドウの縦が切れてしまうというようなことを防止するためのものです。現在、手動ではありますがデフォルトのライブラリと改造してあるライブラリの参照をシンボリックリンクによって切り替えられるようにしてあります。

EasyWine は Nihonshu をベースに Finder からファイル入力を受け付けたりできるようにしてあるものです。こちらも AppleScriptをラッパー(?)にしてあるだけのものです。実は、Windowsアプリケーションを複数同時に起動することもできるのですが、AppleScript側でコメントアウトしてあるのでこちらも手動での作業が必要です。また、通常は ~/.wineWindows環境のファイルが構築されるのですが、隠しフォルダになっているため、~/Library/Caches/Wine以下に Windows環境を作成するように変更していますのでアンインストールが簡単にできるようになっています(いつからか OS X~/Libraryを非表示にするようにしてしまいましたが…)。

MikuInstaller-Kai-Kit と Wineskin 用はそれぞれのアプリケーション用の Wine を Nihonshu で置き換えるだけのものです。日本語の設定などが面倒!という方は Nihonshu を使っていただくそのあたりが省略できるかと。


で、「結局どれを使えばいいの?」というお話ですが、Wine についてよく知らない方は EasyWine.app がおすすめです。


気づいたら Wine のバージョンが 1.8 に上がってましたね。現在は RC 版なので、正式版が出たらまた新しくビルドしようと思います。

X11 Forwarding で音声を再生する

$
0
0

ArchLinux をインストールして NASとして使っている Raspberry Pi。SSHX11 Forwarding を使って VLCや ffplay(avplay)で音楽再生したいなぁ、と。あと、Chromiumで実行している艦これの音声を拾ったりとか。

ここでは Pulse オーディオを使用する。Pulse サーバとクライアントの設定にはいくつかの方法があるが、今回は pulseaudio同士で接続する方法と RTP による送受信を試した。

RTP で再生

1.「Pulse サーバで RTP 送信を行う」

module-rtp-sendをロードする。

pactl load-module module-rtp-send

特に何も指定しない場合、224.0.0.56で発信される。

2.「クライアントで受信を行う」

pulseaudioを使用する場合は module-rtp-recvモジュールをロードするだけでよい。これだけで SSHクライアントマシンがスピーカー扱いのようになる。

pactl load-module module-rtp-recv

音声をキャプチャしたりする場合は、VLCや ffplay(avplay)などの RTP に対応しているものがあればよい。(module-rtp-sendでポートを指定しなかった場合は netstatなどで調べておく必要があるかもしれない)

ffplay rtp://224.0.0.56:46434
vlc rtp://224.0.0.45:46434

X11 Forwarding を使って Raspberry Pi で Chromiumを起動して、クライアント側の ffplay で音楽をキャプチャしてみた。

f:id:mattintosh4:20160102004102p:plain

設定ファイルを使用する場合(module-rtp-send)

/etc/pulse/default.pa~/.config/pulse/default.paにコピーし、module-rtp-sendを有効にしておけば実行中はどのデバイスからもアクセスすることができる。

load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 sink_properties="device.description='RTP Multicast Sink'"
load-module module-rtp-send source=rtp.monitor

あとは受け側で module-rtp-recvをロードするだけで勝手に再生される。

pactl load-module module-rtp-recv

TCPで再生

1.「Pulse サーバで TCPモジュールをロードする」

SSHクライアント側でモジュールをロードする。ここで言う「SSHクライアント」とは「Pulse サーバ」である。今回は認証を行わないことにするが、auth-ip-acl=127.0.0.1などとすることで許可するクライアントを指定することもできる。

Pulse サーバの起動とモジュールのロードは pulseaudioコマンドか pactlコマンドで行うことができる。

pactl load-module module-native-protocol-tcp auth-anonymous=true

または

pulseaudio --start--load="module-native-protocol-tcp auth-anonymous=true"

auth-anonymous=trueauth-anonymous=1とも書けるみたい。

2.「PULSE_SERVER 環境変数で Pulse サーバへ接続する」

SSHでサーバへ接続した後、アプリケーションを起動する。その際、PULSE_SERVER環境変数で Pulse サーバの IP アドレスを指定する。ここでは「SSHクライアント = Pulse サーバ」ということになるので SSH_CLIENT環境変数から IP アドレスを抜き出して使う。

PULSE_SERVER=`echo $SSH_CLIENT| awk '{ print $1 }'` vlc *.m4a

awkを使わずにシェルで置換展開が使える場合はそちらの方が楽である。

PULSE_SERVER=${SSH_CLIENT%% *} vlc *.m4a

設定ファイルを使用する場合(module-native-protocol-tcp

Pulse サーバ(SSHクライアント)

pulse の設定ファイルをコピーする。

cp /etc/pulse/default.pa ~/.config/pulse

コピーした ~/.config/pulse/default.paを編集して module-native-protocol-tcpをロードするようにしておく。

#load-module module-native-protocol-tcp
load-module module-native-protocol-tcp auth-anonymous=true

pulseaudioを再起動する。

pulseaudio --kill
pulseaudio --start

Pulse クライアント(SSHサーバ)

Pulse クライアント用の設定ファイルをコピーする。

cp /etc/pulse/client.conf ~/.config/pulse

コピーした ~/.config/pulse/client.confdefault-serverに Pulse サーバ(SSHクライアント)の IP を指定する。

; default-server =
default-server = 192.168.1.2

pulseaudioを再起動する。

pulseaudio --kill
pulseaudio --start

SSHクライントから接続し、アプリケーションを実行すれば Pulse サーバ側で音が鳴る。Pulse サーバの IP アドレスは ~/.config/pulse/client.confに書いてあるので PULSE_SERVER環境変数の設定は不要。


Viewing all 878 articles
Browse latest View live