yama-log

沖縄でJavaScriptとかSPAとかサイネージとかElectronとか

PHPStormのhtaccessのコメントアウトが地味に超便利

たまにリダイレクトの設定などで大量のhtaccessを記載することがありますが、
その際にPHPStormのショートカット(Cmd + /)がとても便利。

QNQPにsshできなかった。

sshしようとおもったら、

$ ssh username@xxx.xxx.xxx.xxx
Received disconnect from xxx.xxx.xxx.xxx: 2: Too many authentication failures
Disconnected from xxx.xxx.xxx.xxx

って怒られた。

$ ssh -o PreferredAuthentications=password username@xxx.xxx.xxx.xxx

ってパスワード認証を優先(PreferredAuthentications=password)すると繋がった。 passwordと鍵認証が有効だからなのかな?

Cakephp2 ACL 導入メモ(User,Groupのシンプル設定、最低限の手順メモ)

かなりざっくりのメモ自分が思い出せるレベルです。(汗

  • Acl (アクセス – コントロール – リスト)
    アクセスを制御するシステム全体の事を言っている。(学生規則リストみたいな)
    具体的には ACLコンポネント全体と捉える。

  • ARO (アクセス – ロール:役割 – オブジェクト)
    アクセスを制御する役割の種類(校長、先生、生徒、生徒etc)
    具体的には arosテーブルで定義

  • ACO (アクセス – コントロール – オブジェクト)
    アクセスする実際のアクションを定義していく
    具体的には acosテーブルで定義

DBの準備

Allで使う。aros,caos,aros_acosの3つのテーブルの定義を以下のsqlを実行する。

/app/Config/Schema/db_acl.sql

Controller

AppController

  • コンポネント追加
public $components = array(
  'Acl',
  'Auth' => array(
    'authorize' => array(
      'Actions' => array('actionPath' => 'controllers')
    )
  ),
  'Session'
);
  • へるぱ追加;
public $helpers = array('Html', 'Form', 'Session');
  • beforeFilterへAuth関連追加(一旦すべてアクセス許可)
public function beforeFilter()
    {
        // AuthComponent の設定
        $this->Auth->loginAction = array(
            'controller' => 'users',
            'action' => 'login'
        );
        $this->Auth->logoutRedirect = array(
            'controller' => 'users',
            'action' => 'login'
        );
        $this->Auth->loginRedirect = array(
            'controller' => 'groups',
            'action' => 'index'
        );
        $this->Auth->allow();
    }

UserController

  • ログイン/アウト追加
public function login()
{
  if ($this->request->is('post')) {
    if ($this->Auth->login()) {
      return $this->redirect($this->Auth->redirect());
    }
    $this->Session->setFlash(__('Your username or password was incorrect.'));
  }
}

public function logout()
{
}
  • ログインのView
<?php
echo $this->Form->create('User', array('action' => 'login'));
echo $this->Form->inputs(array(
    'legend' => __('Login'),
    'username',
    'password'
));
echo $this->Form->end('Login');
?>

Model

UserModel

  • Acl関連ビヘイビア/メソッドなど
public $actsAs = array('Acl' => array('type' => 'requester', 'enabled' => false));

public function parentNode()
{
  if (!$this->id && empty($this->data)) {
    return null;
  }
  if (isset($this->data['User']['group_id'])) {
    $groupId = $this->data['User']['group_id'];
  } else {
    $groupId = $this->field('group_id');
  }
  if (!$groupId) {
    return null;
  } else {
    return array('Group' => array('id' => $groupId));
  }
}

public function bindNode($user) {
  return array('model' => 'Group', 'foreign_key' => $user['User']['group_id']);
}


public function beforeSave($options = array())
{
  $this->data['User']['password'] = AuthComponent::password(
    $this->data['User']['password']
  );
  return true;
}

GroupModel

  • Acl関連追記
public $actsAs = array('Acl' => array('type' => 'requester'));
public function parentNode() {
  return null;
}

セットアップ

  1. ビューを設定
  2. グループ>ユーザ追加 (AROオブジェクトができる) arosテーブル
  3. ACOを作る(acos)
  4. パーミッション設定

1ビューの設定

CRUDなものは準備しておいたほうが良いかも
最低限は groupのindexとaddメソッドGroup::save()で、じどうでarosに追加される

Console/cake bake all

で一旦CRUD作ってもいいかも。(一旦元のController,Model,View逃してとかも)

2グループを追加

/groups/index
からグループ追加 > arosの追加を確認する

3AROを作る

ここからプラグインで、次のURLからDL

https://github.com/sams/alaxos_acl

READMEを参考に
– git cloneして、
– フォルダ名を’alaxos_acl’ > ‘Acl’に
– Config/bootstrap.phpに、’CakePlugin::load(‘Acl’, array(‘bootstrap’ => true));’
– Acl/Config/bootstrap.phpを編集以下を編集 ‘Group’ と ‘group_id’部分

Configure :: write('acl.aro.role.model', 'Group');

Configure :: write('acl.aro.role.foreign_key', 'group_id');
  • /admin/acl/にアクセス

  • [Actions] > [Build actions ACOs] > [Build] とオス。(acosテーブルに全Controller,Actionが追加される)

4パーミッション設定

-[Permissions] > [Roles permissions]と押すと一覧が表示される。
適切に設定して後は AppControllerの $this->Auth->allor()を消して動作確認まで

4kディスプレイ(LG モニター ディスプレイ 27UD68-W 27インチ)で快適 HTMLコーディング環境

LG モニター ディスプレイ 27UD68-W 27インチを1年前くらいに購入しました。
最初は金額で躊躇していたのですが、1年間つかってみてよかったので、以下いろいろと感じたところ。(アフィリンク貼っています。)

デュアルよりも大きい1画面にすべて表示

4Kなので単純にpxが倍なので、フルHD4枚分の情報が表示可能です。(なのでデュアルディスプレイからクラムシェルモードに切り替えて使ってます。)
例えば左側にエディタ(しかもHTML + PC用CSS + スマホ用CSS + JSなどを並列に!!)おいて、右側にBlisk(スマホ/PC)の表示を置くと、
画面の切り替えなどが不要になりました。
縦も2倍あるので、デベロッパーコンソールをPCの画面の下に表示したとしても十分な広さです。(デベロッパーコンソールのみでフルHD分をとれる。

これが一番大きいところで、いままで Cmd+Tab(Macのアプリ切り替えショートカット)で
ブラウザとエディタを切替えていただのですが、1画面内なので不要になります。
(1年間で押すであろう数万回のCmd+Tabを回避できたのでそれだけでも嬉しい)

※Bliskのオートリフレッシュ機能をONにしておけば、保存して視線をずらすだけでそく表示の確認ができます。
細かい時間ですが、1年間とかんがえれば相当な時間を節約できていそうです。

(参考リンク)
Bliskのオートリフレッシュ機能の設定方法。ローカルファイルの編集でブラウザを自動更新。
http://nelog.jp/blisk-auto-refresh

MacBookPro デュアルディスプレイからクラムシェルモードで重さ解消


これまでは MacbookProとフルHDディスプレイの環境だったのですが、購入をきっかけに、MacBookProのクラムシェルモードに切替えて利用しています。
いつも利用時にファンが回りっぱなしで動作が重い感じがしていたのがいくらか解消された気がします。

画面が非光沢4Kディスプレイなので

映り込みがすくなく、ほぼ1日、長時間コーディングをする私にとっては目に優しく嬉しいです。(macbookproは光沢ディスプレイ)

Youtubeなどで4K動画が見れる。

花火とか、宇宙とか、花とか4Kで見れるのがうれしいです。
もっと、4K,60fpsの動画などふえるといいなぁーライブの生配信とかも4kでみたい。

長く使えるのか問題。

1年間は何の問題も無く使えているのですが、できれば5年〜10年nくらいはつかいたいなぁーと考えております。
まだ実際につかってないのでわからないですが、もってくれると嬉しいな。
冒頭の写真にうつっているもHHKB TypeS 無刻印も、10年くらいは使いたいと感がています。

PHPStorm(WebStorm)でJSを自動で圧縮minifyする

Web開発のタスクランナーでgulpとかあるけど
PHPStorm(WebStorm)のFil Watchersが大分べんりで、JSの自動での圧縮も導入した。

FileWatcherにデフォルトで yuicompressor の設定があるらしいので、npmでインストール(グローバルに入れました。)

% npm install -g yuicompressor 

設定はそのままにしました。

試しに適当ななJSファイルを作ってみたら自動で圧縮ファイルができました。

ファイル名.min.js

と ‘min’を付加して保存してくれるみたい。

コードを書きながらどんどん自動でいってくれるみたい、

JSに関してはリアルタイムでなくてもよいのかなぁーとかも考でしたが、
FileWatcherは、TypeScriptなども簡単にWatchできるのでとても便利です。

一番うれしいのは、環境の設定などきにせず、GUIでちゃっと設定できるので便利。
ただ共同作業で進めるときはちゃんとタスクランナーの設定かかなきゃ。><

WordPressのサブディレクトリへの移動方法 /wp/などへ

いつも忘れてるのでメモ

1.管理画面で設定変更 ([設定] > [一般設定] )

(この時点で管理画面が表示できなくなるけど落ち着く。)

2.ファイルの移動

WordPressのファイル群を/wp/以下などに一式移動します。

3./index.phpの最後の方の wp-blog-header.phpへのパスの記述を変更

CakePHP2 Schema,Migrations関連メモ

個人的にわすれるので。

スキーマ作成(※要-fオプション ModelクラスがなくてもSchemaへ反映してくれる)

$ ./Console/cake schema generate -f

Migration作成

$ ./Console/cake Migrations.migration run all -p Migrations

‘schema_migrations’テーブルができる。

変更を加える

テーブル追加など

Migrations実行

$ ./Console/cake Migrations.migration generate -f

実行すると

Cake Migration Shell
---------------------------------------------------------------
Do you want to compare the schema.php file to the database? (y/n)
[y] >

schema.phpと比較するかな? > y

---------------------------------------------------------------
Comparing schema.php to the database...
Do you want to preview the file before generation? (y/n)
[y] >

previewする? y

Please enter the descriptive name of the migration to generate:  
> add_newtable_and_newfields
Generating Migration...

説明する名前つけてなので変更した内容を記述 > add_newtable_and_newfields

Do you want to update the schema.php file? (y/n)
[y] >

スキーマupdate ? yes.

Welcome to CakePHP v2.6.12 Console
---------------------------------------------------------------
App : app
Path: /Users/taka/htdocs/bizmatchocvb/html/businessmatching/app/
---------------------------------------------------------------
Cake Schema Shell
---------------------------------------------------------------
Generating Schema...
Schema file exists.
 [O]verwrite
 [S]napshot
 [Q]uit
Would you like to do? (o/s/q)
[s] > o
Schema file: schema.php generated

上書き? yes で完了。

次回以降は、

$  ./Console/cake Migrations.migration generate -f

で良さそう。

変更内容の適用方法

$ ./Console/cake Migrations.migration run

とすると

Cake Migration Shell
---------------------------------------------------------------
Available migrations:
  [xxxxxxxxxxx] xxxxxxxxxxx_add_newtable_and_newfields
        not applied
---------------------------------------------------------------
Please choose which version you want to migrate to. [q]uit or lean.  
> xxxxxxxxxxx

バージョンを聞いてくる。ので該当の xxxxxxxxxxx を入力して

---------------------------------------------------------------
Running migrations:
  [xxxxxxxxxxx] xxxxxxxxxxx_add_newtable_and_newfields
      > Creating table "bookmarks".
      > Creating table "likes".
      > Creating table "messages".
      > Creating table "notices".
      > Creating table "projects".
      > Adding field "newstype_id" to table "news".

---------------------------------------------------------------
All migrations have completed.

マスター系のテーブルに追加がある場合。

/Config/Migrations/以下のMigrationのプログラムに追記
‘up’した時にどうするかを追記。(‘down’のときも必要)

/**
 * After migration callback
 *
 * @param string $direction Direction of migration process (up or down)
 * @return bool Should process continue
 */
    public function after($direction) {
        if ($direction === 'up') {
            $Group = $this->generateModel('Group');
            $Group->save(array(
                'Group'=>array('name'=>'海外エージェント','key'=>'agent')
            ));
        }
        return true;
    }
}

MAMPでPHPからRedisを簡単につかう。

とりいそぎ機能だけ試してみたい、アプリケーション側へ集中したいということでMAMPでPHPからRedisを簡単につかう方法。

こちらからコンパイル済のredis.soを取得して
(使いたいPHPのバージョン ※マイクロバージョンが違う環境でも動作できました。)

panxianhai/php-redis-mamp
https://github.com/panxianhai/php-redis-mamp

MAMPアプリケーションの以下のディレクトリに配置

/Applications/MAMP/bin/php/php5.x.x/lib/php/extensions/no-debug-non-zts-200xxxxx

メニューの [File] / [Edit Template] / [PHP] [PHP(自分のバージョン) php.ini を選択し以下を追記(最後でもどこでも)

extension=redis.so

MAMPを再起動,phpinfo()してみる。(redisが出てたらOK)

brewでredisをインストール

$ brew install redis

redisを起動

$ redis-server

サンプル実行

<?php
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
$redis->set("name","yamaaaaa");
echo $redis->get("name");

ブラウザでアクセスして出力確認

yamaaaaa

WordPressの投稿にカスタムフィールド(wp-postmeta)の値を手軽にJOINして取得する。&JSONへ変換

WordPressで投稿のデータにカスタムフィールドを加えて取得する。(全文)

<?php
$posts_join_keys = array();
$posts_join_prefix = 'tmp_join_table_name_';
add_filter('posts_join', 'posts_more_join' );
add_filter('posts_fields','posts_more_fields');
function posts_more_join( $join )
{
 global $posts_join_keys,$posts_join_prefix;
 foreach($posts_join_keys as $key => $k){
 $alias = $posts_join_prefix.$k;
 $join .= sprintf(" INNER JOIN wp_postmeta as %s ON ( wp_posts.ID = %s.post_id AND %s.meta_key = '%s' )",$alias,$alias,$alias,$k);
 }
 return $join;
}
function posts_more_fields($fields){
 global $posts_join_keys,$posts_join_prefix;
 foreach($posts_join_keys as $key => $k){
 $alias = $posts_join_prefix.$k;
 $fields .= sprintf(',%s.meta_value as %s',$alias,$k);
 }
 return $fields;
}
$posts_join_keys[] = 'locate';
$posts_join_keys[] = 'description';
$args = array(
 'posts_per_page' => -1,
 'fields'=> 'wp_posts.ID,wp_posts.post_title',
 'meta_query' => array(array(
 'key' => 'locate',
 'value' => '',
 'compare' => '!='
 ))
);
$query = new WP_Query( $args );
$posts = $query->get_posts();
wp_reset_postdata();
$json = '{data:'.json_encode($query->get_posts()).'}';
?>

上のプログラムの $posts_join_keysに取得したいカスタムフィールドの’meta_key’を追加(push)していけばその分取得できます。

$posts_join_keys[] = 'locate';
$posts_join_keys[] = 'description';

WordPressのシンプルなページネーション(ページ番号)リンク

プラグインなどをつかわずにできるシンプルなページネーション(ページ番号)のリンクのテンプレートです。

WordPressテンプレート

<div class="pagenation">
    <ul>
        <?php
        $page_current_num = (!empty($paged))? $paged:1;
        $page_last_num = $wp_query->max_num_pages;
        if($page_current_num > 1){
            echo sprintf('<li class="prev"><a href="%s">%s</a></li>',get_pagenum_link($page_current_num-1),'PREV');
        }
        $page_start_num = $page_current_num - NUM_PAGENATION_BEFORE_AFTER;
        if($page_start_num < 1) $page_start_num = 1;
        $page_end_num = $page_current_num + NUM_PAGENATION_BEFORE_AFTER;
        if($page_end_num > $page_last_num) $page_end_num = $page_last_num;
        for($i = $page_start_num;$i<=$page_end_num;$i++){
            if($page_current_num==$i){
                echo sprintf('<li class="active">%s</li>',$i);
            }else{
                echo sprintf('<li><a href="%s">%s</a></li>',get_pagenum_link($i),$i);
            }
        }
        if($page_current_num < $page_last_num){
            echo sprintf('<li class="next"><a href="%s">%s</a></li>',get_pagenum_link($page_current_num+1),'NEXT');
        }
        ?>
    </ul>
</div>

CSS(SASS)

//---------------------------------------------------pagination
.pagenation
  padding: 40px 0
  margin: auto
  display: table
  &:after
    clear: both
    content: "."
    display: block
    height: 0
    visibility: hidden
  ul
    &:after
      clear: both
      content: "."
      display: block
      height: 0
      visibility: hidden
    text-align: center
    margin: auto
  li
    float: left
    list-style: none outside none
    margin-left: 3px
    &:first-child
      margin-left: 0
    &.active
      background: #336699
      color: #FFF
      cursor: not-allowed
      padding: 10px 20px
    a
      background: #F2F2F2
      color: #336699
      display: block
      padding: 10px 20px
      text-decoration: none
      &:hover
        background-color: #A1AABA
        color: #FFF
        opacity: 0.8
        transition-duration: 500ms
        transition-property: all
        transition-timing-function: ease

1/22ページ

Powered by WordPress & テーマの著者 Anders Norén