Runo Sahara のすべての投稿

ジブリ美術館のチケットを代理で購入

外国人に「ジブリ美術館のチケットを代理で購入してもらえないか」と聞かれた。(これで2回目)

チケットを頼まれる理由

ジブリ美術館のチケットの購入できる数は、海外と国内で別れている模様。

国内向けは毎月の10日に次の月のチケットが販売開始されるが、
海外向けのチケットはその前に売り切れてしまうらしい。

そのため、こちらにとってはまだ発売前なのだが、「チケットがもう売り切れだ、他に手に入れる手段がないか」と聞かれる。

購入時の注意点

ジブリ美術館のチケットには名前が印刷される。
転売を阻止するため、美術館に入場するときに入り口でチケット購入者の本人確認が行われるからだ。

公式サイトより引用:

購入者のお名前が券面に印字される記名式のチケットとなります。美術館入口にてチケット購入者の本人確認を行う場合がありますので、身分証明書(免許証、各種保健証、学生証、パスポート、マイナンバーカードのいずれか)をご持参くださるようお願いいたします。また、お連れの方は全員そろってご入場ください。

ローソンの販売機(ロッピー)でチケットを購入すると、チケットに印刷される名前は自由に編集でき、アルファベットも使える。
この名前は購入者で、複数枚購入するときは各チケットに同じ名前が記載される。
入場のときは購入者が自分の名前を証明するためにパスポートを持ってくる必要がある。

ローソンの販売機では電話番号も聞かれるが、日本の番号でないと駄目か分からないため、自分の番号を入力して買った。

お金の受取

日本では大人のチケットは1000円。
Paypalアカウントのメールアドレスを希望者に送り、チケットの金額と手数料を入金するように依頼した。
(Paypalは、残高を銀行に移すときに250円掛かる。)

チケットが海外でいくらで販売されているかわからないが、ものすごく喜んでいた。

LINE Payカードで総額100万円超える航空券を旅行会社で支払う

動機

航空券を支払う際、LINE Payカードを利用し、2%のポイントを取得すること。

結論から言うと、チャージ上限、決済上限が100万円のLINE Payカードでも、総額100万円を超える航空券を支払えた。
今回は新宿ルミネ1のJTBで、マネージャーっぽい人が担当してくれて、話が通じた。

ハードルは高めだが、例えば総額200万円だと20分位の手間で4万円(ポイント)もらえると考えると、悪くないかも知れない。

手順

  1. 店員に決済の全体の流れを説明する。(若い店員は嫌がる)
  2. 搭乗者の席や名前を指定して予約を普通に進める。
  3. 決済を何回かに分割するようにお願いする。
    (航空券1枚ずつ、2枚ずつ等、1回の決済が100万円以内になるように調整)
  4. セブンATMに行く→LINE Payカードをチャージ→旅行会社に行く→決済 を分割した回数繰り返す。
    (航空券の予約から支払いまでの期限は1日なので、同じ日に済ませる)

解説

同じ予約の搭乗者がそれぞれ自分のカードで支払うケースに旅行会社が対応している。
支払いは航空券ごと分割して別のカードや別の支払い方法が使える。

ただし、支払いを分割した上で毎回同じ人が払い、毎回同じカードを使うのは店員にとってかなり特別なケース。

現実

まずLINE Payカードみたいな、名義が氏名と異なるカード(名義は「LINE MEMBER」固定)は店員が慣れていないので使えるか確認に時間が掛かる。
JTBのシステムでは「LINE MEMBER」と入力して貰って使えた。

若い店員は支払いを航空券ごと分割できることを知らないので説明が必要。(電話で確認取っていた。)
更に分割して同じ人が支払うと言うと不審者を見る目で見られるので、「ポイントを貯めるため」とはっきり説明して説得する必要がある。

注意点

セブンATMで1回で入金できるのは50万円までだが、何回でも入金できるので実質問題無い。
他の入金方法だと制限があるので注意が必要。

セブンATMが遠いと大変なので、WEBでセブンATMの位置を確認した。
ちなみに新宿ルミネ1の6階にあるJTBは、ミロード3階のセブンATMが一番近い。

JTBだと1回の決済に5分位掛かった。電話でどの航空券を次に決済するか指定してから実行という流れだ。
この方法で決済する場合、決済の回数ごとに席を離れるので、比較的空いている朝の時間に訪れるのが良かった。

bash trap使うサンプル

trap中

#!/bin/bash -e

echo begin
trap 'echo trap exit' EXIT

echo processing
#sleep 3 # ターミナルでcontrol+C
#exit 1 # スクリプトをexit
#kill $$ # 自分のpidをkill
#false # -e オプション使用中に1の返り値

trap - EXIT
echo end

出力:

begin
processing
trap exit

trap解除後

#!/bin/bash -e

echo begin
trap 'echo trap exit' EXIT

echo processing

trap - EXIT

#sleep 3 # ターミナルでcontrol+C
#exit 1 # スクリプトをexit
#kill $$ # 自分のpidをkill
#false # -e オプション使用中に1の返り値

echo end

出力:

begin
processing

bash -e オプション

エラーコード(0以外のステータス)が発生した時にスクリプトを中断してくれる -e オプション。
中断しないケースを調べた。

中断しないケース

  • whileとuntilの直後のコマンドの場合
  • ifに使われている条件コマンドの場合
  • || や && リストに実行されるコマンドの場合、ただし最後のコマンドは除く
  • パイプラインの中のコマンドの場合、ただし最後のコマンドは除く
  • コマンドの結果を ! で反転している場合
  • サブシェルでエラーが発生したけど、その環境では-eを設定していない場合

エラーにたいするtrapが設定されている場合は、終わる前に実行される。

一部中断したくない場合の手段

||でコマンドを終わらせる

失敗した場合の処理又はtrueを追加する。
失敗コマンドのエラーコードは消えてしまう。

#!/bin/bash -e

false || true
echo $?
false || echo failed
echo $?
echo end

出力:

0
failed
0
end

&& trueでコマンドを終わらせる

何もしない && true で終わらせる。
失敗コマンドのエラーコードは取れる。

#!/bin/bash -e

false && true
echo $?
echo end

出力:

1
end

一時的に-eオプションを解除する

#!/bin/bash -e

set +e
false
set -e
echo end

出力:

end

参照

Bash Reference Manual (The Set Builtin) より引用:

Exit immediately if a pipeline (see Pipelines), which may consist of a single simple command (see Simple Commands), a list (see Lists), or a compound command (see Compound Commands) returns a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command’s return status is being inverted with !. If a compound command other than a subshell returns a non-zero status because a command failed while -e was being ignored, the shell does not exit. A trap on ERR, if set, is executed before the shell exits.

This option applies to the shell environment and each subshell environment separately (see Command Execution Environment), and may cause subshells to exit before executing all the commands in the subshell.

If a compound command or shell function executes in a context where -e is being ignored, none of the commands executed within the compound command or function body will be affected by the -e setting, even if -e is set and a command returns a failure status. If a compound command or shell function sets -e while executing in a context where -e is ignored, that setting will not have any effect until the compound command or the command containing the function call completes.

git でコミットの差分を適用

任意コミットの差分を適用

git cherry-pick --no-commit <commit1> #<commit2>...

オプション --no-commit(又は -n)を指定して任意コミットをチェリーピックすると、差分だけを適用できる。
(指定しないとコミットのコピーが現在のブランチにコミットされる)

例:


git cherry-pick --no-commit b61ae28116cfe5c4cc8bcc027e489fe40a5d1bff

マニュアルの説明:


git help cherry-pick
#...
       -n, --no-commit
           Usually the command automatically creates a sequence of commits.
           This flag applies the changes necessary to cherry-pick each named
           commit to your working tree and the index, without making any
           commit. In addition, when this option is used, your index does not
           have to match the HEAD commit. The cherry-pick is done against the
           beginning state of your index.

           This is useful when cherry-picking more than one commits' effect to
           your index in a row.

任意コミットのパッチの作成と適用

git diff <basecommit> <modifiedcommit> > patch.diff

git diff で差分のパッチを作成できる。
差分に入るファイルパスは、レポジトリのルートが基準になる。

patch -p0 < patch.diff

パッチファイルはレポジトリのルートで -p0 (=ファイルパスをそのまま守る)で適用すれば良い。

macOS でポップアップの選択肢をタブのキーで操作

設定

システム環境設定/キーボードショートカット タブにて、
フルキーボードアクセス の部分で すべてのコントロール を選択する。

操作方法

  • ポップアップやダイアログが出たら、タブでフォーカス(青い枠)を移動して、選択を決定する場合はスペースを使う。
  • デフォルト(下地が青)の項目で決定するときは、returnキーが使える。

Mac ターミナルのカスタマイズ

bash

設定ファイル:.bash_profile

alias ls='ls -G'
alias l='ls -la'

emacs

設定ファイル:.emacs

(custom-set-variables
  ;; custom-set-variables was added by Custom -- don't edit or cut/paste it!
  ;; Your init file should contain only one such instance.
 '(case-fold-search t)
 '(global-font-lock-mode t nil (font-lock))
 '(show-paren-mode t nil (paren))
 '(transient-mark-mode t))
(custom-set-faces
  ;; custom-set-faces was added by Custom -- don't edit or cut/paste it!
  ;; Your init file should contain only one such instance.
 )

(setq make-backup-files nil)
(column-number-mode t)
(line-number-mode t)

Ubuntu 16.04 に autofs を入れる

特定のディレクトリーにアクセスした時に、自動的にデバイス(USBポータブルHDD等)をマウントする。

インストール


sudo apt-get install autofs

設定

/etc/auto.master を編集する。

設定例

次の行を/etc/auto.masterの最後に追加。

/-      /etc/auto.runodrive
  • 外部ファイル /etc/auto.runodrive に指定された各ディレクトリーを自動マウントするようにする。

/etc/auto.runodriveにデバイスの設定。

/media/runodrive        -fstype=exfat,rw,exec,auto,relatime,noatime,iocharset=utf8,user,umask=111,dmask=000             UUID=57F0-5FB5
  • デバイスのUUIDを知るには sudo blkid

再起動


sudo service autofs restart

ViewControllerを別のViewControllerの任意ビューにはめ込む処理

public extension UIView {

    public func fillSuperviewWithConstaints() {

        let constraints = NSLayoutConstraint.constraints(fillingSuperviewOf: self)

        if #available(iOS 8, *) {
            NSLayoutConstraint.activate(constraints)
        } else {
            if let superview = superview {
                superview.addConstraints(constraints)
            }
        }
    }

}

public extension NSLayoutConstraint {

    public static func constraints(fillingSuperviewOf view: UIView) -> [NSLayoutConstraint] {
        guard let superview = view.superview else {
            return []
        }

        return [NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem: superview, attribute: .top, multiplier: 1.0, constant: 0.0),
                NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem: superview, attribute: .bottom, multiplier: 1.0, constant: 0.0),
                NSLayoutConstraint(item: view, attribute: .leading, relatedBy: .equal, toItem: superview, attribute: .leading, multiplier: 1.0, constant: 0.0),
                NSLayoutConstraint(item: view, attribute: .trailing, relatedBy: .equal, toItem: superview, attribute: .trailing, multiplier: 1.0, constant: 0.0),
        ]
    }

}

public extension UIViewController {

    public func addChildViewController(_ childViewController: UIViewController, filling parentView: UIView, withContraints: Bool) {

        addChildViewController(childViewController)
        childViewController.didMove(toParentViewController: self)

        if let subView = childViewController.view {
            parentView.addSubview(subView)

            if withContraints {
                subView.translatesAutoresizingMaskIntoConstraints = false
                subView.fillSuperviewWithConstaints()
            } else {
                subView.frame = parentView.bounds
            }
        }
    }

}

Protocol and Value Oriented Programming in UIKit Apps

WWDC2016で、Swiftのstruct、protocol、enumの有効な使い方について紹介するセッションがあった。

Protocol and Value Oriented Programming in UIKit Apps (WWDC 2016 – Session 419)

そのセッションで使われたサンプルコードがこちら。

LucidDreams: Protocol and Value Oriented Programming Sample Code

とても興味深くて、勉強になると思ったが、まだマスターできていない。