Translate

BTemplates.com

Powered by Blogger.

ラベル 正規表現 の投稿を表示しています。 すべての投稿を表示
ラベル 正規表現 の投稿を表示しています。 すべての投稿を表示

2021年3月11日木曜日

2021-03-11 到達点メモ


ブログ記事を書くのがあまりにも久しぶりすぎる・・・。

普通に操作しているとフォルダの中の合計がわかりにくいので、フォルダのそれぞれのサイズ一覧を一括でわかるようにしたかった。

ひとまずRubyで実装はできたのだが、この記事を書く際にふと気になって調べてたら、(見にくいが)PowerShellでも普通にできます・・・。

Get-Childitem -Path ./ -Directory | ForEach-Object -Process{Write-Host $_; Get-Childitem -Path $_ -Recurse | Measure-Object -property length -sum | Format-List sum}

参考サイト:[備忘録]Windoes10:フォルダ毎の容量を調べる方法 | CEOブログ 


まぁ、見やすさ重視だったので一応無駄ではない
最近、全然コードを書いていなかったから、書いておきたかったし・・・。


■ 躓いたところ

・コマンドライン引数でWindowsのフォルダパスを渡したら、何も取得できなかった。

-理由
今回はDir.glob使用しており、Dir.globにパスを渡すさいは、"C:/php/dev"といったふうに、"/"でないといけない。しかし、Windowsのパスは"\"のため、そのまま使うとだめだった。

-対処方法
 File.expand_path()を使うか、.gsub(/\\/,"/") で変換するかで対応できる


・コマンドライン引数でテスト時のフォルダパスだとできたのに他のフォルダパスだとできなかった問題

-理由
フォルダ名に半角スペースが入っており、データの取得がARGV[0]で行ったため、半角スペース以降の文字列が別の配列のデータに格納されてしまったため。

-対処方法
コマンドライン引数で渡す際に、””で囲むようにした。結合とかも一瞬考えたが、オプションを半角スペースで区切って渡すのが、本来の仕様だと思うので、それに従ったほうが良いと思ったため。


・フォルダ名:サイズKBの形式にし、文字数に応じて半角スペースで埋めて揃えようとしたところ、日本語が入るとばらばらになってしまった。

-理由
半角文字と全角文字を考慮していなかった。むしろ、最初は日本語をどう見つけるか、もしくは省くかを考えてしまい、半角文字と全角文字という区分に気がつくまでに時間がかかった。

-対処方法
考え方としては半角文字を1とし、全角文字は2とした。
Rubyの仕様だと、半角全角関わらず単純に文字数を数え上げてしまうようなので、半角英数字記号以外を数えて、それを足すことで解決した。
半角カタカナには対応していないが、使われるケースは稀と考えたので今回は考慮しなかった。


・Googleで正規表現 半角英数字記号で調べたら、/^[a-zA-Z0-9!-/:-@¥[-`{-~]*$/とでてきたので、/の中身をそのまま使った。後で気がついたら、なんでこれで全角文字が判別できているんだ?

-理由
Rubyでは^は否定表現である。
参考サイト:正規表現 (Ruby 3.0.0 リファレンスマニュアル) 

-対処方法
今回はふと疑問に思ってテストコードを書いたら発見できた。というか、そもそもちゃんと公式ドキュメントを読もう。


■実装する際に参考にしたサイト

Rubyでコマンドライン引数を取得する方法:ARGV | UX MILK
Rubyでディレクトリを一覧表示する方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン
Rubyでディレクトリの中のファイル一覧を取得 – かひわし4v1.memo

 

GitHubに上げるまでやりたかったが、力尽きたので今日はここまで。

2019年8月31日土曜日

2019-08-24 、26、27 、30 到達点メモ


正規表現で否定形を使いたい
(?!TEST)

上記のようにすると検索にTESTを含まないようにすることができる
なので、例えばTESは含むけどTESTは含まないとかしたい場合は

^(?!TEST)^(TES)

とすれば行けるはず

駄目だった
また今度参考サイトをちゃんと読みなおす

参考サイト:正規表現:文字列を「含まない」否定の表現まとめ | WWWクリエイターズ

条件を満たしたときにチェックボックスにチェックを入れる事に成功した。
どうやらnameとvalueを両方見なくても、条件が一致すれば操作できるようである
なぜかnameのほうで[]があり、上手く指定できなかった。
そのため、今回はvalueの方を指定して、チェックボックスにチェックを入れた

 $ ('[value="テストチェックボックス1"]').prop ('checked', true);

本来であるならば、恐らく重複を防ぐためにnameの方も指定しているのだろうが
今回でいえば、重複が起こる可能性は限りなく低いとみているのでこのままでいく。

どうも動的に作られたクリックできるボタンが上手くクリックイベントを起動させることができない。
どっかでそういう問題を見た記憶があるが、追加されたタグを削除することで対処ができたので良しとする。
今回は.remove()で対処した。同じタグをすべて消すことができる

$('.testDeleteTag').remove();

参考サイト:jQueryでDOM要素を削除する:remove(), empty(), unwrap(), detach() | UX MILK

配列の全部検索はforEachでもできるが、下のサイトによるとどうやら非推奨らしい。
コードを見た時にこれは一体何なのか?ということをわかりやすくするためらしい。

参考サイト:JavaScript で forEach を使うのは最終手段 - Qiita

実際、別にforEachに拘っているわけではないので
mapで書いてみたところ、書けたのでそれで良しとする


var categories = [
'test1',
'test_nononaga',
'testetstetst',
'Hogehoge',
'ホげほげ',
'その他',
];
categories.map (category => {
var tempValue = '[value="' + category + '"]';
$ (tempValue).prop ('checked', false);
});

参考サイト:Array.prototype.map()  by Mozilla Contributors is licensed under CC-BY-SA 2.5.

例えば、以下のタグがあるとして
hrefのデータを取得したいとする。
<a class="test_a_tag" href="https://www.nononagainfo.com/">
nononagaInfo
</a>

この場合は以下のように書けばよい
$ ('.test_a_tag').attr ('href');

参考サイト:jQueryのhref属性を取得する - コードログ

ajaxで色々やる際に参考にしたサイト
参考サイト:はじめてajaxを使うときに知りたかったこと - Qiita

新しくタブを開きたい場合は、以下のようにやればよい
window.open (urlData);

参考サイト:window.open  by Mozilla Contributors is licensed under CC-BY-SA 2.5.

たかだか、全部のタブを調べるという作業で何でこんなに迷走しているのか・・・。
問題1.background.jsでないと、 chrome.tabs.queryを使用することができない

問題2.contentsとbackgroundでデータのやり取りをするのだが
後述する問題3のこともあり、今一やり方がよくわかっていない・・・。

◆参考サイト
try catch and ...release: Chrome拡張機能のbackground.jsとpopup.jsで通信

問題3.google翻訳によるものなのでどこまで正確なのかはわからないが
どうやらチャンネルを開く前にrunetime.connect() を呼び出すとエラーになるらしい。
というか特定のバージョンからそのようなので、古い奴のコードだと普通に動かない

◆参考サイト
How to Fix: Could not establish connection. Receiving end does not exist - Bennett Notes


◆その他参考に成りそうなサイト
Chromeの拡張機能を作ってみる Vol.3 実装
僕が考えたChrome拡張機能を作るときのデザインパターン


content_script.jsでchrome.runtime.sendMessage()を使い
background.jsでchrome.runtime.onMessage.addListener()を書いているのに
ずっーーーーと、Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.というエラーがなぜ起こるのかがよくわからなかった。

調べたところ他の拡張機能が干渉して起こるケースもあるらしいのだが
今回に限って言えば、これ以外全部動かないようにしていたので
これが原因では無かった。

色々調べた結果、どうやらマニフェストファイルに、
"background": {
    "scripts": ["src/js/background.js"]
  },
という記述が無かったのが原因のようだった。

また、自分が変更の処理を行った場合、
画面更新で対処していたのだが、background.jsやマニフェストファイルは
其れでは対応できない。

なので、下の画像のように拡張機能のページ(chrome://extensions/)のエクステンションの更新ボタンをクリックしてやるのが一番確実。









◆参考サイト
Message Passing - Google Chrome

かえせよっ!おれのじかんっ!かえせよっっ!!!


他に躓いたところとして、二つあって
一つはtabの一覧のURLを取得する方法はかなり苦労した。

chrome.windows.getAllの方法で実装する方法を発見した。
例えば、getAllの時にpopulate:trueを設定しないと
必要なものが取得できなかったり、
返り値がwindowsという複数形だという事に気が付かなくて
大分悩んだりとか、本当に色々大変だった。

◆参考サイト
javascript  ー  Chromeで開いているタブを取得する - コードログ
chrome.windows - Google Chrome


ただ、全てが終わってこれを書いているときに検証してわかったのだが
chrome.tabs.queryでやったほうが簡潔だし
わかりやすかった・・・。

実装例
  chrome.tabs.query ({}, function (tabs) {
    var urls = '';
    tabs.map (tab => {
      console.log (tab.url);
    });
  });


かえせよっ(以下ry

前にやchrome.tabs.queryで出来ていたと思っていたのですが
できなかったのでchrome.windows.getAllの方法でやっていました・・・。
出来なかったのは、マニフェストファイルのpermissionsの中にtabsが
無かったのが原因だったのかもしれません。

もう一つは、何度通信ができても値が初期値しか返ってこないことがあった。
具体的には以下のように書いていた
  var urls = '';
  chrome.tabs.query ({}, function (tabs) {
    tabs.map (tab => {
      urls += tab.url + '</br>';
    });
  });
  sendResponse ({
    urls: urls,
  });

どうも、console.logで調べた感じだとchrome.tabs.queryしかり、chrome.windows.getAllは非同期で動いているらしかった。
おそらく、値が取得できていない状態でsendResponseが動いたので
空データしか受け取れない状態になっていたと思われる

それを踏まえた上で、今回は以下のように修正した。
具体的には、chrome.tabs.queryの中に、sendResponseを含めることにした。
  chrome.tabs.query ({}, function (tabs) {
    var urls = '';
    tabs.map (tab => {
      urls += tab.url + '</br>';
    });
    sendResponse ({
      urls: urls,
    });
  });

今回はこれで解決できたが、複数動かすものとか考えるとこれだと
明らかに問題が起こる。
thenについてちゃんと調べておかないと・・・。

◆参考になりそうなサイト
Promiseを使う  by Mozilla Contributors is licensed under CC-BY-SA 2.5.

今回の開いているタブのURLを取得するChrome拡張をつくったので
それをGitに上げときましたので参考にしたい方はどうぞ
https://github.com/nononaga/myExample/tree/master/getTabUrls

単独記事を作ろうと思ったが、力尽きたので今日はここまで。


2019年8月21日水曜日

2019-08-09 08-17 08-20 08-21 到達点メモ


今回は、沢山ある<li>の中から<h3>のデータを取得し
その中でNGワードがあるものを非表示にするやり方

$ ('li').each (function (index, val) {
var tempDOM = $ (val);
var tempRegExp = new RegExp ('NGワード|禁止ワード');
var searchText = tempDOM.find ('h3').text ();
if (searchText && searchText.match (tempRegExp)) {
var searchID = tempDOM.attr ('search_id');
var hiddenElem = $ ('[search_id="' + searchID + '"]');
hiddenElem.attr ('hidden', true);
}
});

まず、$ ('li').eachで<li>のデータを取得できるようにし
これは、そのままだとhtmlデータが入ったテキストのままようなので
これを以下のようにセレクタにしてあげます。
var tempDOM = $ (val);

◆参考サイト
jQueryのeach()メソッドの基本的な使い方
jQueryのセレクタ解説 - SMART 開発者のためのウェブマガジン


matchで使うようにRegExpを作ります。そのまま書いてもいいのですが
今後、NGワードが増えていくのでこちらの方が見やすいと思ったので
こういう形にしました。
var tempRegExp = new RegExp ('NGワード|禁止ワード');

◆参考サイト
【JavaScript】~を含むかのチェック - Qiita


次にtempDOMのh3タグを見つけたいので、findで検索します。

今回は、構造上非表示にしたい<li>タグにsearchIDという属性があったので
これで対処しましたが、場合によっては他の方法を考える必要があります。
なお、searchIDのデータを取得したい場合は、以下のように指定します。
var searchID = tempDOM.attr ('search_id');

◆参考サイト
jQuery 属性値を取得/設定するサンプル(attr) | ITSakura
.attr() | jQuery API Documentation

属性の値で検索したいので以下のように設定します。
var hiddenElem = $ ('[search_id="' + searchID + '"]');

◆参考サイト
【jQuery】data属性に特定の値を持つ要素を指定する方法。


対象のliを非表示にしたいので以下のように設定します。
hiddenElem.attr ('hidden', true);

◆参考サイト
HTMLタグにhiddenを付ければ内容を非表示にできる | iwb.jp

*jQueryで、フォームに入力された値を取得したい場合

//間違い
$ ('.hogehoge_get_form_text').text ();

// 正解
$ ('.hogehoge_get_form_text').val ();

◆参考サイト
jQuery: フォーム要素からの入力値を取得するには?(val) - Build Insider


*jQueryで、labelの属性forを指定したい場合

$ ('label[for="hogehoge_point_label_for"]')

◆参考サイト
javascript-jQueryラベルの'for'属性セレクタ - コードログ

Ajax.getでURLからデータを取得しようとしたところ、コンソールログで以下の様なエラーが出た
jquery.min.js:2 Cross-Origin Read Blocking (CORB) blocked cross-origin response https://HogeHoge.JP with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.

今一状況は飲み込めていないのだが、意図しないアクセスを防ぐために
クロスドメインという仕様があるらしい。
ただ、MDNの方を読む限りでは、オリジン間リソース共有というのが正しい単語のように思える。うーん・・・。

◆参考サイト
オリジン間リソース共有 (CORS)  by Mozilla Contributors is licensed under CC-BY-SA 2.5.
JavaScript のクロス ドメイン (Cross-Domain) 問題の回避と諸注意 - tsmatz
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. が出る。 - ミノタケ日記。
Cross-Origin Resource Sharing(CORS)を使用したHTTPリクエスト | 69log
An In-depth Look at CORS ー SitePoint

◆リクエストを調べる際に参考にしたサイト
cURLコマンドでレスポンスヘッダのみを取得する - Qiita

色々模索してみましたが正直よくわからねぇ・・・。
ただ、今回のケースでいえば、Chromeの仕様の影響が大きい様だったので
起動オプションで無効化のコマンドを使った方が解決として早かったです。

◆参考サイト
クロスドメイン制約を回避するChromeショートカットを作る - Qiita


チェックボックスにチェックを入れたい場合は、以下のようにする
$ ('input[type=checkbox][name=test_is_checkbox]').prop (
     'checked',
      true
 );
チェックを外したい場合は、trueをfalseに変えればよい。

ラジオボタンでチェックを入れる場合は、propでやったほうが良い。
何故かというと、以下のようにvalueの値が数字でない場合があるから。

$ ('[name=test_user_status][value=nononaga]').prop ('checked', true);

◆参考サイト
【jQuery】フォーム部品の取得・設定まとめ - Qiita

正規表現で特定文字列から一番最後まで削除したい場合は以下のように書く
今回はURLのパラメータやプロパティを削除したい時に利用した

url = url.replace (/(#.*$)|(\?.*$)/, '');

◆参考サイト
<a>: アンカー要素  by Mozilla Contributors is licensed under CC-BY-SA 2.5.
正規表現:「行頭」「行末」の表現と、応用例 | WWWクリエイターズ


ボタンクリックを使いたいと思っていたが、思った以上に実装が簡単だった。
$('#buttonID').click();

◆参考サイト
【jQuery】イベント発火方法 - Qiita

お蔭で今やっている作業がかなり楽になった上に早くなった。
今までだと登録する内容が良くて頑張れば一時間に20件登録が間に合うかどうかなのに
今だと少し気を抜いてやって50分くらいで20件登録できるようになった。
プログラミングで感動したのはかなり久しぶりかもしれない・・・。

今日はここまで

2019年8月7日水曜日

2019-07-29 07-31 08-05 08-06 到達点メモ


jQuery

.html()で出力をさせていたのだが
その際にコード上だと<br />なのに
何故か.html()で出力させた場合は、<br>になっていた。
調べてみると、そもそも<br />はXHTMLで使うものであって
HTMLは<br>になるらしい。

これが混在しているという事は、違いを理解して使っていないという事だよなぁ・・・。

参考サイト:<br> と <br /> タグの違い 【HTML と XHTML 】
https://ameblo.jp/midorieng03/entry-10929028852.html

メソッド名を踏まえて考えると <br /> が自動的に<br>になるのは
まぁ納得かな。

class内でclickの中にclassのメソッドを呼び出すのは無理っぽい?
*方法はあるかもしれんが、分からんかった。
一先ず、下記のようにclickと同じネストで関数を定義すれば
呼び出すことは出来る。

class RewriteTestPage {
  constructor () {}
  addTestButton () {
    function testCall () {
      console.log ('test');
    }

    var h1Html = '<button type="button" class="test_title">テスト</button>';
    $ ('div.test_add td').append (h1Html);
    $ ('.test_title').click (function (e) {
      testCall ();
    });
  }
}

例えば、長くなった且つごちゃごちゃになったjsを分割したい時などに
jsからjsを呼び出したいとする
jsでjsを呼び出すには基本的には、importで大丈夫なのだが、
エクステンションの場合はちょっと話が異なるようである

大まかに項目を上げると
・呼び出し元のクラスは、static newとexport文を宣言する必要がある
・content_main.jsとcontent_script.jsを作成し
content_scriptでcontent_mainを呼び出すようにする
・content_mainで呼び出したいクラスのファイル名を書く

参考サイト:chrome-extension-es6-import
https://github.com/otiai10/chrome-extension-es6-import/tree/81199dcf1caa25df566e5e1dd9837989f151b775


あと、良く理由が分かっていないのだが
先ほど記載した参考サイトを元に行ってみたのだが
非同期処理内でwindow.onloadのfunction内で
クラス関数を実行しようとしても何故か実行しない。
window.onloadの部分をコメントアウトすると動くことは確認できている。


ちょっと書かないと特に縁のない言語はやはりすぐに忘れてしまう・・・。
変数を含んだ置換処理を行いたい場合は、
new RegExp()を使えばよい

*使用例
var tempHtmlString = $ ('.test_div').html ();
var tempRegExp = new RegExp (
'<div>' +
  testValue +
  '<\/div>(\n(.*?)|(.*?))<\/th>\n(.*?)<td'
);
tempHtmlString = tempHtmlString.replace (tempRegExp, 'TestReplace');

◆参考サイト
javascript:replace()で正規表現に変数を使う場合
RegExp  by Mozilla Contributors is licensed under CC-BY-SA 2.5.

他にも作業しようと思ったが、力尽きたので今日はここまで


2019年7月26日金曜日

2019-07-23、07-24、07-25 到達点メモ


DOM操作とjQueryとJavaScriptがごっちゃになっていて分かんねぇぇえええ

function内で他のDOMの値が取れないのは何でなんだ・・・。
.text()じゃなかったからだった・・・。(*ずっと.textでやっており、後ろの括弧が無かった)

クリップボードにコピーするのは以下のサイトが役に立ったというかコピペした。

[jQuery] テキストエリアの内容をクリップボードにコピーするボタンを設置したい
https://migi.me/jquery/copy-clipboard/

思った以上に手間取った。
正直、未だに分かっていないことも多い・・・。

最終的に必要なところを全部ボタン化してコピーしたいのだが
今のところh1タグのところしか作れていない・・・。

あと、特定のURLときのみ機能するようにしないと調べ物しながらだと邪魔すぎる・・・。

2019-07-24

URLの指定は普通に楽だった。
urlを取得する構文を書き、document.URL.match で一部分の重要な箇所が一致するかを見れば普通に場合別けができた。

参考サイト:jQueryでURLを取得してページごとに条件分岐させる
https://designsupply-web.com/knowledgeside/1592/

データを取得する際に、タグとかの状態でhtmlデータを取得したい場合は
単純に.html()で取得できる。
.text()だと、<br>の改行が認識されないので、自力で変換してやる必要がある

参考サイト:【jQuery】textメソッド改行入らない
https://teratail.com/questions/36078

なお、JavaScriptで変換する場合は.replaceを使う必要がある
また、条件を満たすものを全部変換したい場合は、正規表現を使う必要がある。

参考サイト:特定の文字列を全て置換する[Javascript]
https://qiita.com/DecoratedKnight/items/103ab57431b6c448e535

参考サイト:基本的な正規表現一覧
https://murashun.jp/blog/20190215-01.html

参考サイト:エスケープ, 特殊文字
https://ja.javascript.info/regexp-escaping

また引っかかったところとしてスラッシュとバックスラッシュがごっちゃになってしまい
本来、スラッシュ(/)をやりたかったのをバックスラッシュ(\)と勘違いしてしまい
\\ と入力して袋小路に入っていた。
正しいやり方は \/ である。

DOMの指定の仕方で、仮に<h3 class="h3_hoghoge">を指定しようと思ったが、他のクラスにも同じ名前があったので、<section class="sec1234_hoghoge"><h3 class="h3_hoghoge">を指定したいとする。


その場合は、以下の様な指定をすればよい
*正しい例
$ ('section.sec1234_hoghoge>h3.h3_hoghoge')

無論、以下の様な指定はできない
*ダメな例
$ ('section.sec1234_hoghoge').$('h3.h3_hoghoge')

jQueryのセレクタメモ(リンク先は階層関係の指定の部分からになっている)
https://qiita.com/Thought_Nibbler/items/5d4fc40a4d4325128b24#%E9%9A%8E%E5%B1%A4%E9%96%A2%E4%BF%82%E3%81%AE%E6%8C%87%E5%AE%9A

その他
たまにクラス名で
<div class="hoge momomo">
という風にスペースで区切ってあるものがあるが
これは、クラス名が二つになっており、"hoge momomo"というクラス名のわけではない。
正しくは、"hoge"と"momomo"の二つである

参考サイト
スペースを含んだクラス名を jquery で指定できない
https://ja.stackoverflow.com/questions/22510/%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%92%E5%90%AB%E3%82%93%E3%81%A0%E3%82%AF%E3%83%A9%E3%82%B9%E5%90%8D%E3%82%92-jquery-%E3%81%A7%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84

2019-07-25
本当に皆自由に書くんだなぁ・・・。
ブラウザで表示される内容と実データの中身に乖離がありすぎるのですが、それは・・・。

一番簡単なのは、一度htmlデータで出力した後に
それを再度htmlデータとして取り込みをそれを.text()で出力するのが良い
ただし、ブラウザで表示されるのと実データは違うので(CSSなどで表示に変化が出ているのだろうか・・・?)
実データがアレだと結局手直しが必要になる。

正規表現で、下のように赤字の部分だけ変えたくない場合とかがある
    /<div>テスト<\/div>\n(.*?)<\/th>\n(.*?)<td/,

その時は以下のように書けばよい
'<div>テスト<\/div>\n$1<\/th>\n$2<td class="test_class"'

参考サイト
文字列の一部だけを変更したい
https://hodade.com/seiki/page.php?r_ichibu

日付や年数の加算減算をしたい場合は、
.setDate()をすればよい。

あと、紛らわしい事として、
*.getMonth()で取得できる数値は0~11になっている
*年数を取得したい場合は,.getFullYear()
がある
なお、文字列から日付に変換したい場合は
var date = new Date ('2019-07-25');
でも可能

参考サイト
【JavaScript】日付処理
https://qiita.com/kazu56/items/cca24cfdca4553269cab
JavaScript の Date は罠が多すぎる
https://qiita.com/labocho/items/5fbaa0491b67221419b4
javascriptで日付(月・日)を加算(減算)してみた
http://shoprev.hatenablog.com/entry/2014/09/18/223316

X番目のthのタグを指定するには
th:nth-child(X)とやればよい
一番最初の番号は1。0ではない

jQueryでTABLE要素の操作
https://rfs.jp/sb/javascript/js-lab/jquery-table.html

末尾の文字を削除する場合は
'aaaaaf'.slice( 0, -1 ) ;
とやればよい

先頭、末尾の文字を削除する方法
https://lab.syncer.jp/Web/JavaScript/Snippet/5/

タグの指定が間違っていないはず?なのだが上手く行かない
元のHTMLの構造がおかしいのか、それとも、なんか指定が間違っているのか・・・?

目標の大体は解決できたので今日はここまで。


2019年1月28日月曜日

2019-01-19、20、24、26、28 到達点メモ


AtCoderで、B-1 21の問題(コンテストが終了した問題)に関するRubyで解いた
ネタバレがあるので嫌な人は見ないようにしてください。


git logをコマンドプロンプトで使っていたら、日本語が文字化けしていた。
正直なところ、恒久的な対処方法が分からなかったので
git bashを使うことにした。
これなら文字化けしない。

参考サイト:Windowsでgit log見た時日本語が<E6><97>~みたいに化けた時の対処方法
参考サイト:git log、git diff、git showでの日本語の文字化けをまとめて対策

というか、コミットはVisualStudioCodeを使えば割とどうでもなることが良く分かった。
ついで話をもう一つするとshift-jsで開くと文字化けするので、utf8で保存しよう。

正規表現について

以下のような文字列があったとする

Word Adobe PhotoShop (フォトショップ)

これを以下のようにしたい
Word,Adobe PhotoShop (フォトショップ)

その場合は以下のようにすればよい(EmEditorの場合)

検索(分かりにくいが、一番最初の方に半角スペースが入っている)
『 ([^(|^P])』

置換
『,\1』

()でくくったところは置換時に変更しないという意味で
^は否定の意味
[]は[]の中の任意の文字。複数の文字とかを使いたい時に使う?

参考サイト:正規表現
参考サイト:正規表現:文字列を「含まない」否定の表現まとめ
参考サイト:文字列の一部だけを変更したい
参考サイト:特定の文字列を含まないという正規表現


ruby(AtCoderで、B-1 21の問題(コンテストが終了した問題)に関するネタバレ注意)

AtCoderで、B-1 21の問題(コンテストが終了した問題)を解いた際にコードのバイト数が少ない回答を見たのだがその回答に感動しました。
平方数はそうやってもとめるのかと

puts number==(number**0.5).to_i**2 ? :Yes : :No

他の言語はわかりませんが、rubyだと小数の階乗ができるので
そこをInt型に変えて小数を落として、更に二乗すれば
元々平方数が出せる値なら一致するので
大体どの値でも出せて便利だなと思いました。

200.to_s.split("")の処理よりは、200.to_s.charsの処理の方が軽い

あと、よくあるa>bのときは、aが大きい、a=bの時は等しい、a<bの時はbが大きい
とやりたい場合は、以下のような方法もある

judgment = ["等しい","aが大きい","bが大きい"]
puts judgment[a<=>b]

見やすいかどうかはともかくとして、圧縮したい場合は便利。

x |= yを見つけたのでなんじゃこりゃ?
と思って調べてみたらどうやらビット単位のOR代入の省略形らしい。
x=x|y
で、何に使うかというと配列で一意の合成をやりたい場合に便利なんだそうだ。

例えば、以下のようなコードを書いたとする
x = [1,2,3,4,9]
y = [3,4,5]
x |= y
puts x.to_s
x2 = ["aa","bb","abb"]
y2 = ["a","bb","ccc"]
x2 |= y2
puts x2.to_s

結果は以下のようになる
[1, 2, 3, 4, 9, 5]
["aa", "bb", "abb", "a", "ccc"]

uniqの処理って重そうだったし
一々合成するならこれの方が処理が速そう?
きちんと計っていないので何とも言えないが。

参考サイト:Ruby |= assignment operator

2018年10月12日金曜日

2018-09-06、21 到達点メモ


JavaScript

ループ処理でconsole.logが表示されない問題

下記のサイトのように対処してコンソール表示設定が問題ないのに
表示がされない場合の話
参考サイト:【2017お盆明け】Chromeのコンソールログが表示されない時の対処法

対処方法を先に述べますとdo whileとかではなくて
setIntervalを使うと表示されます

参考サイト:chromeのConsoleで処理を停止するほうほう

どうやらChrome DevToolsでは
console.logはファイルを全部読み込まないと表示されないようで
whileなどでループ処理が終わっていない場合、console.logでは表示されないです。

ただ、読み込んだ後ならwhile中でも表示は出来るので例えば最初に空のファイルを作り一度表示させた後にファイルの中身を更新するとconsole.logの中身が表示されます。

無論、新しくファイルを開きなおすと、console.logが表示されなくなるので
もし、前は表示されたのに今日開きなおしたら表示されない!!
ということがあったら、それが原因です。

hashについて

hashに存在しないキーを与えるとundefinedという値が返ってくる
これは、true/falseだとfalseに相当する
なので、存在しないキーを弾くという事をしたい場合は以下のようにすればよい

if (!hash[key]) {
    console.log ('不正な値です。');
  }

参考サイト:JavaScriptでfalseになるもの

良く忘れるのでメモ

gitのremoteのURLの設定を間違えたので直したい
git remote set-url origin fix_url

*別にhttpsでも問題は無い。
参考サイト:gitのremote urlを変更する(レポジトリ移行時)
参考サイト:gitでpushしようとしたら403された話
参考サイト:GitHubにPushしようとしたらCould not read from remote repository と怒られた

httpsで指定するときは以下のように指定する
*Bitbucketの場合
https://<repo_owner>@bitbucket.org/<accountname>/<reponame>.git

repo_ownerは、アップロードする人のユーザー名。大抵はアカウント名=アップロードする人のユーザー名のはず
accountnameは、bitbucketのアカウント名
reponameは、レポジトリの名前

参考サイト:SSHキー(Bitbuketの公式ドキュメントより)

正規表現

数字のみを使いたい
\d

数字以外
^\d もしくは \D

参考サイト:正規表現の基本

公開日と日付は気にしない事