Linuxでディレクトリ内のファイルの中身を一括変換する方法
任意のディレクトリ内のファイルの中身を一括変換するには以下のコマンドを利用する。
find . -type f | sed -i -e "s/変えたい文字/変換後の文字/g"
scriptやscreenコマンドでログに挿入されたラインフィールドやバックスペースを削除する方法
scriptやscreenコマンドを利用した場合、制御コード(ラインフィールドやバックスペースなど)も一緒にログとして残る。
この際、ラインフィールドやバックスペースは以下のように削除することができる。
col -bv < 変換前ファイル > 変換後ファイル
複数Excelファイルの一括置換ツール作成
以下のサイトを参考にVBAを使って一括置換ツールを作成します。
- やりたいこと
- 置換リストの作成
- 複数ファイルの一括置換
* 置換リストの作成 以下の画像のようにリストを作成
構成は
- 1列目:置換したいファイル名
- 3列目:置換したい文字
- 5列目:置換後の文字
* 複数ファイルの一括置換 作成したVBAのツールは以下のとおり。
Sub replaceStrFromFiles() Dim book As Workbook Dim sheet As worksheet Dim filename_fullpath As String ' ファイル名(フルパス) Dim filename As String ' ファイル名 Dim tmp As Variant Dim row_list As Long Dim row As Long Dim find_str As String Dim replace_str As String find_str = Cells(1, 3) replace_str = Cells(1, 5) ' リストの先頭から最後まで繰り返す For row_list = 2 To Cells(Rows.Count, 1).End(xlUp).row ' ファイル名を取得 filename_fullpath = Cells(row_list, 1).Value ' フルパスからファイル名を抽出 tmp = Split(filename_fullpath, "\") filename = tmp(UBound(tmp)) ' ファイルをオープンする Workbooks.Open (filename_fullpath) ' オープンしたブックをアクティブにする Set book = Workbooks(filename) ' 保存時の警告を非表示にする book.CheckCompatibility = False 'すべてのシートに対して操作を行う。 For Each sheet In book.Worksheets For row = 1 To Cells(Rows.Count, 1).End(xlUp).row Cells(row, 1) = Replace(Cells(row, 1), find_str, replace_str) Next Next '保存して閉じる Workbooks(filename).Close SaveChanges:=True Next End Sub
モジュールを作成したら、先ほど作ったリストのボタンに登録する。
sample1.xlsx が以下のようなとき
置換ツールを実行すると
となります。
これを応用すれば列だけでなく行の変換も可能
Railsのredirect_to user
最近勉強しているRailsの1コード
redirect_to user
このコードをcontroller上で記述し、実行すると自動的に以下のURLへのリダイレクトだと認識してくれる。
user_url(user)
user_url(user)は現在参照しているuserのshowページ。
IFTTTとLine message apiとの連携
以前、Line botの作り方を示しました。Line botはLine message apiを利用して実現しています。
さて、この場合はLineから送られてきたメッセージに何か返答をすることができますが、Line@の管理者からは能動的に何か送ることはできません。
実際はLine@から何か送りたい場合があると思います。例えば、IFTTTというサービスと連携させてLine@に何か投稿したいとか。
ちなみにIFTTTはネットワークのサービスを連携させるサービスです。例えば、Twitterに投稿した内容をFacebookにも投稿するとか、Flickrで投稿した画像をTwitterとFacebookとInstagramにそれぞれ同じものを投稿する。または投稿の際にLineやGmailで通知を送るなどです。具体的には以下のサイトを参考にしてください。
http://hoomey.net/ifttt_study_1/
今回はそのやり方を紹介します。
今回やること
Flickrで投稿した画像をLine@でも投稿する
ただし、IFTTTを利用する場合Flickrの投稿をIFTTTを通して直接Line@に投稿することはできません。
Flickr -> IFTTT -> Maker -> 用意したサーバー -> Line@
の順に情報を送ります。
そのためにIFTTTでの設定以外にサーバーを準備し、その中で動くサ―バープログラムが必要になります。 サーバーはLine botの作り方を参考にしてください。また、サーバーからLine@にリクエストを投げるのもほとんどLine botのプログラムを流用することでできます。
1. IFTTTの設定をする
まずはIFTTTの右上にある自分のアカウント名をクリックし、さらに「New Applet」を選択してください。
次に、「This」を選択します。
選択後出てくる検索画面で「Flickr」と入力し、表示されたFlickrアイコンを選択します。
ここではFlickrに画像が何か投稿したら何かアクションをしたいので、「Any new public photo」を選択して下さい。
次に、「That」を決めていきます。
検索画面で「Maker」と入力し、表示されたMakerのアイコンを選択します。
次の画面では選択肢はひとつしかありません。
最後にMakerでどのようなリクエストをサーバーに送るか設定します。
自分のサーバーのURL。Line botで作ったサーバーと同じものを使うなら
https://自分の作成したアプリ名.herokuapp.com.:443/callback
Post
application/json
設定ができたら、「Create action」を選択し、最後に「Finish」を選択してIFTTTの設定は終了になります。
サーバープログラムの作成
require 'line/bot' module Line module Bot class HTTPClient def http(uri) proxy = URI(ENV["FIXIE_URL"]) http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port, proxy.user, proxy.password) if uri.scheme == "https" http.use_ssl = true end http end end end end class WebhookController < ApplicationController protect_from_forgery with: :null_session # CSRF対策無効化 def client @client ||= Line::Bot::Client.new { |config| config.channel_secret = ENV["LINE_CHANNEL_SECRET"] config.channel_token = ENV["LINE_CHANNEL_TOKEN"] } end def callback body = request.env["rack.input"].gets message = { type: 'image', originalContentUrl: body, previewImageUrl: body } client.push_message("ここはUser Id", message) render status: 200, json: { message: 'OK' } end end
User IdはLine@に紐づいたIDです。 ちゃんとした調べ方が分からなかったので以前作ったLine botプログラムを動作させた際に、受信したリクエストのBodyをまずputs関数で表示させました。 そして、表示させたものからUser Idのタグを探し、ID番号を抽出しました。その値を使っています。
結果としてFlickrで画像を投稿したら
以下のようにLineにも投稿されます。