grep してマッチした行ではなく、ファイル名が欲しい
検索したキーワードを含むファイル名を取り出して、それを全部開いて処理したいときに
grep -l
-l
をつけるとファイル名だけを取り出すことが出来る。
覚え方
l
なので line
ですね
検索したキーワードを含むファイル名を取り出して、それを全部開いて処理したいときに
grep -l
-l
をつけるとファイル名だけを取り出すことが出来る。
l
なので line
ですね
unar コマンドで展開すると文字化けがあまり発生しない。
unar とペアになってる lsar コマンドも文字化けを余り起こさずにファイルを取り出せる。
また展開できる
lsar で一覧したファイルの中から、指定したファイルを取り出すには次の方法で出来る。
unar sample.zip 'img001.jpg'
いちいちディレクトリを作られるのが面倒なので、指定したファイルだけをぱぱっと取り出して標準出力に取り出してしまうと便利だった。
unar sample.zip 'img001.jpg' -r -o - > out.jpg
これは動かなかった。( mac 版での確認 )
unar sample.zip 'サンプル/img001.jpg' -r -o - > out.jpg
日本語が入ってた場合はもう絶望的ですが、ワイルドカードを使うことである程度は回避することが出来る。
unar sample.zip '*/img001.jpg' -r -o - > out.jpg
ちょっとしたトリックですが、アーカイブのディレクトリ内部にファイルがかぶってなければだいたいうまくいく。
日本語がマッチしないのは、ZIP内部のファイル名がCP932 でLinuxの 文字コードが UTF-8 のためかもしれない。 windows め・・・
切断して、オフして再起動して、接続する。
sudo airport -z sudo networksetup -setairportpower en0 off sudo networksetup -setairportpower en0 on networksetup -setairportnetwork en0 0001docomo
これをスクリプトにしておけば、びっくりしなくて済む。macOS X のWifiは優先度を高く設定してても、電波が強い方を優先するので、意図しないSSIDに繋いだりするので、注意が必要ですね。
sudo airport -z
ifdown コマンド相当
sudo networksetup -setairportpower en0 off
ifup コマンド相当
sudo networksetup -setairportpower en0 on
networksetup -setairportnetwork en0 0001docomo
sudo /usr/sbin/networksetup -setdhcp Wi-Fi
公衆無線LAN飛んでるととんでもないところにつなぐので、これで確実に接続を試行できる。
なぜか、再起動を挟まないとMacのWifiは DHCPや802.1認証でタイム・アウトしちゃうとその後の接続が全ておかしくなるんだよね。。。。
公衆無線LANが飛んでると便利な半面で、適当な業者は本当に迷惑だわ。
三項演算子の省略形 elbis operator が便利だけど
<?php $a[0] = $a[0] ?: 10 ; var_dump($a); // array(1) { // [0]=> int(10) //}
変数初期化チェックがシンプルになって嬉しいよね。empty 相当だよねーってウキウキして empty の代わりの使ってみたり。
<?php $a[0] = empty($a['a']) ?: 10 ; var_dump($a); // array(1) { // [0]=> true //}
そうか、true になるのか。三項演算子の省略形としては「初期化」以外で使うと絶対ダメですね。。。
grep や ls などを使っていて、一時的にalias をオフにしたいことないですか?
私は結構たくさんあります。 grep や ls にいっぱいオプションを付けていて普段はそれを使っているのですが、素のgrep がほしいときはある。
\grep . -R
このような、エイリアスがあったとしても、素のgrep が動いてくれます。
takuya@:www-data$ alias grep alias grep='grep -i -E -a --color=auto -n '
これを知って、安心して rm や ls までどんどん alias にしていくことが出来ました。
不必要に エイリアスが呼び出されてしまわないように バックスラッシュをつけるのが良いです。
ただし、同名の関数が定義されているときは関数が優先されます。
バックスラッッシュは、エイリアスがあるために意図した動作にならないときに、対話的prompt で使うと便利です。本当に便利です。
alias しまくってると不意に動作することがあるので、シェルスクリプトにバックスラッシュを書きたくなると思います。別環境に持っていくときに alias が発動しないようにバックスラッシュを付与したスクリプトファイルにしても構わないのですが。。。。
互換性を目的にするのであれば、バックスラッシュよりもフルパスが好ましいと思います。
## これはalias発動するのでポータビリティに向いてない。 ls *.jpg | grep aaa| xargs identify ## これだと、alias なしで実行される。が、function grep { ... } があればそちらが使われてしまう。 ## またPATH優先順位にも左右されてしまう。 ls *.jpg | \grep aaa| xargs identify ## フルパスで指定が無難 ls *.jpg | /bin/grep aaa| xargs identify
このように、シェルのコマンドの優先度を考えたら、ポータビリティを維持する目的でではバックスラッシュは向いていません。
互換性についての記述を追加。
データベース作成したり削除したりで困らないように、チートシート的にコピペで使えるようなものを用意しておきます。
ユーザーの新規作成・削除・パスワードを変更などはよく使うのでどこかにメモっておくといい感じ。
ユーザーの一覧を見ます。
select User,Host, Password from mysql.user;
データベース表示するには、専用コマンド show databaseを使います。
show databases ;
テーブル一覧は、専用コマンド show tabales が便利です。
use my_db; show tables ;
ユーザー作成は create user をつ使います。
create user 'your name' identified by 'your pass'
grant all on my_db.* to your_name@'%'
権限を委譲(grant) したら専用コマンドで権限の割当を確認します。
show grants for your_name;
データベースを作成したりユーザーを割り当てたあとは、権限(Privileges)を更新します。
FLUSH PRIVILEGES
作成と削除はペアで使うことが多いのでまとめて掲載しておきます。
create database YOUR_DB_NAME; show databases; drop database YOUR_DB_NAME;
作成・削除と確認はペアで覚えておかないと複数個作ったり消したりしてるとパニックになるので最初に覚えること
作成削除はまとめて覚えておくといいので create user と drop user はペアで掲載しておきます。
create user 'your name' identified by 'your pass' select User,Host, Password from mysql.user; select User,Host, Password from mysql.user where User like '%yourname%' drop user 'your name' drop user takuya@'hostoname'
ALTER USER 'user'@'hostname' IDENTIFIED BY 'this_is_my_new_password';
設定したパスワードを忘れた場合は、パスワードを再設定するときや紛失・盗難でパスワードを変更する必要があるとき。といっても大抵の場合では、初期設定の時点でメモを忘れてパスワードを紛失するんだけど。
grant all on my_db.* to your_name@'%' revoke all on my_db.* from your_name@'%'
権限削除って余り使わないかも。Allつけておいて不要な権限だけ削除する感じ? それだったら必要な権限だけつけたら良いわけで。
grant all on *.* to 'takuya'@'%' WITH GRANT OPTION;
GRANTをGRANTする。権限のGRANTを許可できるroot と同じ管理者権限を付与するには、with grant option
をつける
mysql のパスワード忘れの場合の、パスワードの初期化・変更を追記。
revoke に記述ミスがあったので修正。
検索エンジンにこのエントリが無視されるので、微妙にキーワードを追加する。
白黒判定が出来るから、スキャンした画像が「プリント」か「雑誌」か判定していけば便利なんじゃないかと
ScanSnap でスキャンしたときに、学校のプリントか、教科書やカラー資料か判定して仕分けたい。
http://amazon.jp/dp/B00T2B5L52/?tag=takuya-hateblo-22
機械学習とか使わなくてもプリント程度なら、ぱぱっと判定できた。
これでzipコミックスを仕分けできそうで便利。
ScanSnapで白黒を自動調整しておけば確実にモノクロと判別できて楽だった。
#!/usr/bin/env ruby # # dirname = Dir.pwd require 'tmpdir' require 'pry' require "tmpdir" def check( f_name ) # binding.pry # Dir.chdir dirname is_color_comic = false Dir.mktmpdir("check-color-", '/tmp') do |dir| cmd = %%unar -o "#{dir}" "#{f_name}" % # puts cmd `#{cmd}` list = Dir.glob("#{dir}/**/*") # puts list list = list.grep(/jpe?g|png|gif|png/).sort unless list.size > 10 then return false end mid = ((list.size.to_f-1)*0.666).floor names = list.slice( (mid-2)..(mid+2) ) puts names color_page = names.map{|e| cmd = <<-"EOS".gsub(/\s+/, ' ').gsub(/^\s+/,'') convert '#{e}' \ -colorspace HSB \ -separate -delete 0 \ -fx "u*v" -blur 2x2 \ -threshold 30% \ -format '%[fx:mean]\n' info: EOS # p cmd ret = `#{cmd}` puts ret.to_f (ret.to_f > 0 ) ? 1 : 0 }.inject(0){|sum,x| sum + x } puts color_page is_color_comic = color_page > 3 end return is_color_comic end path = './*.zip' Dir.glob(path).sort.reverse.each{|e| # begin if File.directory? e next end puts e ret = check(e) if ret then puts :color `sudo mv "#{e}" 'プリント' ` end }
debian jessie の node が古いので野良ビルドした。 jessie そろそろ捨てるけど、ちょっと急ぎで node 使う必要があったので。
checkinstall を使った
sudo apt install checkinstall
wget https://nodejs.org/dist/v6.11.1/node-v6.11.1.tar.gz tar zxvf node-v6.11.1.tar.gz cd node-v6.11.1 ./configure checkinstall
configure
が python 3.6 で動くかよ! って怒られたので pyenv で変えた
pyenv local system ./configure --prefix=/home/takuya/.usr/local
raspi W を買ったので初期設定した。
ユーザー pi は絶対狙われるので、ssh がグルーバルから接続できないように設定して、ログインは最低限した。
自動ログインのユーザーを交換するには、 raspi-confg などでは出来なくて /etc を弄る必要があった。
113 #greeter-setup-script= 114 #session-setup-script= 115 #session-cleanup-script= 116 #autologin-guest=false 117 autologin-user=takuya 118 #autologin-user-timeout=0 119 #autologin-in-background=false 120 #autologin-session=UNIMPLEMENTED 121 #exit-on-failure=false 122 123 #
これで、raspi で自動ログインするユーザーを決められて、takuya ユーザーで自動ログイン出来るようになった。
omxplayer を ssh 経由で呼び出すのにとても重要だった。
SQL で連番を扱うときに、数字が入った配列が有るととても便利です。ただしソレを作成するのは不便です。
0..9
これを、次のようなテーブル行に展開したい。
:id |
---|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
select 0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 9 union select 9 ;
結果
0 ---------- 0 2 3 4 5 6 7 9
N個に展開して直積を取ってあげると、結構好きにテーブル展開を扱えるようになる。テーブルのピボットや、空席を調べたり欠番を埋めるのに作りやすくなる。
便利
1000行作ったり出来る。なんか楽しい
select * from ( select 0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 9 union select 9 ) as a left join ( select 0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 9 union select 9 ) as b left join ( select 0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 9 union select 9 ) as c ;
https://stackoverflow.com/questions/1564956/how-can-i-select-from-list-of-values-in-sql-server
ありがとう、ドコモ。ドコモのWiFiはパソコンやタブレット(ipad)から使えます。
au やソフトバンクが軒並み接続サポートを消していく中にあって ドコモはちゃんと接続させてくれます。
しかも電波も管理もしっかしてて確実につながる ソフトバンクみたいに「とりあえず」のWiFiとは質が違う。
無料で使える。ただし設定が必要。
0001docomo はSIMカード認証なので、パソコンから使うには設定がひつよう
パスワードとログインユーザ名は、ドコモIDとは別管理になっていて、そのID/PWのペアはMyDocomoから確認することが出来る。
https://www.nttdocomo.co.jp/mydocomo/sp_setting/index.html#accordion-8
ここから確認できる。
0001docomo につなぐときに、上記サイトで書くにしたID/PWを入力すると、とても簡単につながる。
月額300で使えるWiFiとして見た場合とても、とても優秀。
近所に電波が飛んでいたら固定回線の契約は要らないんじゃないかと思うレベル。
大勢のひとが「通過」する道路や駅コンコースの無線LANは、たくさんの人のスマホが接続しては切断したり、スマホが接続可能をチェックしている間に通り過ぎたりするので、2.4GHz電波の利用率高い。また大勢がくると、古い接続から順に親機側で切られてしまう。
1分間に30人程度が出入りしてるともう結構厳しい。もちろんここには道路を通過する車が含まれたり、電車が接近すると上客のスマホが含まれたり、バスが複数台通過すると「切断接続の嵐が吹き荒れる」・・・ってことになる。
つまり、1分間程度通信をしないと接続(認証)を切られてしまう。パソコンの接続チェックより早いタイミングで切断されてたりするので、画面上では接続になってるのに通信できないで、タイムアウト処理まで待たされて何も出来なことが有る。たとえばMacのWiFiは想定外らしく全く動かなくなっておかしな動作を繰り返したりする。(再起動しないと治らない)
もしWiFiを使いたいと思ったら、2F/3Fの店舗や、地下街で店の奥側など人通りを気にした方がいいでしょうね。
また定期的な通信をすればいいので
watch -n 10 dig google.com
などとして定期的通信をしておかないとすぐ切断されちゃう。
スマホゲでリアルタイム通信する厨房集団が現れると一気に帯域持っていかれて、電波が枯れちゃうので無線LANは途端に接続できなくなったりするので、負けないようにパケットを投げまくらないと行けない感じある。不毛だ。
いまどき文字化けするなんて思わなかった。古いデータベースだし mysql 関数でやってるやつだからなぁ
set name
しなくても PDO のドライバの初期化のタイミングで文字コードを指定できるようになっている。
<?php $opts = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', ); $dsn = 'mysql:host=example.com;dbname=my_db', // $pdo = new PDO( $dsn, 'root', 'pass', $opts);
mysqli_query mysql_query で
<?php $sqlstr = "set NAME utf8"; mysqli_query( $dbh, $sqlstr );
MySQLのテーブル設定はこんな感じ。
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
いまどきPDO使ってないとかありえないんですけど。まぁmysql_connect を使ってるプログラムが動いてることも多いわけです。
今回はこの対応をしたので、誰かの役に立てばいいのでメモっておきます。
php_mysql の拡張機能が標準バンドルされなくなった。なので標準インストールでは使えない。 だったら、追加インストールすればいいんじゃね?まぁそういうことです。
でも、それは最終手段に確保がベターな予感ある。php 本体のアップデートの都度に拡張機能をアップデートするのは結構大変で、php_magick をビルドインストしてたときは1ヶ月に1度くらいphpアップデートに併せてビルドしてた記憶有るし。なので、php_mysql のビルドインストはやめたほうが良いだろうっって判断しました。
php7 のmysql_connect の対応は、複数の選択肢があります
最初のが一番簡単なので、まず考えるのは mysqli_connect → mysqli_connect の書き換えではないでしょうか。2つは、同じ関数とリソース型を扱う設計で引数も「似ています」(同じではない)
二つ目はクラスです。mysqli は基本的にオブジェクトで作られているので new でインスタンスを生成し、それを使うようになっています。
三つ目はPDOです。インタフェースが異なるので移行とはすなわち書き直しとなります。
connect だけは mysql も mysqliもほとんど同じです。
mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
mysql_connect('localhost', 'mysql_user', 'mysql_password');
引数同じなのでほとんど変える必要がない。楽ちん
escape をしてる場合は、選択肢が2つ有る。
mysql_real_escape_string
mysqli::real_escape_string mysqli_real_escape_string
前者がクラス・メソッドで後者が インスタンスを必要とする。結局はインスタンスが必要になるので、手間はあんまり変わらない。
<?php // mysql_real_escape_string($str); // $mysqli_instance->real_escape_string( $str ); mysqli_real_escape_string( $mysqli_resouce , $str )
クエリ発行の部分もmysqli ではインスタンス(リソース)が必要になるので、少し書き直しが必要。
mysql_query( $str )
は
mysqli_query( $resouce, $str)
クエリ発行後は殆ど変わらなかった。
mysqli と mysql の書き換えを行ったとに、実験していると気付いたのですが。
mysql と mysqli にはインタフェースは似ていてもコネクションの管理や再利用が全然違っていて、そのままのロジックだと、コネクション数オーバーしてしまった。編集前では 全然問題なかった。
mysql_connect で接続つくって潰し、作って潰しで2000接続くらい作れてたのに、mysqli_connect だと全然動かないの。上限に達しちゃう。もしかしたら接続を再利用してくれないと思う。
なので接続をきっちり管理してやる必要があった。そこはハマった。
なので関数を書き換えたら問題なく動くって思わないほうが良い。
mysql 関数群と mysqli 関数群は似ているけど全然別物!ってことを念頭に起きながら、書き換える必要がありました。
最終的に次のような関数を書く羽目になったので、コネクション数の管理は別物だと思うことにしました。
<?php function MyConnect (){ global $con; if ( !$con){ return $con;} return $con = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db"); } MyConnect()