Ruby on Railsでhttpサーバgemの指定

( ´_ゝ`)ノシ

 MS de:codeの2日目の記事書いてない、

と思い出したらもう8月末orz

de:codeは参加者多いから誰かが書いてると思うので

私が書かなくてもいいな(言い訳)

 

本題。

railsチュートリアル(rails5.0対応版)でpumaの設定をセットしたら

pumaはwindowsに対応してない?らしくてエラーが出るようになった。

ローカルで軽く動作確認したいだけならwebrickで十分なので

rails serverでwebrickを指定して起動できる方法を探したらあった。

対象gemバージョン: rack-1.6.0beta later

$ RACK_HANDLER=webrick rails s

 これで起動させればwebrickで起動する。

rackのバージョンは

$ rake about

で確認できます。

RACK_HANDLERについて

gemのrackで利用する環境変数

値が指定されている場合は指定されているgemを利用する。

指定されていない場合の動作はpuma > thin > webrickの優先度で

設定があるか確認してhttpサーバを起動する。

 

お世話になってる勉強会

今年の7月くらいから株式会社スタートアップテクノロジー

@naoki_m1006さんが主宰されている

【初心者歓迎!】Ruby on Railsもくもく会@渋谷

(リンクは2017/08/19開催時の募集。)

に何度か参加しています。

今のところ土曜日の14時開催が基本のようです。

html?それRailsで使うんですか?

レベルの初心者の方も参加されてるので

必要なのは案内通りやる気、PC、教材(これは無くてもなんとかなる)です。

早く一通り覚えたい。

MS de:code2017 1日目に参加

yoshitiaです。

今年のアップデートでkindleに音読機能付いた情報にガタッとなっています。

 

本記事はde:code 2017 1日目に参加したセッションの記録です。

 今回のyoshitiaの目当てはAIより開発手法まわりの話でした。

基調講演

初参加でよく知らなかったのですが

de:codeは米国で開催されているイベント MS build の内容を

日本でも紹介するものらしい。(+日本向けの追加セッション)

メインテーマとしては「AIスゲー」だった気がする。

デモではスピーカーの方が滞在先のホテルで見つけてきた落ち葉を

AIで品種判定してた。

 

『変わらない開発現場』をかえていくために ~エンプラ系レガシー SIer のための DevOps 再入門~

 内容は開発手法の紹介ってよりSIerに開発手法やソフトウェアの更新を行う上で

考慮することは、って話でした。

雑に言うと軍隊が装備を更新したり新装備に合わせた部隊編成変更するには、

みたいなノリ。

内容はweb記事で確認できます。

blogs.msdn.microsoft.com

 

 DevOps でリードタイムを 8 か月から最短 1 週間まで短縮!! マネージャや開発チーム変化の赤裸々話

こちらはwebでネタにされる典型的なタイプのSIer

段階を踏んで少しずつDevOpsの手法を取り込んでいった苦労話です。

新しい技術を導入するのは外部から人材呼ぶくらい思い切らないと

厳しそうだなぁ。

 

channel9.msdn.com

日本企業の生産性を根本から改善する 8 つの習慣とその事例

 DevOps等2000年以降色々と出てくる米国から発信されてくる

開発手法について日本が導入する場合の困難について解説しています。

日本の開発現場は他国より不確実性忌避と長期志向が高いそうです。

言葉をくだくと、まずはやってみよう・駄目元でチャレンジを簡単に認めない、

一旦決めたものは簡単に変えたがらない傾向です。

それがいいか悪いかは人それぞれだと思いますが

新しい開発手法を受け入れたり生産性上げる目的には向かないので

取り入れていきたいものが8つの習慣だそうです。

詳細は以下のリンクで。

simplearchitect.hatenablog.com

 

War is over : ブラウザエバンジェリスト達とWebの未来を語ろう

MicrosoftgoogleMozillaのブラウザまわりに関わってる人が

集まって話してるってのが時代変わった感あった。

webでもコンパイルって単語が当たり前になってきてるのか・・・。

MS de:code2017 前夜祭に参加

( ´_ゝ`)ノシ

yoshitiaです。

MS de:code に参加してきました。

あれ?そろそろ一ヶ月経ちそうだ。

本記事はその前夜祭の記録です。

そろそろ記憶もあやしいのでupしよう。

 

基調講演

全身にLED貼り付けたダンサーさんがパフォーマンスしたと思ってたら

ダンサーであり技術者の方だった。

活動当初はLED500個くらいだったらしいが

今は5000個のLEDを制御してるらしい。

これは数学必要な案件ですわ。

他にはタチコマが出てきた。

特徴的な機能は

自然言語処理での応答(Siriとかそういうのと似たようなやつかな?)

・並列化機能?

 タチコマのセンサーに物体を認識・記憶させるときに

 声で物体についての情報を教えると

 ネットワークでつながっているタチコマとその情報を共有できる。

 (センサーで認識した物体の情報と教えられた物体の情報のみ)

 

将来的には数十体のロボットに並列化機能を搭載して

ロボットAIの学習時間短縮に利用されたりするんだろうなぁ。

 

 

基調講演後は3つのサブステージから興味を持った講演を聴くスタイルに。

 

サブステージ講演1

『遅咲きエンジニアのキャリアプランニング』とかそういうタイトルだったと思う

ゼロからプログラミングを始める際に選択する言語として熱いPHP推しをしていた。

なぜPHPなのかって理由は講演者の方のweb記事に書いてあります。

 

サブステージ講演2

ARでスポーツ用デバイス作成している方の開発の軌跡。

まだデバイスがごつくて普及難しいと言われたりしてるのに

それを装着してドッジボールばりに激しく動く競技作ろうとしてるそうで。

控えめに言ってマジキチです。(ほめ言葉)

 印象に残ってるのは

攻撃でARのエフェクト出すとき、

必殺技モーションで出せるようにモーション登録をして

一般テスターの方に試してもらったら

登録したモーションに合う動きができなくて

「壊れてるんじゃないですか?」って言われたのが

すごくつらかったと。

※人間はじっと座ってるときでも重心が常に動くように

体ができてるのでコンピュータに同一モーションと

判断されるレベルでの同じ動きをするのが難しい。

と言うか武術の達人が目指す境地。

同一モーションと判定する基準のさじ加減が厳しいと達人の世界になるし、

甘くしすぎると関係ない動きまで該当のモーションと判断されるという・・・。

Vimのコマンドでテキスト整形

※本記事はVimの基本操作の話です。プラグインは使用しません。

 

( ´_ゝ`)ノシ

yoshitiaです。

ブログトップ画像を変更しました。

GWにお出かけしたときのフッジサーン/(^o^)\です。

どうも桜とか富士山とかそういうのじゃないと

写真取る気起きない性分みたいです。

 

本題。 

今回はSQLのCREATE文からカラムのコメントに記述されているカラム名を取り出す、

これをVimで行う手順を書いてみようと思います。

(postgreSQL, pgAdminのSQLビューから取り出す想定)

Vimの起動・保存・入力・終了がわかっていれば理解はできるかと。

 

1. 上下の余分な行を削除

以下のsqlpostgresqlの公式ドキュメント

https://www.postgresql.jp/document/9.4/html/sql-createtable.html

から取ってきて雑にコメントを後ろに追加しただけになります。

取り出したいのはフィルム番号、タイトル...の部分です。

CREATE TABLE films (
    code        char(5), -- フィルム番号
    title       varchar(40), -- タイトル
    did         integer, -- ディストリビュータid 
    date_prod   date, -- リリース日
    kind        varchar(10), -- 種類
    len         interval hour to minute, -- リリース日からの経過時間
    CONSTRAINT code_title PRIMARY KEY(code,title)
);

 pgAdminのsqlビューだともう少し上下に余分なものがあります。

Vimで上下の余分な行を取り除くときは以下の操作を行います。

ノーマルモードで取り出したい部分の下の行に移動させて

で行頭に移動。

次に dG を押します。

dGのdは削除を指定、続くG(Shift+g)で

「カーソルからファイルの末尾まで」の範囲指定を行っています。

 

次に gg でファイル先頭にカーソル移動。

続けてdd と入力すると1行削除が実行されます。

続いて.(ドット)を取り出したい部分より上の行がなくなるまで連打します。

.(ドット)は直前に実行したノーマルモードのテキスト編集操作を繰り返します。

Vimの.(ドット)コマンドについてはwebに沢山記事があるのでweb検索すると幸せになれます。

 

必要なコメントがある行以外を抜くと次のようになります。

    code        char(5), -- フィルム番号
    title       varchar(40), -- タイトル
    did         integer, -- ディストリビュータid 
    date_prod   date, -- リリース日
    kind        varchar(10), -- 種類
    len         interval hour to minute, -- リリース日からの経過時間

 

2. コメント以外の部分を取り除く

 1の結果からコメント以外の部分(--より左側)を取り除きます。

各行のコメント開始位置がそろっていないのが面倒です。

結論から言うとexモードで置換します。

1より慣れが必要なのでこういうことがVimでできる、という紹介になります。

今はVimに限らず高機能なテキストエディタがあるので

同じ事が利用中のテキストエディタで可能か調べるのは学びがあると思います。

    code        char(5), -- フィルム番号
    title       varchar(40), -- タイトル
    did         integer, -- ディストリビュータid 
    date_prod   date, -- リリース日
    kind        varchar(10), -- 種類
    len         interval hour to minute, -- リリース日からの経過時間

各行コメントの左側は文字数等に差はありますが

「コメント部分の左側は『-- 』」なのは共通しています。

そこでノーマルモードで :%s/^.*-- //を入力後Enterで実行すると

 以下の様になります。

フィルム番号
タイトル
ディストリビュータid 
リリース日
種類
リリース日からの経過時間

コマンドの内容は

: がexモード開始、 %はexモードで「今画面で編集中のファイル」を表す記号です。sはsubstitute(置換)を表します。

%の部分を省略するとカーソルのある行が対象になります。

 /から右側は /置換対象/置換する文字列/ です。

「^.*」は正規表現なので一文字ずつ調べると幸せになれます。

 

3. まとめ

vimでテキスト編集を行うときは

編集する手順を考える→実行する

→うまくいかなければundoする→...

の繰り返しです。

テキストの編集で「どう編集するか」を

考えるのは面倒だと思います。

 ですが、ある程度繰り返していくと

編集する手順を考える時間が短くなっていきます。

コツは、無理に1回の操作でやりたいことを

片付けようとしないことです。

Vimが身についてくると

「こうしたら少ない操作でできるんじゃないか」と

思いついたり調べたりする気持ちの余裕が出てくるのでそこからが本番です。

それまではカーソル移動がhjklだけでも

文字削除にx連打でもいいんじゃないかと。

よし、Vimmerらしい記事書いたぞ。

Happy Vim Life!

javascriptでテーブル行挿入処理を雑に実装する

( ´_ゝ`)ノシ
yoshitiaです。
phpの現場が忙しく、
1年の6分の1経っても新しく記事が書けてないので凹んでます。

 

本題。

php案件と言いつつ今時は画面側の処理書く時に

javascriptはセットなわけで。

大抵は使用するwebアプリケーションフレームワーク

基本的な処理は入ってるのですが

THE・Excelなセル結合を駆使したネ申フォーマットの前には無力です。

どなたかクライアントに1レコード行あたりにtrタグ何個も使って

colspanやrowspanをフルに使う寄木細工フォーマットは

作る側も保守・運用する側も地獄ってことを

伝えていただけないでしょうか(虚空に消えていく愚痴)

 

本記事はそういうネ申フォーマットに行挿入処理を実装する時の方法です。

 

1. コピー用のレコード行を別に用意する

 trタグ1つ、つまり1行で済むなら

元からあるレコード行をcloneNode(true)して

inputタグの中身をクリアしたら一丁あがりだと思います。

もしくはタグ生成処理をして追加するかかと。

が、複数行にまたがる場合、trタグ毎に処理実装が必要になり、

html部分の変更が生じるとtrタグ毎の処理を1行ずつ確認して

修正になります。

(colspanやrowspanを使っているのでどのtrタグにあるかわかりにくい)

 

そこでcloneNode(true)用のレコード行をdisplay:noneで別に用意します。

初めから空なのでクリア処理を考える必要がなくて楽です。

phpsmartyを利用しているならレコード行部分のhtmlを1つのtplファイルに書いて

表示する部分とdisplay: noneのtableタグの中身に出力するようにすると

html部分の変更が生じてもレコード行部分のhtmlを記述したtplファイルの中を修正するだけで終わるのでメンテしやすいです。

    <table id="table_copy" style="display: none;" >
          <tr>レコード行1/2</tr>
          <tr>レコード行2/2</tr>
    </table> 

2. javascriptで1をコピーする行挿入処理を実装する

大体こんな感じの処理になると思います。

function row_insert(行挿入ボタンの要素) {

//table要素が取れるまでparentNodeを繋げる var table_tag = 行挿入ボタンの要素.parentNode.parentNode;
//tr要素が取れるまでparentNodeを繋げる
var tr_tag = 行挿入ボタンの要素.parentNode;

//コピー用のtable要素取得
var copy_table_tag = document.getElementById("copy_table");

//挿入行のインデックスを取得
var index = tr_tag.rowIndex;

//挿入行にtrタグを差し込む(1)
table_tag.insertRow(index);

//コピー用table要素から1行目をコピー(2)
var copy_tr_tag1 = copy_table_tag.rows[0].cloneNode(true);

//差し込んだtrタグに中身を格納する(3)
table_tag.rows[index].innerHTML = copy_tr_tag.innerHTML;

//2行目以降はindex+1,index+2・・・,copy_table_tag.rows[1],[2],・・・で処理を調整する }

後は必要に応じて処理を修正していけばいいかと。

3. まとめ

取りあえずこの記事書いてみましたが

この実装でもメンテ大変そうな気がするので

可能なら

レコード行をtrタグ1個の中に納めませんか?

せめてrowspan使うのやめませんか?

って確認or提案した方が幸せになれる気がします。

 

願わくばこの記事読んでる人がこういう意見・提案を

聞いてもらえるお仕事でありますように。

 

Happy Javascript life!

emacsのdefmacroメモ。

( ´_ゝ`)ノシ
yoshitiaです。

evil-modeのdefmacro読もうとした時に?となった点をメモ。

defmacroの中に入ってる良くわからないもの

(declare (indent defun))
というコードがあって
macroexpandでマクロを展開しても
出力結果がインデント調整されてるわけでもないので
かなり謎でした。

init.el読書会で解決

丁度2016/12/24のinit.el読書会で出てきたinit.elで
defmacroが出てきたので@poginさんに聞いたら即答でした。

(declare (indent defun))で調整されるもの

defmacroでマクロを定義した後、
マクロを書くタイミングで効果が出ます。
式の途中で改行を行った時のインデント方式の指定を
行っているようです。

@poginさんに出してもらった例

;; (declare (indent defun))無し
(defmacro after1 (mode &rest body)
  "`eval-after-load' MODE evaluate BODY."
  `(eval-after-load ,mode
     '(progn ,@body)))

;; (declare (indent defun))あり
(defmacro after2 (mode &rest body)
  "`eval-after-load' MODE evaluate BODY."
  (declare (indent defun))
  `(eval-after-load ,mode
     '(progn ,@body)))

上記マクロ2つを評価した後に書いたコード

;; (declare (indent defun)) なし
(after1 'dired
        (define-key dired-mode-map (kbd "M-p") 'dired-back-to-top)
        (define-key dired-mode-map (kbd "M-n") 'dired-jump-to-bottom)
        (define-key dired-mode-map (kbd "C-a") 'dired-back-to-start-of-files))

;; (declare (indent defun))あり
(after2 'dired
  (define-key dired-mode-map (kbd "M-p") 'dired-back-to-top)
  (define-key dired-mode-map (kbd "M-n") 'dired-jump-to-bottom)
  (define-key dired-mode-map (kbd "C-a") 'dired-back-to-start-of-files))

それぞれ2行目以降のインデントはemacsが自動で調整したものです。
indent後ろにdefunや1やら値を指定するとそれに応じて
マクロのインデントの方式が決まるようです。

参考:
GNU Emacs Lisp Reference Manual: Indenting Macros

evil-modeのelispをちょっと覗いてみる

本記事は Emacs Advent Calendar 2016 の5日目の記事になります。

( ´_ゝ`)ノシ
VimConf2016が終わったと思ったらこんな季節に。

ネタは何かと問われれば
Emacs with evil-mode が主戦力の Vimmer なので
evil-mode の elisp を見てみる、そういう事になった。

Spacemacsのユーザーが増えているようですが
各種elispのviキーバインド適応設定+独自設定ファイルまで
詰め込まれているのは重たすぎると思うので
当分evil-modeのままで行きます。

内容は emacs 何それ美味しいの?人向けのレベルです。
ただし、何がしかのプログラミング言語が読めないとツライです。

evilのバージョンは1.2.12です。

evil.info

ここにevilのインストール方法とか書いてある。

evil.el

ここが.emacs(init.el)で

      (add-to-list 'load-path "~/.emacs.d/evil")
      (require 'evil)

と書いて起動した時に読み込まれる部分。

evil.elのコード

;;; Code:

(require 'evil-vars)
(require 'evil-common)
(require 'evil-core)
(require 'evil-states)
(require 'evil-repeat)
(require 'evil-macros)
(require 'evil-search)
(require 'evil-ex)
(require 'evil-digraphs)
(require 'evil-types)
(require 'evil-commands)
(require 'evil-maps)
(require 'evil-integration)

(run-hooks 'evil-after-load-hook)

;;;###autoload
(define-globalized-minor-mode evil-mode
  evil-local-mode evil-initialize)

(provide 'evil)

;;; evil.el ends here

コードの説明。

require 'xxx

;はコメントアウト
(require 'evil-vars)
(provide 'evil-vars) と記述されている
evil-vars.elを読み込む。

*-hook

(run-hooks 'evil-after-load-hook)
一通りのevil-modeを構成するelispをロード後に
hookを読み込みます。
EmacsではEmacs上のイベント発生時に
ユーザーが読み込ませたい処理を仕込んでおく変数として
*-hookが用意されています。
evil-after-load-hook については
evil-vars.el 内で定義されています。
つまり、自分でelispでmode作る時は必要に応じて定義しておくものになります。

 (define-globalized-minor-mode evil-mode
  evil-local-mode evil-initialize)
モード定義

define-globalized-minor-mode で
evil-mode、evil-local-mode、evil-initialize-mode を
どのバッファでも利用できるマイナーモードとして扱うように設定します。
(evil-mode は viキーバインドを実現する elisp なのでこの扱いが丁度いい)
バッファを開く際のメジャーモードで evil-mode が不都合な場合は
そのメジャーモードの hook で evil-mode をオフにすることができます。
(メジャーモード・マイナーモード・バッファは
Emacs独自の定義があるので興味があればググッてください。)

雑に言うと開くタブ毎に evil-mode のオン・オフ切り替えの設定・操作が可能です。

evil-mode開始

これらが読み込まれた後に
.emacs(init.el)から
(evil-mode 1) を読み込むと
Emacs で evil-mode を使う準備が整います。

おまけ: <C-z>

一時的に Emacs キーバインドに戻したい場合はデフォルト設定の場合、
Emacs キーバインドに切り替え・切り戻しができます。
この場合は evil-mode をオフにしているわけではなく、
evil-emacs-state という
Emacs キーバインドのみの state に切り替えているだけです。
(vi で言うモードを Emacs のモードと区別するためevilでは
stateという名称で扱っています)

とりあえずまとめ

一番最初の evil.el だけで100行越えの記事に・・・。
最終的にはvim入門記事定番の
「起動→インサートモード→文字入力→
Esc→:qで終了」を elisp から追記していく予定です。

2017年も良い年でありますように。
Happy Vim and Emacs Life!