ゆるこあプログラミング

新卒社員がプログラミングとたたかう

perlでExcel for macを操作する

Excel苦手です。

perlでちゃかちゃかどうにかならないか
挑戦してみます(`・ω・´)ゞ

% sudo perl -MCPAN -e shell
CPAN> install Jcode
CPAN> install Unicode::Map
CPAN> install Spreadsheet::WriteExcel
CPAN> install Spreadsheet::ParseExcel

これで使えるはずです。
簡単なプログラムで試してみます。

#!/usr/bin/perl

use strict;
use warnings;

use Spreadsheet::WriteExcel;

print "Content-type: text/plain\n\n";
my $workbook = Spreadsheet::WriteExcel->new("perl.xls");

exit;

プログラムが置いてあるカレントディレクトリに
perl.xlsが作成されたかと思います。


細かい使い方はこちらのサイトに書いてありました
http://homepage3.nifty.com/hippo2000/perltips/Spreadsheet/WriteExcel.htm


テキストファイルから読み込んでシートに反映、とかしたい

がんばる\\٩( 'ω' )و //

Perlにおけるクラスメソッドとインスタンスメソッドの違い

オブジェクト指向,面倒ですよね.

学生時代はProcessingを手続き型で書く程度だったので
未だによくわかってません

そして,オブジェクト指向ではないPerlならではの
独自的な用語が用いられるため,ほんとさっぱりです.

一般的なOOP Perl 別名
クラス パッケージ -
メソッド サブルーチン -
インスタンス データ構造 オブジェクト

とんでもなくややこしいですね…

以下はメモなのでこの記事は参考になりません

続きを読む

オブジェクト指向設計の原則 とは

以下はメモなので参考になりませんです
勉強される方はここ(http://hamasyou.com/archives/000210)とかお勧めです.

------

オブジェクト指向について考える際に
私が今悩まされているPerlに限らず,プログラミング全体で
共通の設計思想があります.

それがオブジェクト指向設計の原則です.


Perlは非常にオブジェクト指向に不向きで
この言語だけで考えてしまうと,混乱しがちです…

なので広い範囲での概念を学ぶことにします.

クラス設計に関する原則

オブジェクト指向設計の原則というと多くあるようなのですが,
まずは基本から…

  • 単一責任の原則
  • オープン・クローズドの原則
  • リスコフの置換原則
  • 依存関係逆転の原則
  • インターフェイス分離の原則

それぞれ順番に見て行きましょう.

単一責任の原則

クラスが存在する理由が複数あってはならない

たとえば,ひとつのクラスの中に全く志向の違うメソッドが存在していること.
ひとつのクラスには,ひとつの役割だけ与えていればおっけー.
会員登録クラスがあったとして,
その中に登録,編集,退会,お気に入り…そんなに盛り込むのは良くないことです.

オープン・クローズドの原則

ソフトウェアの構成要素は拡張に対して開いていて,修正に対して閉じていなければならない。

拡張性あるコードな一方で,修正した場合の影響範囲をなるべく狭く狭くする.

  • 開かれている:モジュールの拡張が容易
  • 閉じている:モジュールの中身を変更しても他のコードに影響を出さない

ベースクラスを用意して,それに最低限の動作を保証してもらうのが良いのでしょうか.

リスコフの置換原則

派生型はその基本型と置換可能でなければならない

…う…ちょっと解釈に詰まる文章ですね.
ベースクラスにあるメソッドと,あくまで形式が同一の子クラスであるべき?
ってことでしょうか.

依存関係逆転の原則

1. 上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも「抽象」に依存すべきである
2. 「抽象」は実装の詳細に依存してはならない。実装の詳細が「抽象」に依存すべきである

いい感じに分からなくなってきました.

インターフェース分離の原則

すべてのインターフェースを一つのクラスに押し込めてしまうのではなく、関連性を持ったインターフェースはグループ化し、抽象基本クラスとして分けて利用すべき

関連性のあるインターフェイスをグループ化する
ここで言ってるインターフェイスってなんだ


わからない_(┐「ε:)_

untracked contentというメッセージ

git statusをしたときに,こんなメッセージが出てきました.

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	core_hoge/
nothing added to commit but untracked files present (use "git add" to track)

原因はよくわかりませんが,
このままだとgithub上で見た時にフォルダの中身を追うことができません.
一回キャッシュを消してaddしなおしましょう.
# 以下の作業をする前に,一度commitをしておかないとファイルが消えます…

$ git rm --cachedgit core_hoge/
$ git add core_test/
$ git satus

今度はファイルの中身が緑色で表示されたと思います.

ある時点のcommitの状態に戻す

特定のSHAを指定して,その時までローカルを戻す

git logなどすると,過去のcommit情報が見えるので
任意の時点のものを選びます.

$ git revert <対象のSHA>
[master 8c62542] Revert "latest_130820_1052"
 9 files changed, 28 insertions(+), 617 deletions(-)
 delete mode 100644 hoge.txt

もしコンフリクトしてしまった場合…

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#	modified:   hoge_dir (modified content)
#
no changes added to commit (use "git add" and/or "git commit -a")

対象のディレクトリに移動してからcheckoutすると治ります.

$ cd hoge_dir
$ git checkout .
$ cd
$ git status
# On branch master
nothing to commit, working directory clean
ローカルでrevertした変更を,リモートにも反映させる

さて,そのあとリモートにpushしようとしたら
最新のcommitとコンフリクトしてしまいました.

$ git push origin master
To git@***.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@***.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

ふむ.
エラーでぐぐると下記のような方法が見つかりますが,

【git】git pushがrejectされたときの対応方法 at softelメモ
http://www.softel.co.jp/blogs/tech/archives/3569

今回はリモートの最新のcommitの状態をpullしたくないので

強制的にpushします.

$ git push --force origin master
Counting objects: 51, done.
Compressing objects: 100% (26/26), done.
Writing objects: 100% (28/28), 3.23 KiB, done.
Total 28 (delta 15), reused 1 (delta 0)
To git@***.git
 + 56d0ff4...8c62542 master -> master (forced update)

リモートで確認して,反映されていればおっけーです.

ちょっと便利なfind,grepコマンドの応用

備忘録的にまとめておきます.

  1. カレントディレクトリ以下で,対象とする文字列を含むファイル
find ./ -name "*.*" -exec grep -l "hoge" {} \;

# ちなみにこれでも同様の結果が得られます
grep -R "hoge" * | awk -F":" '{print $1}' | sort | uniq

# 該当行を抜き出したい場合はこう記述
grep -R hoge ./
  1. カレントディレクトリ以下の該当文字列を置換する
find ./ -name "*.*" -type f | xargs sed -i "s/hoge/moge/g"

ちょっとずつ増やしていこう.

ローカルで実行したファイル削除を,GitHubに反映させる

ローカルでファイルを削除した時に
リモートに既にpushしてしまっていると,
ブラウザから見た時に

削除したはずのファイルが消えていません_(┐「ε:)_

[core@localhost ~]$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	deleted:    Downloads/test/test.txt
#	deleted:    hoge/memo.txt
#
no changes added to commit (use "git add" and/or "git commit -a")


git statusでみてみると,残っていました.
これはgit rm 対象ファイル名で削除することができますが

たくさんあるときは次のようにして一気に消しちゃいましょう.

[core@localhost ~]$ git add -u
[core@localhost ~]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	deleted:    Downloads/test/test.txt
#	deleted:    hoge/memo.txt
#
[core@localhost ~]$

もしgitの設定で文字に色をつけていた場合,
今青色に見えている部分は赤から緑に変わったかと思います.

[core@localhost ~]$ git commit -m "cleanup"
[master e736ac7] cleanup
 16 files changed, 541 deletions(-)
 delete mode 100644 Downloads/test/test.txt
 delete mode 100644 hoge/memo.txt
[core@localhost ~]$

あとはpushをし,もう一度git statusで確認をして
以下のように表示されたら,ローカルに反映されていると思います.

[core@localhost ~]$ git status
# On branch master
nothing to commit, working directory clean
[core@localhost ~]$