kiyo_hikoのブログ

メモ+日記?

Perl5.xで配列の長さ的なもの

すぐ忘れるうえに調べても何の喜びもないTipsのメモ

my @xs = qw/1 2 3 4 5/;

print("$#は" . #$xs . "\n");
print("スカラーコンテキストは" . scalar(@xs) . "\n");
#$は4
スカラーコンテキストは5

Fin.

Windowsで、Gitのリモートリポジトリをローカルフォルダーに置く

以下のようなとき、この方式の使いでがあると思うからメモっとく。

  • リモートリポジトリのしくみを学習中だったり、WindowsのLAN内で完結する作業で、わざわざGitサーバーを置くほどでもない場合。
  • またはGitHubとかクラウドのリモートリポジトリが会社のポリシーとかで禁止されてる場合。

自分はリモートリポジトリの学習するときもっとワンタッチでリモート置けないかと思って調べたらこの方式があった。今までGitHubべったりでちゃんと学習してなかった。

結論

ここにやり方が書いてある。→ Git - プロトコル

終わり。

せっかくなのでサンプルケースを設定し詳細手順を

サンプルケースと手順の概要

ここではサンプルケースととしてC:\dev_repo 以下にローカルリポジトリとリモートリポジトリを作る。そしてローカルでやった作業をリモートにpushするまでをコマンドで示します。
※dev_repoフォルダーはもう存在してるつもり。

次の7手順がこの記事に書くすべて。

  1. ローカルリポジトリ用フォルダーを切る。フォルダー名はtestとする
  2. ローカルをinit
  3. ローカルで何か作業をする
  4. リモートリポジトリ用フォルダーを切る。フォルダー名はtest.gitとする
  5. リモートをinit
  6. ローカルがリモートを参照できるようにする
  7. push
↑の詳細手順

まずコマンドプロンプトを起動。

1.

C:\> cd dev_repo
C:\dev_repo> md test

2.

C:\dev_repo> cd test
C:\dev_repo\test> git init

3.

C:\dev_repo\test> echo hello,world > hello.txt
C:\dev_repo\test> git add .
C:\dev_repo\test> git commit -m "initial commit"

4.

C:\dev_repo\test> cd..
C:\dev_repo> md test.git

5.

C:\dev_repo> cd test.git
C:\dev_repo\test.git> git init --bare --shared=true 

6.

C:\dev_repo\test.git> cd ..\test
C:\dev_repo\test> git remote add origin file:///c:/dev_repo/test.git

7.

C:\dev_repo\test> git push -u origin master

ローカルフォルダーにリモートリポジトリができました。めでたしめでたし

  _
  \ヽ, ,、
_  `''|/ノ
\`ヽ、|
 \, V
    `L,,_
    |ヽ、)                ,、
   .|                   ヽYノ
   /                     r''ヽ、.|
  /        ,.. -──- .、    `ー-ヽ|ヮ
 .|      , ‐'´   __     `ヽ、  `|
  |    / , ‐'"´       ``''‐、  \  |
  |   / /             \ ヽ |
  ヽ,  y'   /` ‐ 、    ,.. -'ヘ   ヽ. }ノ
   ヽ,'     /   /`,ゝ' ´     ヽ   Y.
.    i    ,'     { {        ヽ   `、
    l    ,イ─- 、.._ ヽ ,, _,.. -─:}   !
.    |  r‐i| ー=ェェ:ゝ ,.∠ィェェ=ー' |r 、.  l
   |  {ト」l|.      : | "    ``: |!トリ  |
.  │  ヽ、|      ;.」_      |'ソ    !
.  │     ヽ      r──ッ    /ノ    |
    |      lヽ    ̄ ̄     / イ    │
.    !    丶ヾヽ    ~   , ' ノ │   !
    ト.    ミ.ゝ ヽ.____./  /  l   /
    ヽ  ヽ           イ ,' / , '  ┼ヽ  -|r‐、. レ |
     \.             ノレ'/    d⌒) ./| _ノ  __ノ

ActiveRecordでDB更新したらログ吐かせたい

データの変更とか追いたいから、モデルがsaveされる(DBが更新される)ごとにログ吐くようにする。

以下2手順にて実現

1.モデルの共通的なベースを作る(前準備)
2.ベースのafter_saveフック内でログを吐かせる(やりたかったこと)

もっといい方法あるかもし、このやり方がうまげって保証無し。

手順1.モデルの共通的なベースを作る(前準備)

まずモデルにアプリ内で共通的に使う拡張機能を付ける。
このやり口はやっとくと便利な取り組みだと思ってる。開発とか数件しかしたこと無いけど。

ここでやることは2種類

concernという仕組み使ったモジュールを書き、これをアプリの標準的なモデルに取込ませる。

やること1.concern例:

共通の機能はActiveSupport::Concernを継承したモジュール書いてそれにメソッドとか定義。

models/concerns/regular_model.rb

# このアプリの共通的なモデル拡張
module RegularModel extend ActiveSupport::Concern
  def common_method
    # 何か共通的な処理
  end
end
やること2.model側の取込み例

modelのコードに以下の「これ」を追加。→ concernで定義した機能をmodelが持つ!

class Unko < ActiveRecord::Base
  # ↓これ
  include RegularModel
end

手順2.ベースのafter_saveフック内でログを吐かせる(やりたかったこと)

先にコード例。そのあと補足1点。

models/concerns/regular_model.rb

# このアプリの共通的なモデル拡張
module RegularModel extend ActiveSupport::Concern
  included do
    after_save :after_save_log
  end

  def after_save_log
    logger.warn "#{Time.now.localtime.strftime('%H:%M:%S')}#{self.class.name}が更新されました。" # ← ログ出力
    self
  end
end
補足1.includedてなんなの

ペラペラのモデルにフック書くなら

after_save :method_name # メソッド名シンボルを書く

でいいはずなのだけども、この方式はそのままconcernには持ち込めない。
includedで囲ってやる必要がある。

ruby on rails - Is it possible to define a 'before_save' callback in a module? - Stack Overflow

included do
  after_save :method_name
end

複数のWebページを巡回して自動でスクショとりたい

CrenaHtml2jpg というソフト

Windows環境下で手早くて有用そう。
GUIコマンドラインからWebページのスクリーンショットが取れる。

www.picolix.jp

作業を楽にするため、コマンドライン用に自動化バッチファイルを書いた

自動化ソフトの更に自動化。

getss.bat

@echo off
setlocal

for /f "tokens=1,2 delims= " %%a in (url.txt) do (
  CrenaHtml2jpg -o%%a -fjpeg -w1920x1080 -s1920x1080 -l5 -p -q92 -t25 -u%%b
)

endlocal
exit /b

バッチ使い方

getss.bat と 同じフォルダーに url.txt というのを置いて、

1.jpg http://www.yahoo.co.jp
2.jpg http://www.google.co.jp

みたいな感じで画像ファイル名+半角スペース+URLを記述して保存。

> getss.bat

課題

ログインを要求するサイトには何か別のしくみがひつようなのかな

参考にしたサイト

stackoverflow.com

はてブにMyベストタグを作った

あとで読み返してすごがるとかうけるために「○○Myベスト」というタグを置いた。それだけです。
たとえば雑学とかエロとか。

はてブの読み返したさを管理するいい方法ないかなー。。

雑学Myベストに関するkiyo_hikoのはてなブックマーク
エロMyベストに関するkiyo_hikoのはてなブックマーク

Rubyでゼロ埋め文字列 (printf %0s的な何か)

なんとなく必要になって書きました。

def printf_0n(n, str)
  n <= str.length and return str
  "#{1.upto(n - str.length).map{0}.join}#{s}"
end

旅行(2) 計画2~広島旅行前半

年末年始の広島旅行記

旅程の計画は画像のようになった。
計画してすぐ出発したから、既に旅程の半分ぐらいに差し掛かりつつある。
10連休ぐらいあれば1週間ゆっくり止まりたかったけどさほど日数がなく、4泊の行程でただいま2泊めである。

旅程の計画の画像

日程に関わる部分だけ抜粋

f:id:kiyo_hiko:20170101225305p:plain:w200:left
f:id:kiyo_hiko:20170101225316p:plain:w200:left

前半の行動と感想

初日:12/31

初日は朝、モサッと起きてのぞみ乗って広島駅に降り立った。

着いたのが14時ぐらいであるが、ホテルのチェックインは15時であることが事前にわかっており、本当はそれに合わせて着きたかった。
新幹線予約がギリギリだった弊害である。なるべく早く予約しないとダメだな。。

暇つぶしにいきなりゲーセンに行く(ダメ人間)。
その後駅至近のホテルにチェックインし、夕方市内散策。
徒歩で白鳥→広島城原爆ドーム平和記念公園と歩き回り、アーケード街のフタバ図書で買い物したりして帰投。
あと路面電車って歩行者的にはどう相手をすればいいのかわからなくてビビっていたけど、だいたい車と同じような感じで信号で停まったり?していたし特に気にしなくていいことわかった。広島市街を3時間ぐらい歩いた。

漫才とかクイズサバイバーとか笑ってはいけないシリーズ見たりしてゲラゲラしてたら年が明けた。めでたい。
ベッドで気がついたら寝ていた。

2日目:1/1

尾道行くつもりだったが午前中超寝てしまって行動開始タイムとか13時だったし呉に行くことにした。

f:id:kiyo_hiko:20170101153231j:plain:w400

往路はgoogle:image:227系でかっこよかった。
歴史の見える丘に徒歩で行って大和ミュージアム見学してフラフラしてた。展示内容が充実しすぎてて午後から行くと全然時間足りないこと判明した。
駆け足で回ってしまい、いつかちゃんとフルでみたい。

  • 企画展示で写真技術とかやってた。
    • ベスト・ポケット・コダックとか国産のコピー製品?とかあった
  • 呉の歴史とか見た
  • 金剛の缶?とかあった
  • 艦船模型いっぱいあった。高雄。ちょうど夕日が差して、壁に艦橋のシルエットが映ってかっこよかった。

f:id:kiyo_hiko:20170101163127j:plain:w400

  • 1/10大和

f:id:kiyo_hiko:20170101160019j:plain:w400

  • 人との比較でスケール感

f:id:kiyo_hiko:20170101163808j:plain:w400

あと歴史の見える丘行ったらDDH-182「いせ」が見えた。

f:id:kiyo_hiko:20170101144524j:plain:w400

そのあとフタバ図書で本見たりしていた。クルーズとかあったけど行けなくてショックを受けた。
帰りは黄色い各駅停車で帰った。呉駅のホームが超寒かった。呉市街+ミュージアムと緑地?を4時間ぐらい歩いた。

f:id:kiyo_hiko:20170101165534j:plain:w400

潜水艦の下にハルヒ痛車が居た。

f:id:kiyo_hiko:20170101151755j:plain:w400

夜になったら脚にガタが来てて辛くなった。モウ歳なんで今後旅行とかあれば歩く距離とかも検討する必要がありそう。
あるていどゲーセンで遊んで帰投。