Windowsコマンドプロンプトを起動と共に文字コードをUTF-8に設定する

今更感満載な話題ですが

昨今のWebやプログラム界隈では、UTF-8がデフォルトの文字コードとなっている。

にもかかわらず、日本のWindows 10のコマンドプロンプトはデフォルト文字コードShift-JIS。

そんなわけで、コマンドプロンプト上でコマンドラインツールの文字を出力しようとすると文字化けが発生する。

なんとかならんもんかと検索したところ、これで解決。

これで解決

$ cmd.exe /K "chcp 65001"

コマンドライン起動時にオプションを渡す。

/Kは、コマンドを実行する引数。

Intellijファミリーでは「File | Settings | Tools | Terminal | Application settings | Sell path」に上記のコマンドをそのまま入力すればOK。

WSL で React Tutorial が開始できなかったのをなんとか出来るようにした

create_react_app のスタートが出来なかった

$ npx create_react_app アプリ名

は問題なかった。
次の段階で、yarn start せよ、とあったのだが、ここでエラーが発生。

Error: spawn cmd.exe ENOENT

こんな感じのエラーが発生し、WSL上で作業しているのに cmd.exe が出るのはどういうことだと。

そして起動方法

結論から言うと、スタート時にブラウザ起動のコマンドを実行するみたいなんだが、WSL 上だと cmd.exe が見つからずエラーになってる模様。

解決策としては、2つあって

  1. cmd.exe へのPATHを設定するらしい
    ※出来るのか未確認
    $ export PATH=$PATH:/mnt/c/Windows/System32
  2. ブラウザ起動をしないようにする
    $ BROWSER=none yarn start

自分の場合「2. ブラウザ起動をしないようにする」で無事に起動した。

他にも同様の理由で起動できないコマンドとかありそう……

参考: https://github.com/facebook/create-react-app/issues/7251

Fabric 2 で接続周りをシンプルにしたい

Fabric 2 で env を fabric みたいに何も考えずに設定して接続というのをやろうとしてたんだけど下記のように出来なさそう。
global は、バッドノウハウな匂いしかしないんだけど、他にやる方法ないのかな。
おとなしく .ssh/config を設定してそれを読み込ませるようにするのがベターなのかしら?


# -- coding:utf-8 --
from fabric import Connection
from invoke import task

env = {}
conn = None

@task
def env_vagrant(c):
global conn
env['host'] = 'localhost'
env['user'] = 'vagrant'
env['kwargs'] = {
'key_filename': '/home/vagrant/.ssh/id_rsa',
}
conn = Connection(
env['host'],
user=env['user'],
connect_kwargs=env['kwargs'])

@task
def info(c):
conn.run('pwd')
conn.run('python --version')
conn.run('pipenv --version')
conn.local('ls')

Windows の Sublime text の CTags プラグインで Auto Complete を使用する

CTagsの.tagファイルで自動補完リスト

このプラグインには、実は.tagファイルを関数の補完リストとして使用する機能が実装されている。
だがしかし!みんな大好きWindowsでは、この機能がなぜか動かない。

というわけで、CTagasのプラグインにCTagsAutoCompleteというClassがあるのでメンバ関数を確認…
f = os.popen(
"awk \"{ print " + prefix + "$1 }\" \"" + tags_path + "\"")

awk…

というわけで、理由はawkと呼ばれるテキスト処理ソフトウェアが必要ということが判明。
なのだが、Windowsには標準で入っていない。

ならばawkとやらをインストールだ。

Auto Completeを使えるようにする

なんとたったの3ステップ!

  1. Gawk for Windows から Binaries のzipをダウンロード
  2. zipを解凍
  3. PATHの通ったフォルダにawk.exeを設置

これで単語補完が働いたときに.tagsファイルに含まれる関数群がリストアップされてより仕事がはかどるという寸法です。

ただ、.tagsファイルが大きいと単語補完にも時間がかかる。
今はまだ、不要な関数群(composerで入れたライブラリとか)はtagファイルのビルド時に無視リストに入れておいた方がよさげ。

Sublime Text 3 のCtagsプラグインfork版公開中

プルリクに反応してくれなかった…

そんなわけで、いくつか変更した機能があるのでそれをfork版として公開しておきます。
github で公開中: naoyukik/CTags

変更内容

Fork: 0.5.0 リリース(2017-02-14)

  • .sublime-projectファイルからCTagsの設定を読み込めるように変更
  • このバージョンからmasterリポジトリをDefaultとし、タグを追加

developmentにて実装(2016-12-09)

  • Sublime Text 3 で実装された関数ジャンプ(Goto Definition)とクイックパネルでのファイルパスと同等の機能を実装
  • ctagsのオプションファイルをプロジェクトのルートフォルダから読み込めるように実装
  • Ctagファイルの自動更新に対応

上記ともに、セッティングファイルに使用フラグを追加してあるのでそれぞれ設定してからご使用ください。

たぶんST2でも使える…かな。

CTagsのプラグイン(本家): https://github.com/SublimeText/CTags

phpのarray_columnやばい

配列のあるキーを使って構造を変更することが簡単に出来るようになるarray_column(PHP5.5以上)
http://php.net/manual/ja/function.array-column.php

説明
array array_column ( array $input , mixed $column_key [, mixed $index_key = null ] )

array_column() は、 配列 input の中から column_key で指定した単一のカラムの値を返します。 オプションで index_key も指定できます。これを指定すると、 入力配列内のカラム index_key の値に基づいて結果を並べ替えます。
-- PHPマニュアルより引用

説明読んでもイメージがわかねぇ…

そこで例を見てみる。
下記例はPHPマニュアルより引用。

例1 レコードセットからのファーストネームの取得

<?php
// データベースから返ってきたレコードセットの例
$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    )
);

$first_names = array_column($records, 'first_name');
print_r($first_names);
?>

上の例の出力は以下となります。

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

簡単にfirst_nameの別配列が作れる。

例2 レコードセットから姓を取得し、”id”で並べ替える例

<?php
// 先ほどの例と同じ $records 配列を使います
$last_names = array_column($records, 'last_name', 'id');
print_r($last_names);
?>

上の例の出力は以下となります。

Array
(
    [2135] => Doe
    [3245] => Smith
    [5342] => Jones
    [5623] => Doe
)

id => last_name で配列を作成出来た。

PHPマニュアルの例には出てないが、第2引数をnullにすると、第3引数の値を元になる配列全体のキーにして返してくれる。

$ids = array_column($records, null, 'id');
print_r($ids);
?>

上の例の出力は以下。

array(
    2135 => 
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    3245 =>
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    5342 =>
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    5623 =>
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    )
)

DBから取ってきたデータの整形あたりでよく使えそう…特に例2はもっと早くこれを知っておけば使えた場面があったように思える…。

教訓

マニュアルやバージョン差分は目を通しましょう。

PHP で var_dumpのフォーマット

var_dumpデバッグしすぎ問題

複数のvar_dumpを出力させてどこに書き込んだか分からなくなった、なんてことないだろうか? (俺だけ?)

で、var_dump でデバッグしたいとき、こんな感じのフォーマットで設定しておく。

/**
 * 下記のフォーマットで書くと出力はこうなる
 * ExecFile: 呼び出したファイル名(行数)
 * Function: 呼び出した関数名
 * 値
 */
var_dump('ExecFile: '.basename(__FILE__).'('.__LINE__.')', 'FUNCTION: '.__FUNCTION__, variable, variable,...);
// var_dump は引数をカンマ区切りで無制限に渡せる。

Sublime Text 3 での Snippet設定

Sublime Text 3 のSnippetは下記設定例。
“var” を入力すると上記のスニペットが展開できるようになる。

ファイル名: var_dump.sublime-snippet

<snippet>
    <content><![CDATA[var_dump('ExecFile: '.basename(__FILE__).'('.__LINE__.')', 'FUNCTION: '.__FUNCTION__, ${1:variable});]]></content>
    <tabTrigger>var</tabTrigger>
    <scope>source.php</scope>
    <description>var_dump Debug</description>
</snippet>

PhalconでPHPビルトインサーバー時にドハマり

Phalcon を使ってみた

Phalconは「A full-stack PHP framework delivered as a C-extension」というフレームワークです。
ベンチマークで超絶速度(PHPフレームワークにおいて)をたたき出すポテンシャルを持っています。
Phalcon 公式はこちら

Phalcon、PHPビルトインサーバーでも動作するってよ

Phalconの公式ドキュメントはかなり詳細なことまで書かれています。
もちろん、サーバー設定方法まで丁寧に記載されています。

で、PHP5.4から搭載されたPHPビルトインサーバーの設定も書かれていました。
PHP ビルトインサーバーの利用

この設定は .htrouter.php というファイル(.htaccess的なもの)で、これを行わないとPhalconのデフォルトと同一の設定になりません。

<?php
if (!file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    $_GET['_url'] = $_SERVER['REQUEST_URI'];
}
return false;

このファイルを使用してサーバーを起動

php -S localhost:8000 -t /public .htrouter.php

これで.htrouter.phpを使用してサーバーへアクセするようになります。

ところがどっこい

さて、これを使用していたもののタイトル通りにここではまってしまいました。
例えばGETにクエリ(パラメーター、Query String…等呼ばれ方はいろいろ)を付与し “/foo/bar?baz=qux” というURLへアクセスすると、ルーティングが上手く動作しなくなります。

変数などをダンプしてみると、
“bar?baz=qux” という文字列がルーティングの判定時に使われています。
本来この時点で取得しなければいけないのは “bar” という文字列だけです。

Phalconのルーティングは、ControllerクラスのActionと呼ばれる関数を使用して動的に呼び出しています。
上記の場合、bar?baz=quxAction()みたいな呼ばれ方をしてしまうということです。
本当はbarAction()を呼ばなければならない。

ならば正せばいい

実際のところ、このことが全く分からず(むしろ勝手にクエリストリングが分割されると思い込んでいたのも問題だった)、1日ハマって見つけたサイトがこちら。
Route not matches URI with querystring · Issue #379 · phalcon/cphalcon
ハイ、公式のgithubのissuesでした。

このissueを読んで上記のルーティングの仕組みをやっと理解。
出来上がった .htrouter.php はこちら

<?php
if (!file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    if (!empty($_SERVER['REQUEST_URI'])) {
       $uriParts = explode('?', $_SERVER['REQUEST_URI']);
       $uri = $uriParts[0];
    } else {
       $uri = '/';
    }
    $_GET['_url'] = $uri;
}

return false;

このポイントの記事が全く見つからず、きっとPHP ビルトインサーバーをみんなが使ってないだけ俺の知識が浅いんじゃないうんきっとそうに違いない。と自己弁護しつつPhalconライフをお楽しみたいと思います。

追伸: 実はvar_dumpで$_GETとかを見ていればヒントがあった。困ったときはvar_dump。

好きなものを見つけてそれを馴染ませる

好きなものをみつけよう

開発するなら自分の手に馴染んだもの、お気に入りのものを使おう。
開発者が使用するアプリは多岐にわたる。

OS、ブラウザ、エディタ、ターミナル、IDE、開発言語……

それこそ分野によってもいろいろあるだろう。
何を選ぶにしても試すことを躊躇ってはいけない。

試して試して試す

例えば、エディタ。

自分は専門学校の頃にエディタというものを知ってからというもの、常に自分に馴染むものを探し求めていた。
そこから10年くらいメインでEmEditorを使用していた。

しかし、ある日出会ってしまった、Sublime Textに。
Sublime Textのデザインといい動作といい、それは本当に一目で恋に落ちたと言ってもいい程の速度で10年使ったEmEditorを過去のものへと変えた。

実は10年間ただEmEditorを使い続けていたわけじゃない。
その間も暇を見つけて、そして新しいアプリが公開されればそのエディタを使っていた。もちろん有名どころな秀丸、Notepad++、さくらエディタ、最近だとAtom、VS Codeあたりも試したけど自分にフィットするものは他に無かった。

何がフィットする?

これは個人によって何が自分の優先度にくるのかでいい。
UIデザイン?
使い勝手?
軽さ?
自分が気に入ったものを使えばいいんだ。

自分がPythonを使いたい理由なんて”The Zen of Python”の思考が自分の性に合ってる。名前の響きがいい。
そんなもんだ。
だいたい他の開発者にこう言うと呆れられる。「ああ、この人ロジカルじゃない。メリットとか考えないんだ」って。

でも、メリットがあるなら自分が扱いづらい言語を使いたいか?
やだやだ。
使いたくない。
仕事ならそこは譲るしかない。けど、そこに縛られる必要がないなら別に好きなものを好きなように使えばいいじゃん。

そして気に入ったらとことん使う

とことんカスタマイズする。キーボードショートカット、テーマ、フォント……。
片っ端から自分が好きなように変えていこう。

膨大な時間がかかる?
いいじゃない。
一生使っていくかもしれないものを自分に馴染ませないでどうする?
そこを惜しんでどうするんだ?

気に入ったものを使えば、何もかもが楽しくなってくる。
手に馴染ませれば、思考が何にも邪魔されずに画面上で動き始める。

気に入ったものを使うってのは最高だ

そこにかけた労力も時間も全てが自分にそれ以上のものを返してくれる。
その瞬間はいつだって最高に楽しく開発してるはずだ。

でも、馴染みすぎてて”邪魔されてない”なんてことには気づかないと思うけどね。

EditorConfigを使い始めたらプログラマー世界の繋がりを感じた。

開発界隈では自分のエディター設定をプロジェクトのコーディング規約に合わせる作業ってのがあります(コーディング規約が無い場合も多々ある)。

そこでこのEditorConfig (http://editorconfig.org/) をお勧め。
これを使ってみたんだけど、プログラマーの世界って繋がってるなぁ、って思っちゃったり。そんな大層なことじゃないかも知れないけれど。

editorconfig.org

root = true

[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 80

[.py]
max_line_length = 79

[*.{rb,js}]
indent_size = 2