図書館合金 Part 2

programming and books, music etc.

イルカのミュージックハーモニー

地震があったね。
一曲目が甲斐バンドの「裏切りの街角」。
うーむ、カラオケで誰かが歌ってるの聴いたことあるような曲だが。
いい曲だと思う。
改めて、甲斐バンドっていいねえ。

途中、フォークの生き字引みたいなリスナーからのお便り紹介で、その方が大好きだったという六文銭の「インドの街を象に乗って」。
これまたなんともすごい曲だ。
うーむ。

松山千春 ON THE RADIO

  • オンエア:2017-06-18
  • Nack5

一曲目が世良公則&ツイストの「燃えろいい女」。
久しぶりに聴いたが、意外とバックが軽い演奏で、ノリノリで、へえと思う。
そういえばなんかの化粧品の宣伝曲だったか?
次が竹内まりやの「戻っておいで私の時間」って曲。 いい曲だ。
コンサートツアーで島根に行ったが人がいなくて夜は真っ暗でウォーキングしに出たら怖かった。島根には歌手も竹内まりやしかいない、がんばれって話。
それから「いちご白書をもう一度」、バンバン。
誰が作詞? えっユーミンなの。

小林克也 Best Hit USA

  • オンエア:2017-06-21
  • Nack5

1位はゼッド & アレッシア・カーラのStay。
今日はビートルズのシー・セッド・シー・セッドが作られたとかディープ・パープルのリッチー・ブラックモア脱退とかジョージ・マイケルソニーとの裁判で負けたとか。
あとキャプテン&テニールの話。元々はビーチボーイズのツアーのメンバーだったという。
Love will keep us together ですよね。

初登場の曲はまだピントこないが、上位はあまり動きなし。
ジュリア・マイケルズって人はいろんな人に歌詞を提供してるけど、これがデビュー曲だって話とか。
イシューズね。
うーん。。。 全体的に、なんかもうちょっと違うタイプの曲はないのかな。。

K's Transmission 坂崎幸之助

  • オンエア:2017-06-16
  • Nack5

2曲目がジャクソン・ブラウン孤独なランナー
ライブ版だった。意外にガチャガチャとバンドバンドしてる音で、あーこんなんだっけと。
まあ、どうも突き抜けた感じがないんだよね、ジャクソン・ブラウンは。
その後坂崎幸之助は小学4年でビートルズにはまったという話から、それ以前の音楽という展開でプレスリー
4年生は早いなー。
ませてる。
ん、本人61歳って言ったね。
その後クラプトンのチェンジ・ザ・ワールドがかかったけど、これがまたj-waveでかかるのとバージョンが全然違う。
ギターの音が。。。
後半はライブ盤の特集ってことでチューリップのLIVE!! ACT TULIP。
これまたロックしててびっくり。格好いい。
ローザ・ルクセンブルクのライブ・オーガストかと思った(笑。
がんばってーという観客の女子のかけ声の話で大爆笑。

Music Rumble 湯川れい子

ケイティ・ペリーの特集。
今ガンガンかかってるBon Appetitの人。
全米No1のアーカイブはMrビッグとかヴァネッサ・ウィリアムズ。
他、YESのロンリーハートとか。
なんかイエスは法律的な問題でイエスって名乗れなくて、別の名前で最近来日したとかいう話をしていた。
ジョン・アンダーソンが72歳?
OWNER OF A LONELY HEART ってのもすごい曲名だよな、と思うが。。。

山下達郎サンデー・ソングブック

  • オンエア:2017-06-18
  • 東京FM

本人のライブの曲特集。
夏への扉とか。
聴取率週間だから、その時は必ずライブの曲の特集にしてるような話ぶりであった。
なるほどこの番組を聴く人はなんだかんだいっても山下達郎の曲を聴きたい、聴けるだろう、と思って聞いてるのか。。
当たり前か。。。
SUGARって曲がギターバトル?

夏への扉[新訳版]

夏への扉[新訳版]

松任谷由実のYuming Chord

  • オンエア:2017-06-16
  • 東京FM

ユーミンの好きなブリティッシュロックの特集。
1曲目がポリスの孤独のメッセージ。
こないだのポール・マッカートニーの来日で会ってサインもらっちゃった話とか。
ポールの曲はウイングスの「死ぬのは奴らだ」。
ピンク・フロイドが好きだけど曲が長いのでラジオではかけられないとか。
長いったってねえ。どの辺の曲なのかな? wish you were here とか?
あとエド・シーラン絶賛してた。シンガーソングライター、現代版エルトンジョン。

Wish You Were Here

Wish You Were Here

結局、世の中のvim使いはMBPをどうしたんですかね

まあ、また、新しくMBP出たようですが、15インチはタッチバーのみで、escキーがない。

どうしたもんですかねえ。


MBP Touchbar + VIM = Nightmare?

13インチだとなあ、画面小さいんだよなあ。

vue.jsのコンポーネント、あまりありがたみを感じられない

コンポーネントという機能があり、これは強力そうだなー、って感じではあるのですが、いざやってみるとこんな感じで。

<div id="demo1">

    <input type="text" v-model="message">
    <sample-component v-bind:msg="message"></sample-component>

    <input type="text" v-model="message2">
    <sample-component v-bind:msg="message2"></sample-component>

</div>
// こっちが子
var SampleComponent = Vue.extend({
    template: `<div> {{msg}}</div>`,
    props: ['msg']
})
 
// これが親
var demo = new Vue({
  el: "#demo1",
  data: {
      message: '',
      message2: ''
  },
  components: {
    'sample-component': SampleComponent
  }
})

どうもなんかデータの受け渡しが面倒になっただけで何のありがたみも感じられない。

分ければ分けるほど物事が複雑になって分かりにくくなる。

ウルトラマンX ウルトラ怪獣X 09 ゴメス(S)

ウルトラマンX ウルトラ怪獣X 09 ゴメス(S)

vue.js で複数ファイルアップロード、プレビュー表示

画像を登録してファイルアップロードという処理だが、登録画面からファイル一個だけ登録すればいい、という話はあまりなくて、なんだかんだで複数登録したいんだがどうすればいいのかという話になる。

なのでこういうのは結局複数登録に対応していないと話にならないのだ。

モッピー!お金がたまるポイントサイト

というわけでHTML側は、こんな感じで。

<div id="app">
  <div>
    <h2>Select an image</h2>
    <input type="file" @change="onFileChange">
  </div>
  <div v-if="images">
      <ol>
          <li v-for="(image, index) in images">
            <h2>{{image.name}}</h2>
            <img :src="image.thumnail" />
            <button @click="images.splice(index, 1)">Remove image</button>
          </li>
      </ol>
    <button @click="submitImage">Submit image</button>
  </div>
</div>

v-for でループさせるわけだが、その中のHTMLマークアップは適当に書いてます。
<li>が基本単位でそれで繰り返し表示にしようということですね。
で、ループを (image, index) in images というように書くと、このループのindex(今何番目か)が取得できる。
それを使って、Removeクリックで、splice(index, 1) とすることで、配列の最初からindex番目の要素を1個削除しようということですね。

js側は、

var app = new Vue({
    el: '#app',
    data: {
        images: []
    },
    methods: {
        onFileChange: function(e){
            var files = e.target.files || e.dataTransfer.files;
            this.createImage(files[0]);
        },
        createImage(file) {
            var image = new Image();
            var reader = new FileReader();
            var vm = this;
            var obj = {};
            reader.onload = function(e) {
                obj.thumnail = e.target.result;
                obj.uploadFile = file;
                obj.name = file.name;
                vm.images.push(obj);
            };
            reader.readAsDataURL(file);
        },
        submitImage: function(e) {
            var formData = new FormData();
            formData.append("number", "123456");
            for (var i = 0; i < this.images.length; i++) {
                formData.append('yourimg' + i, this.images[i].uploadFile);
            }
            var config = {
                headers: {
                    'content-type': 'multipart/form-data'
                }
            };
            axios
                .post('post.php', formData, config)
                .then(function(response) {
                    // response 処理
                    console.log(response);
                })
                .catch(function(error) {
                    // error 処理
                })
        }
    }
});

data は全体は images という配列になっていて、その一個一個が name(ファイル名), thumbnail(画像プレビュー用データ), uploadFile(画像そのもの)というオブジェクトから成っている。
createImage ではファイル情報からオブジェクトを生成して、それをimages配列に追加している。
配列に追加すると、画面に表示される。
remove ボタンクリックでその配列から要素を削除すると、画面も消える。
サーバー側にサブミットする時はformDataに一つずつappendしてpostする。

なんとも、@click="images.splice(index, 1)"これだけで消せてしまうってのがすごいよー。 jquery的にボタンのparentのliの、。。なんて考えなくてよいという。。。

Let It Be

Let It Be

vuejs でFormData つかってファイルアップロード

ついでなので、ファイルをpostするところまで追加してみる。

<div id="app">
  <div>
    <h2>Select an image</h2>
    <input type="file" @change="onFileChange">
  </div>
  <div v-if="image">
      <h2>{{imgName}}</h2>
    <img :src="image" />
    <button @click="removeImage">Remove image</button>
    <button @click="submitImage">Submit image</button>
  </div>
</div>
var app = new Vue({
    el: '#app',
    data: {
        image: '',
        imgName: '',
        uploadFile: ''
    },
    methods: {
        onFileChange: function(e){
            var files = e.target.files || e.dataTransfer.files;
            if (!files.length) {
                return;
            }
            if (!files[0].type.match('image.*')) {
                return;
            }
            this.createImage(files[0]);
            this.uploadFile = files[0];
        },
        createImage(file) {
            var image = new Image();
            var reader = new FileReader();
            var vm = this;
            reader.onload = function(e) {
                vm.image = e.target.result;
            };
            reader.readAsDataURL(file);
            vm.imgName = file.name;
        },
        removeImage: function(e) {
            this.image = '';
            this.imgName = '';
        },
        submitImage: function(e) {
            var formData = new FormData();
            formData.append("number", "123456");
            formData.append('yourimg', this.uploadFile);
            var config = {
                headers: {
                    'content-type': 'multipart/form-data'
                }
            };
            axios
                .post('post.php', formData, config)
                .then(function(response) {
                    console.log(response);
                    // response 処理
                })
                .catch(function(error) {
                    // error 処理
                })
        }
    },
});

うーん、なんかすっきりしないが。 まあ、でも、結局はファイルはサーバー側でなんとかするしかないわけだし、多かれ少なかれこんな感じになるのでは。

モッピー!お金がたまるポイントサイト

vuejsとFileAPIでファイルアップロードのプレビューまで

File APIなんてものが使えるようになってたのね。 IE10以上、ならいいんじゃないかなー。

で、こちらを参考に。

codepen.io

<div id="app">
  <div v-if="!image">
    <h2>Select an image</h2>
    <input type="file" @change="onFileChange">
  </div>
  <div v-else>
    <img :src="image" />
    <button @click="removeImage">Remove image</button>
  </div>
</div>
var app = new Vue({
    el: '#app',
    data: {
        image: ''
    },
    methods: {
        onFileChange: function(e){
            var files = e.target.files || e.dataTransfer.files;
            if (!files.length) {
                return;
            }
            this.createImage(files[0]);
        },
        createImage(file) {
            var image = new Image();
            var reader = new FileReader();
            var vm = this;
            reader.onload = function(e) {
                vm.image = e.target.result;
            };
            reader.readAsDataURL(file);
        },
        removeImage: function(e) {
            this.image = '';
        }
    },
});

恐ろしく簡単に実現できる。すげえなあ。

モッピー!お金がたまるポイントサイト

vue.js 他のモーダルmagnificPopupと組み合わせる場合

こんな感じのmagnificPopupが組み込まれている場合、

<a class="pop-up" href="confirm.php"><img src="./close.png" alt=""/></a>
$(function(){
    $('.pop-up').magnificPopup({
        type: 'iframe',
        disableOn: 200,
        mainClass: 'mfp-fade',
        removalDelay: 200,
        preloader: false,
        fixedContentPos: false
    });
});

confirm.php

                       <div class="bwrap">
                            <a href="#" v-on:click="closeModal">OK</a>
                            <a href="#" v-on:click="cancel">キャンセル</a>
                        </div>

としておいて、

var app = new Vue({
    el: '.bwrap',
    methods: {
        closeModal: function(){
            console.log('ok');
            parent.$.magnificPopup.close();
        },
        cancel: function(){
            console.log('canceled');
            parent.$.magnificPopup.close();
        },
    },
})

こんな感じかなー。いずれにしろmagnificPopupのiframeは極力避けた方がいい。