未参照の画像を探すためのスクリプトをPowerShellで書いた

photo by Irish Defence Forces

はじめに

未参照と思われる画像がプロジェクト内に数十ファイルあり、手でいちいちGREPして未参照を確認するのが面倒なので、PowerShellの勉強も兼ねて作成。

'指定されたフォルダ内のファイル名を再帰的に取得し、'
'検索対象のフォルダを再帰的にGREPします'

$sourceFilesPath = Read-Host 'GREPしたいファイルが格納されているフォルダを指定してください。'
$targetFilesPath = Read-Host 'GREPをかけるフォルダを指定してください。'

"検索してます。。。"

# ファイル一覧を取得、ファイル名称のみ、フォルダは除外。
$fileNameLists = Get-ChildItem "$sourceFilesPath" -Recurse | Where-Object { ! $_.PsIsContainer } | Select-Object Name, Fullname

foreach($i in $fileNameLists)
{
    echo "$i.Fullname をGREPします。" 
    # この指定方法だとフォルダもオブジェクトとして取得してたりするが、実害(パフォーマンスへの影響)がないので放置。
    $result = Get-ChildItem "$targetFilesPath" -Recurse | Select-String $i.Name -Encoding default
    if ($result.Count -eq 0)
    {
        '検索にヒットしないです。'
    } 
    else 
    {
        $result
    }

    # 見やすさのために3つ改行させる。
    echo "  " 
    echo "  " 
    echo "  " 
}

'おわった!'

やっていることは以下の自動化。

  1. GREPしたいファイルの名称をコピー。
  2. エディタの検索機能を使ってGREP
  3. フォルダを登ったり降りたりしながら別のファイルの名称をコピー。
  4. エディタのー(以下略)

このスクリプトを利用すると、フォルダを指定することにより、GREPを書ける条件(ファイル名)を再帰的に取得してGREPを掛けてくれるので、手でやる時みたくフォルダを行ったり来たりしなくて良い。

なお、タイトルでは画像と言っているけど、別に画像の拡張子で絞ったりはしていないので、スクリプトでもhtmlでもバイナリでもファイルなら名称で検索する。

改善点とか

存在しないフォルダを指定された時などのエラー処理やってない。

あくまで名称のみで検索しているので、ファイル名が同一だけど階層が違う場合などでも検索にヒットする。これは自分のプロジェクトでは画像名称はユニークだったので対応していない。

gitの管理下から逃れる方法についてのあれこれ

photo by V Threepio

.gitignoreファイルについて

代表的なgitの追跡から逃れる方法。
このファイルに記載されているファイルは、gitの管理下に置かれなくなる。
注意点として、既にgitの管理下に置かれているファイルに対しては、.gitignoreファイルに記載しても無力なため、 git rm --cashe <ファイル名>などとして、gitから削除する必要がある。
当然ながら、リポジトリからファイル自体も削除されることに注意。

.gitignoreの作り方

Windowsの場合「.gitignore」というファイル名では作成出来ないので、
「.gitignore.」(どっと ぎっといぐのあー どっと)というファイル名で保存する。
なお、サイトによっては「.ignore」でOKみたいなことも書いてあったりするけど、.gitignoreが正解。

また、.gitignoreの置き場所については、アプリケーションルートの直下に配置する。
ちなみにSourceTreeであれば、右上の設定からGUIで.gitignoreを作成することもできる。

.gitignoreを無視する方法

ignoreを無視してgitにコミットする裏ワザ的な方法が存在する。
git add -f <ファイル名>とすると、無視リストを無視するというよくわからない裏ワザが発動する。
ただし、このコマンドを実行したあとは.gitignoreの記述が変更され、次回からは通常どおりgitの管理下に置かれる。

.gitignoreの確認方法

$ git ls-files --others --ignored --exclude-standard

# 短縮形
$ git ls-files -oi --exclude-standard

このコマンドで、どのファイルがgit管理下に置かれていないか確認することができる。


git管理下には置きたいけれど今回のブランチに限り変更を追跡されて欲しくない時

2つ方法がある。

1.assume-unchanged

設定

git update-index --assume-unchanged <ファイル名>

取り消し

git update-index --no-assume-unchanged <ファイル名>

2.skip-worktree

設定

git update-index --skip-worktree <ファイル名>

取り消し

git update-index --no-skip-worktree <ファイル名>

ただし、どちらもブランチごとに有効なため、ブランチを切り直した場合はコマンドを再実行してやる必要がある。


どちらを使えばよいか?

基本的にskip-worktreeで良い。
イメージとしては、skip-worktreeは手元の変更を優先するが、 assume-unchangedリポジトリの変更を優先する。

そのため、git reset --hardを実行したような場合は、 assume-unchangedは手元の変更が失われる。

方向性として

assume-unchanged

更新確認しなくても良いファイルを無視することで、Gitの動作を高速化したいような場合に利用する。

skip-worktree

git管理下に置かれているファイルが、ビルドなどで更新されてしまうが、gitには基本的に無視して欲しいような場合に利用する。例えば日付だけ変わるファイルなど。

cakePHPのブックマークチュートリアルのDB部分でハマった

はじめに

cakePHPを利用するにあたり、公式のブックマークチュートリアルを試しにやってみたところ、DBの基本的な部分についてドキュメントがごっそり抜け落ちており(基本すぎて書いてない?)ハマリ倒したので、同じような初心者の方に助けになればと。

そういうわけなんで、経験者の方には何の参考にもならないと思われ。

photo by iogi

前提

MySQLをターミナルで操作するには

みなさんいきなりこんなことやってますが

$ mysql -u root -p
Enter password:

ターミナル起動していきなりこのコマンドを打っても、そんなコマンドねぇって怒られる。
MySQLは「/Applications/MAMP/Library/bin」にあるので、 ターミナルで移動(cd)してから実行するようにすること。

ちなみにグローバルインストールすると、パスに関係なくmysql〜とやっても大丈夫。
ただし、MAMPで普通にMySQLをインストールしただけであればパスを移動する必要あり。

MySQLへのコマンドでのログイン方法

で、移動したら

./mysql -u root -p

でログインする。「./」が忘れがちなので気をつける。

MAMPでインストールしたMySQLの初期パスワードについて

上のコマンドを入力すると、パスワード入れろっていわれるので入力する。MAMPでインストールしたMySQLの初期パスワードは「root」です。 知らないと意外とハマります。

テーブルの新規作成方法について

以下のコマンドで作成することができる。

CREATE DATABASE <テーブル名> CHARACTER SET utf8;

テーブルができているか確認する場合はshow databases;で確認することが可能。 文末の「;」を忘れやすいので注意。

MySQLで利用するテーブルを指定する方法について

チュートリアルではこのクエリ叩いて実行してーと書いてあるのだが、 クエリの中にテーブル名が書かれていないので、 そのままコピペして実行してもエラーで怒られる。 なので、あらかじめこのテーブルを使いますと指定してやってから、 クエリを実行すること。

use <テーブル名>

ここまでやれば、あとはチュートリアルのクエリをターミナルにコピペして実行すれば良い。

ユーザーの作成方法

DBやテーブルを作ったばかりの場合、ユーザーが作られていないので作る。以下のコマンドを実行してユーザーを作成する。

grant all privileges on *.* to ユーザー名@localhost identified by 'パスワード';

データベースへの接続設定

ここまで来たら、データベースから一旦離れて、cakePHPにDBがどこにあり、どうやって接続したらよいかを教える。 app/config/app.phpを開いて、Datasourcesのdefaultの設定を変更する。

具体的にはusername、password、databaseに対して、今までの手順で構築したDB、ユーザー名、パスワードを指定してやる。

接続確認

localhostへ接続し、画面の下の方に以下のように表示(接続できました)されていればOK

f:id:HTak:20160126163030p:plain

ターミナルで実行しているMySQLを終了する方法

quit

で終了できる。

今更ながらGitを復習してみた

f:id:HTak:20160123141654p:plain

SIerの頃に勉強したけれど、結局もろもろの事情により実戦投入できず、
それから自分の中でもほったらかしになっていたので、改めて復習する。

やっぱり使ってないと結構忘れていることが多かった。

なお、環境はMacを利用おり、Gitのバージョンは「2.6.4」
Macだと色々便利なクライアントツールがあるのだけど、
今回は勉強も兼ねているので、すべてコマンドで実施した。


基本操作編

git init

リポジトリを新規作成する。 ちなみにリポジトリの実態は「.git」という隠しディレクトリに存在する。

git status

リポジトリの状態を確認。変更やら新規追加が行なわれているかどうかを確認したい場合は、このコマンドを実行する。

git log

ログを出力する。末尾にgraphを付与することにより、コミットの親子関係を視覚化することが可能。

git graph

ブランチの状況を確認する。親子関係なども確認することが可能。

git add <FILENAME>

ファイル名に指定されたファイルをstageする。
なお、ファイル名ではなく「.」ドットを指定することにより、現在いるディレクトリの中のファイル全てをstageすることが可能。

git commit

stageされているファイルをコミットする。

Gitとはあんまり関係ないけどviについて

MacにGitをインストールすると、コミット時にデフォルトでviが起動する。コミットするためにはviでコメントを書いて保存しなければならないのだけど、通常のメモ帳とは勝手がだいぶ違うので、最低限これだけ知っていればコミットメッセージを書ける内容を備忘録的に書いておく。

コマンド  効果
a   INSERTモードへ移行
esc  INSERTモードから抜ける
:wq  保存して終了する

git checkout -- <FILENAME>

ファイル名に指定されたファイルの変更をなかったことにする(変更を元に戻す)。

git rm <FILENAME>

ファイル名に指定されたファイルを削除する。git管理下に置かれているファイルを直接削除(Finderとかから)すると、ちょっとおかしなことになるので、このコマンドを利用して削除する。
このコマンドを実行すると、ファイルの削除と削除操作のstageを一緒にやってくれる。

git mv <OLD-FILENAME> <NEW-FILENAME>

古いファイル名に指定されたファイル名称を、新しいファイル名に変更して、stageする。Finderなどでファイル名を変更した場合は、addrmしてやらないといけないが、このコマンドを利用すると、すべてを一気にやってくれる。
なお、ファイル名称の変更だけではなく、ファイルの移動時にもこのコマンドは同様に利用出来る。


ブランチへの操作編

git branch

現時点で存在するブランチを一覧表示してくれる。

git branch <BRANCH-NAME>

ブランチ名に指定されたブランチを作成する。

git branch -d <BRANCH-NAME>

ブランチ名に指定されたブランチを削除する。

git checkout <BRANCH-NAME>

ブランチ名に指定されたブランチを選択する。 TFSのチェックアウトとは別物。

git checkout -b <BRANCH-NAME>

-bのオプションを付けることにより、ブランチを作成し選択することが可能。(ブランチ切って、選択して、の流れが一発で可能)

git reset --hard <id>

idに指定された位置までロールバックする。

git checkout -b <新規に作成するブランチ名称> <分岐元>

checkoutは「ブランチを切ってチェックアウト」というコマンドだが、 <分岐元>と指定することにより、明示的にどこからブランチを切るか指定することができる。 (指定しなかった場合は選択しているブランチからブランチが切られる。)

HEADについて

選択中のブランチを示す。

*   a9b1735  (HEAD -> master) 2016-01-20 博之  

このように表示される

git merge <BRANCH-NAME>

ブランチ名に指定されたブランチをマージする。 なお、HEADされているブランチに対して、指定されたブランチをマージする。なお、マージのやり方はFastForwardで行われる。 FastForwardでやりたくない場合は…

git merge --no-ff hotfix

--no-ffのオプションを付けることにより、FastForwardを行わずにマージすることが可能。


リモートリポジトリやクローン関連

git clone <複製元> <複製先>

複製元のリポジトリを複製先のパスに複製する。
なお、--bareオプションを付けることにより、作業ディレクトリなしでリポジトリを複製することが可能。ちなみにbareリポジトリの最後には「.git」という文言を付けることが慣習となっている。

git remote

リモートリポジトリとして登録されているリポジトリを表示する。

git branch <手元のブランチの名前> <追跡したいリモートブランチの名前>

手元にリモートブランチを追跡するブランチを作成する。

git remote add <リモートリポジトリの名前> <リモートリポジトリの場所>

リモートリポジトリを設定する。

git fetch <リモートリポジトリの名前>

リモートリポジトリの中身を手元に持ってくる。

git branch --set-upstream-to=<追跡対象のリモートブランチ> <手元のブランチ>

手元のブランチを追跡したいリモートブランチの内容を追跡するようにする。

git push

手元のリポジトリの変更を共有リポジトリに公開する。

git push <リモートリポジトリの名前> <手元のブランチ>:<リモートに作りたいブランチ>

手元のブランチをベースにリモートリポジトリに新しくブランチを作成する。

git pull

fetchしてマージまで一度に行ってくれるコマンド。
一見便利そうだけど、マージも行うのでコンフリクトが起きる可能性があることに注意する。


ダークサイド系

git rebase <BRANCH-NAME>

指定されたブランチの内容で、チェックアウトしているブランチをリベースする。 要するに、チェックアウトしているブランチに対して、指定されたブランチの変更履歴を適用する。これにより、このブランチは履歴のどの時点から分岐したのか?という過去を改変することができる。

git commit --amend

ひとつ前のコミットに対して、上書きの形でコミットする。 これにより、直前のコミットという過去を改変することができる。
やらかしちゃった場合とか、コミットしなきゃいけないファイルが漏れてた時とかに便利そう。


その他

ターミナルからGitを利用する時に便利な設定など。

git config --global alias.graph "log --graph --date-order --all --pretty=format:'%h %Cred%d %Cgreen%ad %Cblue%cn %Creset%s' --date=short"

グラフをキレイ目に表示してくれる。

git config --global color.ui true

ログ出力に色がつく。

二段階認証を有効化したアカウントのGmailをthunderbirdで送信するときに、延々とパスワードを入れろっていわれた時の対応方法

メールクライアントとしてThunderbirdを利用している時に、二段階認証を有効化した Gmailをメールサーバーに設定すると、送信ボタンを押す度にパスワードを求められることがあったのでその対応方法です。

photo by Roger Lancefield

結論

Thunderbirdに覚えさせたパスワードを一旦削除する。

やりかた

Thunderbirdの環境設定を開く。

f:id:HTak:20151219181030p:plain

セキュリティ → パスワードを選択し、「保存されているパスワード」をクリックし、保存されているパスワードを削除する。
※「受信(imap)」と「送信(smtp)」の2つが保存されているので、両方削除しておく。

f:id:HTak:20151219181046p:plain

一旦Thunderbirdを終了して、再起動する。メール受信時にパスワードを求められるので、Googleアカウントのアプリ用パスワードを入力する。(この時点でimapのパスワードが保存される。)

メールを新規作成して、送信する。その際にもパスワードを求められるので、さっきのパスワードを入力する。(smtpのパスワードも保存される)

以上。

iPhoneを復元した時にやる必要があったこと

iTunesのバックアップから復元。バックアップは暗号化してあるので、(ほぼ)今までと同じように利用できるけど、利用できなかった部分もあるので備忘録。


IIJmioのAPN構成プロファイルの再インストール

これが一番困った。何が困ったかって、アンテナピクトの表示上はちゃんと「docomo LTE」と表示されているにもかかわらず、実際には通信できておらず、外出してから圏外状態となっていることに気がついた。

デバイスの復元時には構成プロファイルもインストールしないと、外出先で泣くことになりかねない。

www.iijmio.jp


Touch IDは再登録が必要

登録済みの指紋情報は復元時に削除される様子。同じ指でももう一回再登録が必要。


グーグル関連のアプリへのログイン

GmailYouTubeなどグーグル関連のアプリには再ログインする必要がある。ただし、グーグルマップやグーグルドライブのアプリにはログインする必要がなかったので、どれか一つでログインすればログイン情報を持ち回ってくれるのかもしれない。

なおTwitterFacebookEvernote、LINEにはログイン済みの状態で復元されていた。


Bluetoothの再ペアリング

一回ペアリングしておくと、あとはBluetoothをONにするだけで勝手につながってくれるけど、復元した場合は、一度もつなげていないことになっていた。

iPhoneの機能制限パスコードを忘れてしまった時は…

f:id:HTak:20151210102533j:plain

結論

本当に思い出せないなら無理です。諦めてiPhoneをリセットしましょう。

調べてみた限りだと、まっとうな方法では回避することはできない。(回避できたらセキュリティホールになるので当たり前だけど。)
まっとうじゃない方法(JailBreakなど)では、出来るのかもしれないが、私は調べてもいないしする気もないのでやりません。


機能制限パスコードを忘れたけど、工場出荷状態に戻したい時は…

売却するとか他人に譲渡するとかしたい時。

iTunesで同期したことがある場合

iTunesで復元を実行して工場出荷状態に戻しましょう。

iTunesで同期したことがない場合

画面ロック時のパスコードを10回間違えて、工場出荷状態に戻しましょう。
https://www.icloud.comへ行って、リモートワイプでも良いかも。


思い出せないけど機能制限パスコードをリセットしたい時

iPhoneのデータを削除して、新しいデバイスとして設定すれば、機能制限パスコードもリセットされる。ていうか、新しいデバイスなんで全部まっさらになる。

なお、機能制限パスコードをリセットするために新しいデバイスとして設定する場合、バックアップから復元してはいけない。バックアップ内容に機能制限パスコードも含まれているので、思い出せないパスコードが設定されたままで復元されてしまう。

なお、新しいデバイスとして設定した後、iCloudと同期することは可能なので、電話帳や写真はiCloudに保存してあれば元に戻すことができる。

support.apple.com


機能制限パスコード入力画面の注意点

6回までは普通に間違えることが可能だが、7回以上になると時間制限がつく。時間制限は間違えるたびに加算されていく。

f:id:HTak:20151210101224j:plain

  • 6回間違えると、次の入力まで1分待つ
  • 7回間違えると、次の入力まで5分待つ
  • 8回間違えると、次の入力まで15分待つ
  • 9回間違えると、次の入力まで60分待つ

なので、適当にバカスカパスコードを入力していくと、後で後悔することになる。

ちなみに時間制限がかかった状態でiTunesと同期すると、時間制限が解除されるというようなページも見たけれど、手元で試していないので真偽は不明。