それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Object.assign は何をする為にあるんや?

Object.assign が使えるようになってる。

Object.assign() - JavaScript | MDN

Object.assign(target, ...sources)

せっかくなので調べてみて、ソースコードの重複が減らせるのに使えるか調べてみた。

Object.assign は何をするのか

var a = { age : 17 }
var b = {name:'takuya', age: 19 }
var c = Object.assign( a,b )

console.log( c )

実行結果

{ age: 19, name: 'takuya' }

a に b を上書きする。ハッシュの結合とも言える。

連想配列を結合するときに Object.assign が便利コレ。

また、データと操作を別に作っておいて

クラスを new する感じにも使える。

コンストラクタで初期化データを渡してオブジェクトをnewして、データをいれて初期化する基本パターンを手軽に書くという意味においては便利

コンストラクタで、初期データを投入するパターン

Java で初級者が習う、コンストラクタで初期化するパターン

class Person {
  public String name;
  public String age;
  public Persion ( name, age ) {
    this.name = name ;
    this.age= age;
  }
  public static void main (String args[]) {
    Person p1 = new Person( "takuya", "19" ) 
  }
}

これをJSで書くとこんな感じになってめんどくさい。

var Person = function Person( name,age ){
  this.name = name;
  this.age  = age;
  this.say = function say (){ return (`Hello , I'm ${this.name}`) }
}
var p1_data = { name: 'takuya', age: 19 }  //← めんどくさい
var p1 = new Person( p1.name, p1.age ) //← めんどくさい

プロパティをEnumerationしていちいち突っ込むのがめんどくさいよね。

Object.assgin を使うと楽ができる。

var Person = {
    say: function () { return (`Hello , I'm ${this.name}`) }
}
var json_str = '{ "name":"takuya", "age": 19 }'

var c = Object.assign( JSON.parse(json_str) , Person )
console.log( c )
console.log( c.say() )

実行結果

{ name: 'takuya', age: 19, say: [Function: say] }
"Hello , I'm takuya"

Object.assign の多重利用( Mix-in )

複数のメソッドをもつオブジェクトに多重継承的にやりたいときも便利

var json_str = '{ "name":"takuya", "age": 19 }'
var c = Object.assign( JSON.parse(json_str) , {} )
var Person = {
      say: function () { return (`Hello , I'm ${this.name}`) }
}
var User = {
      'is_成年': function () { return this.name >= 20; }
}
c = Object.assign( c , Person )
c = Object.assign( c , User )

console.log( c )
console.log( c.say() )
console.log( c.is_成年() )

ネストした場合にどうなるのか

オブジェクトがネストしている場合、assign するとどうなるのか。

deep copy を期待すると出来ない。参照になる。

var person_01 = { name: 'takuya', address: { pref:'osaka' } }
var person_02 = { name: 'yakuta' }
c = Object.assign( person_01 , person_02 )
console.log( c )
// => { name: 'yakuta', address: { pref: 'osaka' } }
person_01.address.pref = 'kyoto'
console.log( c ) 
// =>  { name: 'yakuta', address: { pref: 'kyoto' } } # 参照コピーなので変わっちゃう

ディープコピーを意図しても参照扱いになって、ちょっと面倒になる。この辺は非常に使いづらい気がする。

他にも prototype の扱いに注意。

var Person = function Person( name,age ){
  this.name = name;
  this.age  = age;
  this.say = function say (){ return ("Hello , I'm "+this.name+"." ) }
}

p1.__proto__ //Person {}
p2 = Object.assign( {}, p1  ) 
// => { name: 'takuya', age: 19, say: [Function: say] }
p2.__proto__ //  {}
p1.name //'takuya'
p1.name = 'ya'  //'ya'
p2.name // 'takuya'

コピーされるのは、最上位のオブジェクトだけで、かつfor .. in列挙可能 な物に限られる。 prototype はコピーされない。

コピーされるのは、次のもの

// #### TODO 要確認
for ( i in a ) {
 if( a.hasOwnProperty( i ) ) {
   console.log(i)//ここに制御くるやつ
 }
}

コンストラクタの代わりに突っ込む

冒頭の例の、コンストラクタの代わりに突っ込んでassign することも出来るが。。。実はかえって面倒なことになる可能性を秘めている。

deep copy と参照問題で余り使い所はないかもしれない。

コレくらいのかんたんな結合なら全く問題ない。

// Person { name: undefined, age: undefined, say: [Function: say] }
Object.assign( p1, {name:'takuya'} )
// => Person { name: 'takuya', age: undefined, say: [Function: say] }
p1 = Object.assign( p1, {name:'takuya', age: 19} )
// => Person { name: 'takuya', age: 19, say: [Function: say] }

ただし、これを延長したりネストしたオブジェクトを使うと、途端に考えることが増えてめんどくさくなる。

なので、使い捨てJSON.parse(str) や shallow copy を拡張するのに限りとても便利だと思われる。

安全なObject.assign

prototype がコピーされない、参照コピーになってしまう。このあたりを考慮しObject.assign() を使うと new して 即時オブジェクトをAssignすることになる。

// # 使い捨てなので参照を間違って書き換える心配はない その1
var c = Object.assign( new Person() , JSON.parse(json_str) ) 
// # 使い捨てなので参照を間違って書き換える心配はない その2
var c = Object.assign( new Person() , {name:'takuya', age: 19, type: { user: true }} ) 
// # 浅いコピーなので問題ない。
var a = {name:'takuya', age: 19}
var c = Object.assign( new Person() , a ) 

まとめ

  • Object.assign は {} を結合するのに便利
  • ただし、深いコピーは出来ない
  • 浅いコピーは出来るが、深い部分は参照コピーになって不便
  • __proto__ など列挙されないものは、コピーされない
  • 変数同士の結合は参照の書き換えでバグる可能性がある。
  • JSON.parse()の結果にメソッド生やすのに便利
  • 逆手に取れば、生やしたメソッドを参照共有してくれるので便利。

此のままでは使いにくいので、なにかラッパーを噛ませる。たとえば再帰的にコピーするとか、プロトタイプをコピーするような関数と組み合わせたら便利に使える気がする。まぁそのへんはフレームワーク側がいいようにやってくれるんだろうと期待しておく。

浅いコピーのあたりを油断してassignをガンガン使うと、この先の仕様変更で技術的負債になりそうな気がする。

今回は、prototype に assign するようなことは試してないので今後試してみたい

divのポインタイベントの停止をCSSでやるpointer-events(クリック禁止を手軽にやるCSS)

CSSマウスポインタのイベントを全部disabledにすることが出来る

  pointer-events: none;

なぜ無効化するのか

div を複数枚重ねてて、前面のイベントを無視したいとか、Divを透過させててクリックイベントを暴発させたくない時がある。

サンプル1: ポインタイベントを解釈する場合

イベント登録しているので、クリックするとログに書かれます。

    document.querySelector('div.sampleBox2 > div.wrapper').addEventListener('click', function(e){
      sample_box1_console.log('b','wrapper click');
      
    });
    document.querySelector('div.sampleBox2 > div.wrapper > div.box1').addEventListener('click', function(e){
        sample_box1_console.log('a','box1 click');
    })

サンプル2 クリックなどのポインタ動作を無視する

イベント登録しているけど、何も起きない例です。CSSを入れたのがコレです。

  pointer-events: none;

propagation するので、イベントが透過する。

もちろんPropagationがあるのでイベントがバブリングして透過するので、前面のイベント拾っても後ろに 透過するんです。

透過Divのクリックイベントも透過させることは最初から出来るので

前面のdiv側にpointer-events: none;を入れてやれば、前面のDIVのイベントハンドラ登録はそのままで一気に無効化出来る。

透過Divのクリックイベント透過させるように見せかけられるとうわけだ

何に使うの?

スクロール中の Hover イベントの暴発を防いだり、ボタンを一時的に押せなくしたり。ドラッグ中の暴発を防いだり。とにかく便利ですね。

コンテンツのコピペ防止に使うため?(てかその目的には使えない)

参考資料

https://developer.mozilla.org/en/docs/Web/CSS/pointer-events

iOSの画面をMacに表示してプレゼンで手軽に使いたい

iOSの画面をプレゼンしたい。

プレゼン中に、iOSの画面をだしてデモを手軽行いたい。 どうやるのか、調べたら、Mac があればとても簡単にできることがわかった。

QuickTime Player を使う。

MacがあればiOSの画面収録が簡単です。

  1. Lightning Cableで iOSMacを接続
  2. MacQuickTimeを起動
  3. QuickTimeで新規ムービー収録
  4. バイスiOSが出てくるので接続
  5. iOSのロックを解除

これだけで手軽にiOSの画面をプレゼン用に使えます。

録画は押す必要はないです。

実際にやってみたサンプル

youtu.be

iTerm でダブルクォートで囲まれた文字を選択したい

ダブルクォートで囲まれた文字列を選択したい

json とか ダブルクォートで囲まれた文字列を選択してコピーしたいんだけど、ダブルクォートを文字列の一部として取り出すのでちょっとめんどくさいことが多い

調べたら、4回クリックで選択できるようになってる。

初期設定

初期設定を確認したら次のようになっていた。

Preferences -> Profiles -> Advanced -> Smart Selection

f:id:takuya_1st:20170215220627p:plain f:id:takuya_1st:20170215220621p:plain

bashのブレース展開の変数置換でPATHをぱぱっと確認する。

PATHってパット見でわからないので整形したい。

echo -e ${PATH//:/'\n'}

実行結果

takuya@~$ echo -e ${PATH//:/'\n'}
/Users/takuya/.pyenv/shims
/Users/takuya/.pyenv
/Users/takuya/.bin
/usr/local/sbin
/usr/local
/opt/X11
/usr/sbin
/usr
/sbin

/Users/takuya/.rbenv/shims
/usr/local/share/npm

ああ。楽ちん。

これを関数にしておこう

function path_show(){
  echo -e ${PATH//:/'\n'}
}

いままで、rubyワンライナーでやってたけど

echo $PATH | ruby -aF: -ne "puts \$F"

bash の展開のほうが圧倒的に楽ですね。

IFSを使うなら

IFS=':'
for i in $PATH ; do echo $i; done
/Users/takuya/.pyenv/shims
/Users/takuya/.pyenv/bin
/Users/takuya/.bin
/usr/local/sbin
/usr/local/bin
/opt/X11/bin
/usr/sbin
/usr/bin
/sbin
/bin

/Users/takuya/.rbenv/shims
/usr/local/share/npm/bin

などと出来る。

webkit2png が mac OSX 10.11以降で動かないので対策

webkit2png を使おうとしたら動かない。

エラーは以下の通り。

2017-02-14 17:55:36.413 Python[96859:6854691] Can't open input server /Library/InputManagers/MultiClutchInputManager.bundle
Fetching http://auctions.yahoo.co.jp ...
2017-02-14 17:55:36.461 Python[96859:6854754] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
 ... something went wrong: The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

動かない理由

El capitan 以降 sierra も、iOSと同じで アプリ側のHTTP の通信がブロックされる、webkit2png はPython で内部的に AppKit を使ってるんドエこの影響を受ける。

対策1

http を使わない

webkit2png http://auctions.yahoo.co.jp/ 

コレがエラーになるので、HTTPSを使うようにする

webkit2png https://auctions.yahoo.co.jp/ 

対策2

webkit2png が動かないときは、Configuring App Transport Security に例外を適用する。

このコードを適当なところに書いておく、

from objc import YES
from AppKit import NSBundle
bundle = NSBundle.mainBundle()
info = bundle.localizedInfoDictionary() or bundle.infoDictionary()
info['NSAppTransportSecurity'] = {'NSAllowsArbitraryLoads': YES}

私は、この辺に書いた

 34 try:
 35     import Foundation
 36     import WebKit
 37     import AppKit
 38     import Quartz
 39     import objc
 40     ## 2017-02-14 by takuya
 41     from objc import YES
 42     from AppKit import NSBundle
 43     bundle = NSBundle.mainBundle()
 44     info = bundle.localizedInfoDictionary() or bundle.infoDictionary()
 45     info['NSAppTransportSecurity'] = {'NSAllowsArbitraryLoads': YES}

iOSでHTTPでアクセスできないのは理解できるんだけど、Mac側にもポートされると、ちょっと不自由なOSになりましたね。

参考資料

ファイルサイズを取得し、変数に格納する

rubypython からすぐ出来るんですが、bashでやると面倒ですね

ruby

File.size( 'path/to/file' )

python

import os 
os.path.getsize('path/to/file')

bash

どうやるの? ls -l だと余計なものが多いし。。。まさか、cut してgrep する〜?awkする?

いくつかあるけど stat が良さそう

stat -c %s path/to/file

コレを使って

size=$(stat -c %s path/to/file)

まとめ

ほかにも du -k ls -l wc -c なども考えられる。

ぱっと思いついただけで以下の通り。

ls -l path/to/file | cut -d ' '  -f 5
du --apparent-size --block-size=1  path/to/file
wc -c  < path/to/file
find path/to/file --printf=%s
ruby -e 'puts  File.size  ARGV[0]' path/to/file
  • du だとブロックサイズを意識するのが面倒ですね。
  • ls は cut と組み合わせるのが面倒ですね。
  • rubyワンライナーも面倒ですねぇ
  • find は stat とやってること変わらないから面倒ですねぇ。引数位置とかも。
  • wc はありですねぇ

参考資料

http://unix.stackexchange.com/questions/16640/how-can-i-get-the-size-of-a-file-in-a-bash-script

curl でよく使う設定をまとめる ~/.curlrc

curl の基本設定ファイルを作ることが出来る

~/.curlrc

Default config file, see -K, --config for details.

.curlrc に書く書き方は -K で指定する config ファイルと同じ

curl の毎回指定するのめんどくさいオプションを書いておくと楽

とくに、CookieやUser-Agentなど毎回付けるのが面倒なので、config を作ると楽になる。

とりあえず作った

## デフォルトでつけるよくあるヘッダ
header = "Accept-Encoding: gzip, deflate, sdch"
header = "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36"
header = "X-Config-File: ~/.curlrc"

--compressed

X-Config-File は 自分でも curlrc をつけていることを忘れることがあるので、-v した時に気づくように追加しておいた。

gzip / deflate 圧縮を有効にする

header = "Accept-Encoding: gzip, deflate, sdch"
--compress

gzip/deflate で転送しつつ、 --compress で 圧縮されたレスポンスを展開して取得して表示する。

2017-02-15 追加

Cookie も毎回指定するならめんどくさいので、設定に書くことにした。

## cookie
cookie-jar =  /Users/takuya/.curl_cookies
cookie     =  /Users/takuya/.curl_cookies

設定の書き方

どうやらこういう書き方をするといいらしい。

-c path--cookie-jar path とも書くことが出来る。これを cookie-jar = path と書くことが出来る。

これは以下のように読み替えていけばいい

  • -c path
  • --cookie-jar path
  • cookie-jar = path ← 設定ファイル

同じように -b のオプションも同じですね。

  • -b path
  • --cookie path
  • cookie = path ← 設定ファイル

つまり、header の場合はこれを使うと

  • -H value
  • --header value
  • header = value

などと書くことが出来るようですね。

2017-04-11 追記

curlrc がずっと読まれちゃってCookieが維持されちゃうときなど、一時的にcurlrc を無効にしたいときは

curl -q  http:/...

-q オプションを付けることで curlrc の読み込みを一時停止してコマンドを実行することが出来る。

2018/02/15 追加

curlrc はどんなときでも読み込まれる。次のように、明示的にconfig を指定していても ~/.curlrc は読み込まれる。

curl --config yet-another-config  

なので、別の設定ファイルを明示するときや素のcurl が欲しい時は -q をかならず使う。

curl -q  --config yet-another-config  

-q を忘れないようにすること。

更に、-q は最初につける

## これはダメ
curl -v -q 
## これはOK
curl -q -v 

-q オプションは最初につけること

2018-02-04 改訂

compressed になった。

2019-07-22 追記

-K -q の仕様について追記

参考資料

man curl

iphone "装着していることを感じさせないほど薄い"

ELECOM iPhone5/5S用 シェルカバー 薄型スリム クリア(乳白色) 液晶フィルム付き PS-A12PVUCR

f:id:takuya_1st:20170202230338j:plain:w400

iPhone 2012にぴったりフィットしてキズや汚れからしっかり守るポリプロピレン製の薄型シェルカバーと保護フィルムです。 軽くて丈夫でありながら薄くてスリムなので、本体のデザインを損なうことなくキズや汚れをガードします。 前面フルサイズの液晶保護フィルムが付属しています。液晶保護フィルムは、iPhone 2012にぴったりのサイズですので、カットする手間がかかりません。 保護フィルムは、貼り付け面にシリコン皮膜をコーティングした自己吸着タイプです。接着剤や両面テープを使用しないので、本体を汚すことなく手軽に貼り付け・貼り直しができます。 ケースを装着したままで液晶画面の確認、本体の操作、充電・通信ケーブルの接続が可能です。メーカー型番 : PS-A12PVUCR対応機種 : iPhone 2012セット内容 : ケース本体×1、液晶保護フィルム×1材質 : ケース本体:ポリプロピレンカラー : クリアフィルム材質 : 表面:PET、接合面:シリコン

f:id:takuya_1st:20170202230647p:plain:w100f:id:takuya_1st:20170202230651p:plain:w100

おひとつどうですか

ご購入はこちらから → http://j.mp/2jGXxIC

dd で進捗を表示する status=progress

dd の進捗を表示する事ができる

ふとしたことで status の引数を知りました

takuya@Desktop$ dd if=/dev/zero of=out.img bs=1M count=1000  status=progress
711983104 bytes (712 MB, 679 MiB) copied, 1.00343 s, 710 MB/s
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 1.48507 s, 706 MB/s

man からの抜粋

       status=LEVEL
              The  LEVEL of information to print to stderr; 'none' suppresses everything but error messages,
              'noxfer' suppresses the final transfer statistics, 'progress' shows periodic transfer  statis-
              tics

status をつけたときの表示のタイミング

bs=1M なら 1Mを書くたびに progressが実行される。

## 1G を4回書いたとき=>4回前後
sudo dd if=/dev/zero of=/swap.img bs=1000M count=4 status=progress
## 10Mを 400回書いたとき=>400回前後
sudo dd if=/dev/zero of=/swap.img bs=10M count=400 status=progress

速度的には、bsが大きい方がわずかに早いと思うんだが、progressを見たいときは countを多めにしたほうがぱっと見れる。

その他の方法

通常は SIGNAL USR1

長くかかるときは シグナルを送ればいいんだけど、 status=progress でもいいよね

dd_rescue もいいね

dd より dd_rescue 使うことが多いわ。

2018/02/27 追加

pv コマンドをつかって流してあげたほうが再利用しやすいかも

コマンド(lzop)の圧縮展開の進捗どうですかー?(pvコマンドで進捗を見る) - それマグで!

関連資料

dd でディスクをコピーするよく使う例 - それマグで!

dd_rescueコマンドで、HDDのバックアップ が楽になる - それマグで!

キーチェーンのセキュリティダイアログを自動でチェックする

キーチェーンをスクリプトで自動登録しようとするとダイアログが。。。

f:id:takuya_1st:20170131001918j:plain

自動処理にとても厄介・・・

osascript -l j で解決

javascript 文法で apple script を買いてコマンドにボタンを押させることにした。

var app = Application('System Events')
var p   = app.processes.byName('SecurityAgent')
var w   = p.windows.at(0)
var btn = w.buttons.at(2)
btn.click()

pdfのページの解像度(ピクセル数)を調べる。

pdfinfo でファイルの中身を確認した

PDFの解像度(ページのピクセルサイズが分かった)

また同時に、pdfの権限などもわかった。

Title:          Software Design 2017年2月号
Author:         (株)技術評論社
Creator:        Acrobat 10.1.16
Producer:       Acrobat 10.1.16
CreationDate:   Thu Jan 12 14:45:49 2017 JST
ModDate:        Fri Jan 13 14:19:26 2017 JST
Tagged:         no
UserProperties: no
Suspects:       no
Form:           AcroForm
JavaScript:     no
Pages:          205
Encrypted:      yes (print:yes copy:yes change:no addNotes:yes algorithm:RC4)
Page size:      515.906 x 728.504 pts
Page rot:       0
MediaBox:           0.00     0.00   515.91   728.50
CropBox:            0.00     0.00   515.91   728.50
BleedBox:           0.00     0.00   515.91   728.50
TrimBox:            0.00     0.00   515.91   728.50
ArtBox:             0.00     0.00   515.91   728.50
File size:      64138310 bytes
Optimized:      no
PDF version:    1.6

pdfinfo コマンドでPDFページ数を確認する

pdfinfo コマンドが便利

time pdfinfo Software-Design-2017年2月号_00.pdf
Title:          Software Design 2017年2月号
Author:         (株)技術評論社
Creator:        Acrobat 10.1.16
Producer:       Acrobat 10.1.16
CreationDate:   Thu Jan 12 14:45:49 2017
ModDate:        Fri Jan 13 14:19:26 2017
Tagged:         no
UserProperties: no
Suspects:       no
Form:           AcroForm
JavaScript:     no
Pages:          205
Encrypted:      no
Page size:      515.906 x 728.504 pts
Page rot:       0
File size:      64084898 bytes
Optimized:      no
PDF version:    1.6

real    0m0.086s
user    0m0.072s
sys     0m0.012s

pdfinfo コマンドであれこれ便利になる。

Poppler のパッケージに含まれる。

pdfinfo version 0.26.5
Copyright 2005-2014 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011 Glyph & Cog, LLC
Usage: pdfinfo [options] <PDF-file>
  -f <int>          : first page to convert
  -l <int>          : last page to convert
  -box              : print the page bounding boxes
  -meta             : print the document metadata (XML)
  -js               : print all JavaScript in the PDF
  -rawdates         : print the undecoded date strings directly from the PDF file
  -enc <string>     : output text encoding name
  -listenc          : list available encodings
  -opw <string>     : owner password (for encrypted files)
  -upw <string>     : user password (for encrypted files)
  -v                : print copyright and version info
  -h                : print usage information
  -help             : print usage information
  --help            : print usage information
  -?                : print usage information

動画の一部分を切り出し(トリミング)する

動画の指定領域をCropして切り出す。

ffmpeg -i input.mp4 -vf crop=160:90:32:18 out.mp4

動画から時間を指定して切り出す方法は→こちら

ターゲット

ターゲットの画像の中の、該当部分(白抜き)のエリアを切り出すことが出来る。

動画の一部分をcrop して切り出すには、

-vf crop:w:h:X:Y

もう少しわかりやすく

-vf crop=幅:高さ:左上X:左上Y

video filter の一種ですね。当然再エンコが発生するのですが、そんなに時間がかかるものではなさそう。

いきなり全部切り出すと辛いので

いきなり全部切り出すと時間がかかるので、指定時間のエリアを数秒ほど切り出して確認するといい。

ffmpeg -i input.mp4 -vf crop=160:90:32:18 -t 10 -ss 10 out.mp4

左上の座標を調べるには

いったん、指定時間の範囲を、画像に変換して調べると楽だと思う。

ffmpeg   -i in.mp4 -ss 10 -vframes 1 -f image2 out.jpg

時間で切り出すには方法は、こちら

takuya-1st.hatenablog.jp

画像に切り出す方法は、こちら

takuya-1st.hatenablog.jp

2019/08/20 更新

crop のvf 指定が変わってたので変更

pvresizeを試してみた

lvm2 のよくわからないものを使うシリーズ

今回はpvresize を使ってみた。

正直言って、何に使うのかがまだ良くわからない。

物理HDDパーティションのサイズが変わるわけでもない。

150GB のディスクから 40GB のPVができた。残りの110GBは未使用というか、使えないで残ってしまう。どうするんだこれ

縮小する。

lv も vg も設定されてない pv を縮小してみた

takuya@:~$ sudo pvresize --setphysicalvolumesize 40GB /dev/sdc1
  Physical volume "/dev/sdc1" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

縮小結果を確認

takuya@:~$ sudo pvs
  PV         VG   Fmt  Attr PSize   PFree
  /dev/sdc1       lvm2 ---   40.00g  40.00g

物理HDDのサイズを見る

lvm で 150 GB 用意されてる。でもpv は40GB

takuya@:~$ sudo sgdisk -p /dev/sdc
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       314574847   150.0 GiB   8300

pvresize でHDDのパーティションいっぱいまで広げてみる。

takuya@:~$ sudo pvresize  /dev/sdc1
  Physical volume "/dev/sdc1" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

拡張された。

takuya@:~$ sudo pvscan
  PV /dev/sdc1             lvm2 [150.00 GiB]
takuya@:~$

なんのためにあるんでしょうかコレは

HDD交換のときに使うのかな? HDD更新の反映とか?

物理パーティションに割り当てる量を変えたときにLVMのサイズをそれに応じて変えるためでしょうか。

パーティション単位でLVMって実験以外にやらないと思うのでサイズ可変が必要な状況が思いつかない。iSCSINFSをLVMでつかってるときとか?