Electron,HTML/CSS,Windows,プログラミング

こんにちは、しきゆらです。
今回は、最近遊んでいるElectronで詰まったところをメモしておきます。

Electronとは、というところはググればいろいろ出てくるのであまり書きません。
個人的には、Webの技術でデスクトップアプリを作れる便利ツールという認識です。

さて、まずcontextBridgeとは何ぞや、というところですが、私もちゃんと触り始めたのは最近なので詳しくはないので書きません。
(というか、書けません)
詳しくは公式ドキュメントあたりを見てくださいな。
https://www.electronjs.org/docs/api/context-bridge
https://www.electronjs.org/docs/tutorial/context-isolation

個人的理解では、レンダラープロセスからNode関連を使うために、扱える範囲を絞るための機能というイメージです。

では、contextBridge経由でAPIを公開するところで詰まったところと、解決方法をメモしていきます。

なお、実行環境等は以下の通り。

  • OS: Ubuntu 21.10 on WSL2
  • electron: 13.1.7
  • webpack: 5.45.1

JavaScript

こんにちは、しきゆらです。
最近はGASをよく書いています。

そんな中、GASを書いていて困るのは「コードにパスワードとかを直書きしたくない」ということ。
環境変数のようなものがあればいいのに・・・と思っていました。

探してみると、一応それっぽいものは用意されていました。
それが、PropertiesServiceというもの。
ドキュメント:https://developers.google.com/apps-script/reference/properties/properties

こいつを使えば、コードに書きたくない隠しておきたいものを置いておくことができます。

ということで、今回はPropertiesServiceの設定方法や使い方をメモしておきます。

JavaScript,Ruby,Windows,環境構築

こんにちは、しきゆらです。
今回は、SimpackerというGemを使ってサーバ・フロント両方が良しなに動いてくれる環境を整えていきます。

今回はWSL2環境にUbuntuを入れ、そこで動かすことを想定しています。

JavaScript

こんにちは、しきゆらです。
今回は、DOMに対してクラス名を外す処理とつける処理を1行でやる方法を知ったのでメモしておきます。

DOMへのクラス追加・削除

DOMに対してクラスを追加・削除するには、それぞれadd/removeというメソッドが定義されています。
これらを使えば、動的にDOMのクラスを変更することができます。

しかし、例えば既存のAというクラスを外してBというクラスをつける
という処理を書く場合、素直に書くならば以下のように2行になってしまいます。

dom.classList.remove('A');
dom.classList.add('B');

 

クラスの追加・削除をまとめる

上記のようなコードを1行で書くには、以下の方法で行えます。

dom.classList.replace('A', 'B');

replace( oldClass, newClass )
既存のクラスを新しいクラスで置き換えます。
Element.classList – MDN

MDNを眺めていて見つけました。
知っていなくてもなんとかなるけど、知っているとコードがスッキリするやつですね。
知っているつもりでも、改めて見てみると知らないことがあるので、時々見てみるといいかもしれません。

 

まとめ

今回は、DOMの追加・削除を1行で行うメソッドを発見したのでメモしてみました。
置き換えるという方法でできる処理は1行で書けるので、知っていると少しだけコードが短くなると思います。

 

今回は、ここまで。
おわり

JavaScript

こんにちは、しきゆらです。
今回は、以前に少しだけ触れたparcelを使って開発環境を構築してみました。
また、個人的に以前まで疑問だった、JSとSCSSを用いた場合にどう管理するのか問題を解決することができたので合わせてメモしておきます。

parcelに関しては、以前少しだけ記事にしたことがありました。
=> 以前の記事:【JS】フロントエンド界隈で話題のparcelことはじめ
以前まではWebpackを利用していましたが、難解な設定や多様なプラグイン等、気軽に使うにはハードルが高い状況でした。
そんな中で、parcelは面倒で難解な設定ファイルを作成せずとも、自動で関連するファイルを監視し、変更があれば適宜処理を走らせてくれます。

そんなparcelさんですが、実際にparcelを使ったものづくりをするときにどうすればいいのかわからない部分がありました。
それは、SCSSを使った場合の読み込み方です。
HTMLからSCSSを読み込んでも、ブラウザは反映してくれません。
それをどう読み込めるようにするのかが疑問でした。
これを解決することができたので、合わせて記録しておきます。

Electron,JavaScript

こんにちは、しきゆらです。

今回は、electron-builderというものを触ってみます。

 

私は、よく使うサイトをElectronアプリとして書き出して使っています。

ビルドはelectron-packagerというものを使い、時々Electronをビルドしていました。

先日久々にビルドしていると、エラーが出て動かなくなっていました。

正直、NodeやElectronについてはにわか程度の知識しかなく、更新情報なども追えているわけではありませんでした。

調べてみると、electron-builderというものもあるということで、今回はこっちの方を使ってみました。

 

簡単ではありますが、記録として残しておきます。

といっても、参考サイトをほぼそのままやっただけ。

参考サイトは以下です。

electron-builderでElectronアプリのビルド

https://qiita.com/nanairo24/items/73356574b0dc65c0e617

 

JavaScript,React

最近のフロントエンドは、様々なツールやフレームワーク、ライブラリ等を利用し、

いろいろなものを組み合わせてコーディングしているようです。

こうなってくると、細かいファイルが沢山生成されていきますね。

それぞれの管理をどうするのか、というと細かいファイルをガッチャンコとまとめてくれるツールを利用するわけですね。

 

今回触るparcelもがっちゃんこしてくれるツールの一つです。

公式サイト

https://parceljs.org

特徴といえば、設定ファイルがないこと。

Webpackは便利で情報も多く、導入している方も多いかと思いますが、設定ファイルを作るのが、なんとも面倒。

parcelさんは、そんな面倒さをなんとかしてくれるかもしれない救世主となるのか。

 

ということで、今回はparcelを導入し実際に実行してみて便利さを味わっていきます。

 

JavaScript

こんにちは、しきゆらです。

台風の影響で天気が悪いですね。

それに伴い、やる気もどこかに飛んでいってしまいました。悲しい。

 

以前、JSで特定の要素のみを前/後ろにまとめる記事を書きました。

【JS】特定のものを前/後ろにソートする

https://wp.me/p6IU5Y-cm

この後、色んなサイトを眺めていると、よりきれいに書く方法を知ったのでメモしておきます。

 

眺めたサイトは以下。

JSのsortに渡す関数は、正負もしくは0を返すことでソートしてくれます。

これを生かして、より簡単に各方法を示してくれていました。

 

今までは、以下のように愚直に分岐させていました。

function(item1, item2){
  if(item1 < item2) return -1;
  else if(item1 > item2) return 1;
  else return 0;
}

しかし、比較するものを計算して、その結果を返す関数を渡しても良いとのことでした。

例えば以下のような感じ。

array = [1,2,3,4,5];
array.sort(function(item1, item2) {
  return item1 - item2;
});

item1とitem2にはarrayの中にある数が渡されてきます。

この2つを計算し、その結果をそのまま返してしまうのです。

パッと見はよくわかりませんが、計算の結果は以下のようになるはずです。

  • item1 < item2 のとき、item1 – item2 < 0
  • item1 = item2 のとき、item1 – item2 = 0
  • item1 > item2 のとき、item1 – item2 > 0

このようになり、きちんとソートしてくれるわけですね。

 

これは、目からウロコでした。

条件式で記述すると3行は使う内容ですが、引き算で表現すると1行で済んでしまいますね。

正直パっと見てわからないと思うので

可読性を取るか、記述量を取るか、という状況かな、と思います。

 

なお、以前の記事を今回の方法で書き換えるとするとこうなると思います。

array = [1,2,3,4,5,6,7,8,9];
array.sort((item1, item2) => {
  return 3 - item1;
});
// => [3, 4, 5, 6, 7, 8, 9, 2, 1]

このようにすると

  • item1 < 3 のとき、 3 – item1 > 0
  • item1 = 3 のとき、 3 – item1 = 0
  • item1 > 3 のとき、 3 – item1 < 0

となり、想定通りの動きをしてくれます。

 

今回はここまで。

おわり。

JavaScript,React

こんにちは、しきゆらです。

最近、怖いと思っていたライブラリやフレームワークは、使ってみると大したことないということに気づき始めました。

Reactさんもその一つです。

基本的なReactの環境構築や使い方をまとめようと思っていますが、今回はちょっとしたメモです。

 

環境

Webpack、Babelを使ってES6をトランスパイルするという状況です。

 

Uncaught TypeError: this.setState is not a function

Reactでstateを変更するときにお世話になる関数であるsetState。

この間、stateを変更すべくsetStateを実行していたら「Uncaught TypeError: this.setState is not a function」とエラーが・・・。

 

コードはこんな感じでした。

import SubComponent from './SubComponent';

class MainComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: props.data,
    }
  }

  updateState(data) {
    this.setState({
      data,
    })
  }

  render(){
    return(
      <SubComponent
        updateState={this.updateState}
      />
    );
  }
}

Mainの方のデータをSubから更新しようとしています。

このとき、上記のようなエラーが起こりました。

 

原因と対策

原因は「this.updateState」のthisがundefinedになることが問題のようです。

対策としては、classで定義する場合constructor内でbindしないと行けないようです。

constructor(){
  super(props); 
  this.state = { data: props.data }

  this.updateState = this.updateState.bind(this); // <= これが重要
}

これでエラーが出ずに更新できるはずです。

わかってしまえば案外簡単ですが、そうでないと無駄に時間がかかってしまいますよね。

 

今回はここまで。

おわり

JavaScript

こんにちは、しきゆらです。

今回は、JSのソート時に特定の要素だけを前/後ろにソートする方法をメモしておきます。

 

・・・お前は何を言っているんだ?

と思われるかもしれませんが、たとえば以下のようにしたい、というのが今回の話。

array = [1,2,3,4,5];
//↓
array.sort() //=> [3,4,5,1,2]

特定の条件に合ったものだけを配列の前/後ろに回してほしいということです。

普通であればfilterとかで分けた後にconcatするのかもしれませんが、

今回はソートだけでなんとかしてみよう、という内容です。