サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大そうじへの備え
sousaku-memo.net
UNIX/Linux での作業の効率化に欠かせないシェルスクリプトですが、手軽に書ける反面、様々な罠があることでも知られています。 そんな罠にはまらないよう、シェルスクリプトの解析ツール「ShellCheck」を使ってチェックしましょう、というお話です。 ShellCheck とは? 静的解析によりシェルスクリプトの問題点を分析し、より良い書き方を提案してくれる CLI の Linter ツールです。 構文の問題点やバグだけでなく、推奨されない書き方も教えてくれます。 シェルスクリプトの初心者・上級者に関わらず、入れておくだけで安心してスクリプトを書けるようになります。 ShellCheck がチェックしてくれること ShellCheck がチェックしてくれる内容は とても多岐に渡ります。例えば… クォーティング処理に関する指摘: ダブルクォーテーションで囲わずに変数展開している場合など。
この記事は CakePHP Advent Calendar 2018 の23日目の記事です。 CakePHP アプリケーションのユニットテストでボトルネックになりがちなのがデータベースへのディスク I/O 時間ですが、そういったプロジェクトでは FriendsOfCake/fixturize プラグイン を導入すると大幅に高速化できる可能性があります。 GitHub – FriendsOfCake/fixturize: CakePHP3: Improve performance of your fixture based tests on MySQL. 実例として、テストに18分も掛かっていた MySQL を使ったプロジェクトありましたが、導入後なんと5分にまで短縮されました。(約 72% の高速化🎉) 結果として早いサイクルで CI を回せるようになり開発スピードも上がりました。 何が
Bash は言わずと知れた歴史あるコマンド言語です。テキストにコマンドの羅列を記述するだけで、手軽にシェルスクリプトとして実行することができます。 シェルスクリプトの実体はシェルコマンドの羅列に過ぎませんが、手続き型プログラミング言語にあるような制御構文も備えています。変数や条件分岐、ループ、関数などです。これらを使えばシェルスクリプトでプログラミングも可能です。 もちろん、現代の一般的なプログラミング言語と比べると機能は限られます。他の言語には見られないシェルスクリプト特有の癖や記法も数多くあり、最近の言語に慣れている人ほど、つまずくポイントが多いです。 しかし、シェルスクリプトだからこその良さもあります。Bash は現在でも多くの OS で標準シェルとして採用されており、普段使っているシェルコマンドを書くだけで動かせる手軽さは何者にも代えがたいです。一度身につけておくと長く使えるお得な
PHP には empty() という便利な関数がありますが、empty() はよく理解して使用しないと意図しないバグを生む原因になります。 ( empty() は厳密には関数ではなく言語構造ですが便宜上関数と呼びます。 ) よく言われる話ですが、改めてまとめてみたいと思います。 なぜ empty() は安全なコーディングを妨げるか 通常 PHP は未定義の変数を使用しようとすると「そんな変数ないよ」と警告を表示してくれますが、empty() や isset() には未定義の変数に対して使用しても警告がされないという特別な性質があり、変数名のタイプミスに気がつけなくなってしまいます。 例えば以下のようなケースです。 $fruits = array('apple', 'orange'); if (empty($fruts)) { echo 'これは空配列です'; } これを実行すると $fru
2015年に CakePHP3.0 がリリースされたことは記憶に新しいですが、先日 CakePHP の Core Developer の @mark_story 氏により CakePHP4.0 時代への展望とこれまでの歩みの振り返りがスライドとして公開されていた ので、内容を要約してみたいと思います。 スライド CakePHP - The Road Ahead (SlideShare) 4.0 へのロードマップ 4.0 Roadmap · cakephp/cakephp Wiki (Github Wiki) ※ 以下の内容は自分が CakePHP を触っていて感じたことを元に補足している内容も含まれますのでニュアンスが異なる部分もあるかもしれません。 2.x – 3.00 アップデートの振り返り 3.0.0 はとても大規模で困難なアップデートだった PHP7 対応に伴うモダン化 フレームワ
キーボード掃除補助アプリって? Keyboard Cleaner はアプリを起動するとキーボード入力が反応しなくなるので、その間にウェットティッシュなどでお掃除しましょうというアプリです。(←掃除まではしてくれませんw) 会社のデスクにウェットティッシュを常備して、このアプリを使ってたまに掃除しています。 今までは類似アプリの KeyboardCleanTool を使っていたのですが、macOS Sierra にアップデートしたら動かなくなってしまったので、代わりに Keyboard Cleaner を入れてみたら問題なく動くし、むしろ便利だったので紹介します。 類似アプリ「KeyboardCleanTool」との違い KeyboardCleanTool はキーボード掃除補助専用のアプリなのですが、Keyboard Cleaner では更に以下の様なことができます。 画面の掃除に使える!
CakePHP2 まで PHPUnit の Webrunner ( webroot/test.php ) が公式で提供されていましたが、CakePHP3 からはこれが削除されてしまいました。 CakePHP 3.x Migration Guide によると、「ユニットテストをしたい人は CLI による PHPUnit をインストールしてね。更にブラウザからテストしたい人は VisualPHPUnit (Webrunner) を別途インストールしてね。」という方針のようです。 便利だったのに残念ですね(´・_・`) VisualPHPUnit とは PHPUnit をウェブブラウザから実行してくれる外部ツールです。これまでの test.php で出来ていたことは大体出来ると思います。 UI はこのような感じで、なかなかお洒落。 インストールにあたっての前提 この記事のインストール方法は PH
TL;DR CakePHP3 の bake コマンドで生成されるファイルの内容をカスタマイズしたい場合、対応するテンプレートファイルを src 以下にコピーして追加して内容を書き換えるだけでカスタマイズできます。 Model ファイルを bake する例 まずは通常通り Model 関連ファイルを作成するコマンドです。 テーブル名が users の場合は以下のようなコマンドを実行すると焼き上がります。 bin/cake bake model Users 実行すると以下4ファイルが生成されます。 src/Model/Table/UsersTable.php (Table) src/Model/Entity/User.php (Entity) tests/Fixture/UsersFixture.php (Fixture) tests/TestCase/Model/Table/UsersTab
PHP で動的にクラス名を指定する場合、現在いる名前空間が修飾されないため、 クラス名のみで名前空間内のクラスを指定して new するとクラスを見つけられず致命的なエラーになります。 エラーになる例 クラスファイルのパス構成 例えば PSR-0 規約に準拠して以下のような構成で Car クラスと CarCreator クラスを配置していたとします。 /var/www/sample/Vendor/SampleVendor/Entity Car.php CarCreator.php Car.php SampleVendor\Entity の名前空間に Car クラスを定義します。 <?php namespace SampleVendor\Entity class Car {} CarCreator.php この状態で Car クラスと同じ名前空間の CarCreator クラスから Car ク
以前ひそかに Bitbucket 上で Pull Request 作成やコメントをしたとき、任意の Chatwork グループチャットに通知するツール を作ったのですが、Slack チャットへの投稿にも対応しました。 上の画像が実際に Slack に通知されている場面のキャプチャ画像です。 最初は Slack 標準の外部サービス連携(Integration)でやればいいじゃん、と思ったのですが、世の中そんなに甘くなく、現状だと Bitbucket のプルリクエストの通知をサポートしていないようなのでそれを行うための補助ツールになります。 リポジトリは以下になります。 https://github.com/ymm1x/BitbucketEventNotification/ 以下、つらつらと概要を書いていきます。 README.md に書いている内容とほぼ同じです。 対応しているチャットサービ
メモ環境に求めているもの メモ環境に対して求めているものを整理して見なおしてみました。 同じようなことを求めている人はこの記事を読むと幸せになれるかもしれません。 プレーンテキストでメモできること リッチテキスト的なテキスト装飾は不要 Markdown をサポートしていること Markdown の入力補助 Markdown のプレビュー コードブロックのシンタックスハイライトに対応していること タイトルや本文で全文検索できること 保存した時点でクラウド環境に同期されること 特定のツールに依存せず、任意のツールでメモにアクセスできること メモにタグ付けできること 複数のデバイス環境でメモを閲覧・編集できること Mac (メイン) iPhone (サブ) Windows (サブ) 今までのメモ環境 Evernote のみ おなじみ、圧倒的に支持されているクラウドメモサービスです。 使っていて便
シェルスクリプトで set -e (errexit) しておくと、スクリプト中に実行したコマンドの終了ステータスが「非0」だった場合、つまりコマンドが失敗したときにそこでスクリプトを中断してくれるようになります。(終了ステータスとは「Exit code」「Return status」などと呼ばれるものです。) 都度エラー判定を書かなくてもよくなるので便利なオプションですが、個別にエラーハンドリングをしたくなった時にも意図せずスクリプトが中断されてしまい困ったことになります。 例えば、以下の例は false コマンドの実行で失敗扱いとなり、そこでスクリプトが中断されるため「finish」が出力されることはありません。 set -e # false コマンドは必ず終了ステータスに 1 (失敗) を返すコマンド # エラーが起きたとみなされスクリプトは中断される false # このコマンドは実
MySQL 5.5 から強化されたパーティショニング機能を試してみたのですが、パーティションに関する制約が多くて苦戦したので、やり方をメモしておきます。 今回やりたいこと – ログデータの肥大化を防ぐ(ログローテート) 日々溜まる膨大なログテーブルのレコードをパーティショニングして、古くなったログを削除してみます。 レコードの削除は DELETE FROM でも出来ますが、パーティショニングを活用すると高速にレコードを削除できます!内部的には DROP TABLE と似たような動作で高速にレコードを削除しているようです。 まずはパーティションの追加から削除まで、ひと通り試してみます。 パーティション確認用のテーブルを生成 まずはログを保存する logs というテーブルを作成します。 CREATE TABLE `logs` ( `id` int(11) NOT NULL AUTO_INCRE
よく phpMyAdmin でログインセッションの有効期限を伸ばす方法として、config.inc.php に以下の設定を追記する方法が紹介されてます。 $cfg['LoginCookieValidity'] = (60 * 60 * 4); // 4 hours ini_set("session.gc_maxlifetime", $cfg['LoginCookieValidity']); この設定を Ubuntu 上の phpMyAdmin に設定してみたのですが、どうも設定した時間より早くログインセッションが切れてしまうみたいで、なんでかなーと調べていたら原因が分かったのでメモしておきます。 原因 Debian 系の OS で php5 をインストールしたときに設定されている、古いセッションファイルを定期削除する cron が原因でした。 Ubuntu だと session_start
二つの MySQL データベースを比較し差分 ALTER SQL 文を出力してくれる perl 製ツール、MySQL::diffのインストール方法です。 このツールは、稼働中のデータベースのテーブルスキーマを最新に更新する場合など使えます。 Usage: mysqldiff [ options ] <database1> <database2> 今回はサーバデプロイ時のスキーマ更新作業を自動化するためにインストールしてみました。上手く使うと DDL のスマートなバージョン管理に一役買ってくれると思います。 コマンドラインツールなので GUI で分かりやすく差分を出力したい場合には不向きです。そういった場合はこのツールよりも MySQLWorkbench を使ったほうが便利でしょう。 MySQL::diff のインストール MySQL::diff は mysqldiff – search.c
前回のエントリ DBテーブルの差分を出力するMySQL::diffをインストールする の続きです。 前回のおさらいを少しすると、 MySQL::diff は二つのデータベーススキーマを比較して差分の ALTER SQL を出力してくれる perl 製スクリプトツールです。 例として以下のコマンドは、database1 データベースを database2 データベースのスキーマに追従する ALTER SQL が生成されます。DB スキーマの更新に便利です。 mysqldiff -u user -p password -i database1 database2 このツールのメリットはフレームワークに依存しないスタンドアロンなスクリプトであることだと思います。デメリットは最近の MySQL の機能に対応していなかったりすることだと思います。例えば PARTITION には対応していません。中身
Androidアプリ開発をしていると、現在のActivityスタック(画面の重なり)を確認したくなることありませんか。 Androidは画面を開いていくとスタック方式でどんどん上に画面が重なっていき、バックキーを押すと上から順に画面が破棄されていく仕組みになっています。 実際に複雑な画面遷移を実現してみようと試行錯誤していると今のActivityスタックの状態が分からなくなったりします。そんな時は取りあえずコマンドラインの adbコマンドで現在の Task と Activity スタックの状態をダンプしてみるといいと思います。 USBで端末を繋いで以下のコマンドを叩くとダンプできます。 adb shell dumpsys activity ただ、このコマンドは出力される情報量が膨大です。そこで、上記コマンドの結果に対して更にgrepをかけて、起動しているタスクとアクティビティの一覧だけ表示
今年に入ってからずっと携わっていたアプリ開発プロジェクトの納品が一つ終わり、無事に区切りを迎えることが出来ました。受託なのでここにアプリ名は書けないですが、イノベーションを感じることが出来るアプリだと思います! 今回の開発では初めて リードエンジニアというポジションでやらせてもらいましたが、至らない点も多々ありプロジェクトのメンバーやディレクターに何度も助けられながらやってきました。ぶつかったこともありました。 苦労も多かっただけに、お客さんから長文のお礼メールをもらった時は本当にまじで嬉しかったです。それを読んでいて感じたことは、次へ進んでいくためには成功体験は無くてはならない ということ。 成功体験がないまま、炎上案件に携わったりし続けていると身も心も疲弊していきます。モチベーションを維持することも難しくなってきます。 極論かもしれませんが実際の成功体験からしか正しいプロセスは学べませ
ブランチの削除関連の git コマンドをまとめました。 ローカルブランチの削除とリモートブランチの削除は別なので注意します。 リモートブランチの削除 topic という名前のブランチを削除する場合のコマンドです。 git push --delete origin topic 以下の様なコマンドでも同様に削除可能です。 git push origin :topic ローカルブランチの削除 リモートブランチを削除してもローカルにダウンロードしたブランチは残ったままです。それを削除するコマンドは以下になります。 git branch -rd remotes/origin/topic 単純にローカルブランチを削除するなら以下でOKです。 # 未マージのコミットがあれば警告 git branch -d topic # 未マージのコミットがあっても強制削除 git branch -D topic リモ
多様にある Android 端末の画面サイズと解像度 Android 端末は様々なメーカから発売されており、多種多様な端末があります。スマートフォンとタブレットも合わせるとかなりの数になります。 そんな Android のアプリデザインを作っていく上で避けて通れないのは、多様にある端末環境のことを考慮したUIデザイン設計です。端末の種類が限られている Apple の iPhone とは異なった事情があります。 考慮してデザイン制作と実装を進めていかないと、せっかくデザイナーさんが頑張ってイケてるデザインを作ったのに実装後に残念な見栄えになってしまったりします。 プログラマとデザイナーは密にやり取りをすべき デザイナーが画像素材を用意してプログラマがそれを使って実装していくのが一般的ですが、出来ればどういう風に素材を用意して欲しいかお互い相談しながら制作を進めていくべきでしょう。 画像スライ
最近とあるスマートフォンアプリの開発をしていまして、その開発スケジュールを立てることになりました。 ただ開発スケジュールについては今まで立ててもらってばかりで、自分で立てた経験が無いなーと思ったので、立て方について色々と調べたり経験者の方に聞いたりしてみました。 その内容のまとめをちらっと会社の日報に書いていたのですが、あとで見返せるようにブログにおこしておくことにしました。 マイルストーンを明確に設定すること そもそもマイルストーンとは?… 道路に1マイルごとに置かれた標石のこと スケジュール上の「重要な節目」となる日 設定しておくことで… スケジュール遅延を早期に認識することができる 目標が出来ることによるチームメンバーのモチベーション向上 スケジュール、コスト配分の目安 目安となるスケジュール、コストの配分としては、設計:3分の1、開発:3分の1、テスト:3分の1 程度 この配分は従
Android Contacts APIとは、どんなAPIか その可能性 AndroidSDKは端末内部のアドレス帳へアクセスするためのインターフェースとなるContactsAPIを用意しています。 端末内連絡先という重要なリソースへのアクセスを担うContactsAPIはアプリ開発の幅を広げるためには重要なAPIではないでしょうか。 ですが、このAPIの仕様は煩雑で癖が強いです。直感的に欲しいデータにアクセスできませんし、書き込みもできません。 根本的なContactsAPIの概念的な部分を分かっていないとちょっとイライラすると思います。 また、似ているアドレス情報の連絡先を勝手に集約してまとめるような仕組みがAndroidOSレベルで用意されていたりするため開発者の混乱を招く原因になっていたりします。 また、データにアクセスするためのキー項目の特徴を知っていないと思わぬことが起きたりし
MySQLやOracleなどのデータベースでおなじみのWHERE EXISTS句を SQLiteで使えるかどうかを調べてみたら調べ方が悪いのか、 日本語の情報がほぼ無かったのでメモ。 SQL叩いて試してみたらEXISTS句使えました。 SQL文の例。 SELECT * FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t1.id = t2.t1_id); SELECT * FROM t1 WHERE NOT EXISTS(SELECT * FROM t2 WHERE t1.id = t2.t1_id); これで片方のテーブルだけにある行などの抽出もできます。
String型を指定したい部分にCharSequenceって出てきたので なによと思ったのですが、どうやらインターフェースみたいです。 公式リファレンスを見てみると以下のような説明が書かれています。 >char シーケンスへの統一された読み取り専用アクセスを提供します。 なるほどね。 ちなみにこのインターフェースを実装しているクラス一覧は以下の通り。 String CharBuffer StringBuffer StringBuilder たまに引数の型で出てくるので覚えておくといいかもしれません。
MySQLにはSQL modeというものがあり、何が設定されているかによってSQL文を実行したときの振る舞いが変わります。 ストリクトSQLモードというものがあり、これが有効だとより厳格にSQL文を解釈します。 Strictとはそのまま厳格という意味です。 そのSQLモードを確認する方法が以下のSQL。 SELECT @@sql_mode; 結果。 +------------------------------------------------------------------------------- ------------------------------------------------+ | @@sql_mode | +-----------------------------------------------------------------------------
こんにちは。最近ひそかにはてなブックマークのホットエントリ入りを夢見て目指しているプログラマの山本です。今日はいいネタを仕入れたので記事にしたいと思いますw WindowからMac OS Xへ 私は今まで15年間ほどWindowsユーザーでした。今でも自宅のデスクトップはWindows7で、メインのパソコンです。 そんな中でスマートフォンアプリ開発に携わる機会も増えてきまして、iPhoneやAndroidのアプリ開発をハイブリットに行うことができるMacBook Air(mid2012)を買ってしまいました!職場の社員の半数がMacbookユーザーという職場にいるのですが、この度やっと仲間入りできましたw いろいろ設定をカスタマイズしてみて数日使ってみたところ、かなりバランスのいいモバイル端末ということがわかりました。デザイン性・モバイル性・性能の3点が高いレベルでまとまっている端末です。
WHERE句などでint型とchar型を比較すると、 どうやら暗黙的に型変換しちゃう罠があるみたいです。 PHPもそうですが、文字列と数値の比較では、 暗黙的に数値型に変換したうえで比較を行うようです。 例えばproductsテーブルがあったとして、 product_idが主キーでint型だったとします。 そのテーブルに、IDが10番のデータが登録されているとします 残念なことに以下のWHERE句の判定はtrueになってしまいます。 SELECT * FROM products WHERE product_id = '10 a' char型の「10 a」がint型の「10」に暗黙的に型変換されるからです。 ということでちゃんと比較するにはキャストをして型を合わせます。 SELECT * FROM products WHERE CAST(product_id AS CHAR) = '10 a
今回は Subversion で特定のステータスのファイルを一括で add したり delete する方法を紹介します。 ?ステータス(リポジトリ未登録状態)を一括でAステータス(リポジトリ追加予約状態)にしたり、 !ステータス(ファイル行方不明状態)を一括でDステータス(リポジトリ削除予約状態)にしたりするとき、 楽にできないかなあって思ったので調べてみました。 一括で追加するのは簡単! ?ステータスのファイルを一括で再帰的に追加するのは add コマンドのオプションで簡単に出来ます。 $ svn add * --force force オプションがポイントです。 一回のコマンドで複数のファイルを処理したい場合 svn コマンドは基本的にスペース区切りで対象のファイルを網羅することでできます。 例えばまとめて2つのファイルを削除したい場合は以下の様に行えます。 $ svn delete
こんにちは。ウェブ系システム開発者の山本です。 ウェブ開発のフレームワークって最近は本当にたくさんありますね。メジャーなところだとCakePHPや、Symfony、zend framework、CodeIgniter、あとはRubyでお馴染みruby on railsなどでしょうか。 ここしばらくPHPフレームワークでの開発を継続的にやっています。去年はCakePHP1とCakePHP2を、そして今年はSymfonyを使った実務開発をしています。楽しくコーディングの日々を続ける中で、ジグソーパズルとフレームワークを用いた開発ってとても似ているなってふと思いました。 とにかく手を動かして答えを探る パソコンでカタカタプログラムを打ち込むフレームワーク開発と、ジグソーパズル。 この2つの一体何が似ているのか。 直感的に感じた共通点は手を動かすことです。 どちらも、とにかく手を動かし探って作り上
次のページ
このページを最初にブックマークしてみませんか?
『創作メモ帳 | Web Lover』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く