もちゅろぐ

iOSやSwift、モバイル設計だったりRailsについてまとめていく

健全なチームの成熟のために自分が意識していること

普段プログラマという仕事をしつつそれ以外のことをしてることもあり、それの一部について考えまとめたもの。

対象読者

  • リーダーやさらに上になりたいがどうすればいいか分からない
  • 新しくリーダーになったけど振る舞いが分からない
  • リーダーとかには興味ないが手戻りが嫌

非対象読者

  • 楽したい人

どっちも大事だけど、どっちにも寄らないよう自分が意識していること

  • しつこい人にはならないように気をつけている(前者)
  • 反対にカオスにならないように指摘や提案して是正も意識してる(後者)

前者を怠ると周囲からうざがられ、なんか前に進んでない感も体感としてある 後者を怠るとコミュニケーションコストがかさみ全体として前に進まなくなる。 エンジニア目線としてはスイッチングコストや議論だらけで仕事にならない。

下記に順番に説明する。

しつこい人にはならないように気をつけている

これを怠る、つまりしつこいと周囲からうざがられ、なんか前に進んでない感も体感としてある

ケース1. 会議時間を無駄にしないために会議での共有事項を指摘する

そのままで会議で共有されても会議の場で背景説明、課題分解、ブレスト、アイデア選択が起こり会議の時間、つまり会議参加者の時間を無駄にすることは目に見えてる。だから事前に出来ることを行い会議では選択だけに集中すべき。と指摘や提案する。

ケース2. 議論において観点漏れ防止や自分のポジション情報提供のために第三者として介入する

ミニマムで進めようと話している所に、「そのミニマムだとこちらに影響するのでミニマムとは呼べない」と指摘し提案する。

邪魔している錯覚がおきる

このようなケース1と2を何度もし続けているとフットワークを重くしてしまったような感覚に襲われる。 なぜなら、話がうまく進んで簡単に済む作業の雰囲気だったけど、自分が指摘したことで作業が増えたからだ。 でも実際に指摘をしなかったら後々で指摘または発覚してより大きい手戻りが起きる。

カオスにならないように指摘や提案して是正を意識する

これを怠る、つまり指摘や是正を怠るとチームのコミュニケーションコストがかさみ全体として前に進まなくなる。 エンジニア目線としてはスイッチングコストや議論だらけで仕事にならない。

先のしつこい人になるのを恐れ流れに任せてしまうと、情報伝達が正しくできず関係者に情報が伝わっていなかったり、全部を知っている人がいなくなったりする。その結果幾度となく対話が必要となり抜けてる観点に関して議論が続く。 そして気づいたら事前に計画的に物事を進めたときよりも開始時間早いけど終わる時間は遅くなる。

無駄な手戻りや伝達フローがゴタゴタはなぜ起きるのか

このようなことが起きるのは、各自自分の仕事で忙しいし、それが自分にとって大事だと思っているからだ。 自分の持っている仕事が周りにどれぐらい影響するかといった逆視点で考える時間を事前にやらないからだ。 当然といえば当然の結果だ。自分の存在意義を出すために担当してる仕事を全うするのはもっともな考えで受け取った仕事を次の人に渡すってのは仕事の基本フローだ。

しかしそれはチームワークという観点においては視野不足である。 下に簡単なポジション別の図を用意した。かなり簡単な図なのでどういった図なのかは見れば分かるはず。

f:id:motom552:20190325223343p:plain

  • これで言うところの作業aまたは作業b担当の目線、つまり来た仕事をこなし次へ回すだけでいると周りの関係者や他人の仕事なんて見えるわけがない。
  • 仕事の規模が大きくなるリーダもそのリーダ目線でいると他ラインの関係者が見えない。

これでは齟齬や手戻り、無駄が起きて当たり前なのだ。 つまり全員自分のポジションよりひとつ上の視野でいないと無駄な手戻りが起きるという事実に気づかないといけない。

それが出来るようになるまでは誰かがカオスにならないように是正し続けるしかない。

チームの成熟度によっては両方不要になる

長いこと同じメンバーで同じプロダクトいると知識を覚えたり、プロセスに慣れてたり、対話や共有などコミュにおいての観点漏れが減り、とても効率よく話が前に進む。 これは何回も体験したことなので自信のある間違いない事実。 アジャイルではこの成熟度はベロシティ安定させる重要な指標となる。 なぜならベロシティ安定について考えると、案件への理解度と必要スキル十分による見積もり精度の向上、イレギュラーや割り込みといった見積もり外の作業やコストを抑えることが重要だと気づくからだ。

チームの成熟度を上げるには土台が強固であること

この成熟度を上げるにはメンバーがコロコロ変わらないことは当然として、チーム内の健全な環境を維持することが前提として大事になる。 健全とは情報フローの確立、状態の見える化、人間関係の安定、スキル差の収束を指す。

そのために自分はカオスとガチガチの間を意識してる

土台が整いチームが健康になるまでは誰かが是正し続けることが重要になる。健全なチームに健全なプロジェクトは宿る。

健全を害することは簡単なこと

  • 会議の資料で時間がないから手を抜いて口頭で話す
  • 効率化ために従来のやり方をぶっ壊す

時間がなくて手を抜くと必要ないから手を抜くは同じ時短でも差は天地並

重要度を理解できていないから手を抜くのと重要度を理解できてるから手を抜いてるのと同じだ。 重要だと分かっているのに時間がなくて手を抜くとか愚かな行為はしないはずだ。通常なら重要ではない他に手を抜くべきだ。

プロセスをぶっ壊すってのは課題や提案にありきであってただやり方を壊すのは停滞と手戻りしかない

現プロセスフローよりももっと効率良いフローを目指すことはとても良いことだが、 だからといって何でもかんでもビルド&スクラッチすればよいというものではない。 通常実務においてうまく動いてるプロセスもあれば動いていないプロセスが混ざっているものだ。 プロセスフローにおいて効率が悪い、時間がかかるといった課題があってこそ効率化を図るべきだし 現プロセスフローよりよりよい方法案があってこそ効率化を図れるべきだ。

rails new -d mysqlでmysql2失敗はOpenSSLを疑え(Mac)

前提環境

  • MacOS Mojave 10.14.2
  • Ruby 2.3.7
    • rbenvでインストール
  • MySQL 5.6.37
    • homebrewでインストール
  • rails 5.0.7.2

上記構成でrailsアプリを作るときに初めからdatabaseをMySQLにしたら、いくつか失敗したのでその解消法についてまとめます。

rails new のときに mysql を指定

デフォルトだとsqliteになってdatabase.ymlを書き直さないといけないので初めからdatabaseをmysqlに指定したい場合

$ rails new <app name> -d mysql

または

$ rails new <app name> -database=mysql

rails newでmysql2のインストールが失敗する

$ rails new <app name> -d mysql
...
Fetching mysql2 0.5.2
Installing mysql2 0.5.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
...
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for rb_wait_for_single_fd()... yes
-----
Using mysql_config at /usr/local/opt/mysql@5.6/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for SSL_MODE_DISABLED in mysql.h... no
checking for MYSQL_OPT_SSL_ENFORCE in mysql.h... no
checking for MYSQL.net.vio in mysql.h... yes
checking for MYSQL.net.pvio in mysql.h... no
checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes
checking for SERVER_QUERY_NO_GOOD_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_NO_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_WAS_SLOW in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_ON in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_OFF in mysql.h... yes
checking for my_bool in mysql.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/opt/mysql@5.6/lib
-----
creating Makefile

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/mothule/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/extensions/x86_64-darwin-18/2.3.0-static/mysql2-0.5.2/mkmf.log

current directory: /Users/mothule/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/mysql2-0.5.2/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/mothule/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/mysql2-0.5.2/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/mothule/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/mysql2-0.5.2 for inspection.
Results logged to /Users/mothule/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/extensions/x86_64-darwin-18/2.3.0-static/mysql2-0.5.2/gem_make.out

An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  mysql2
         run  bundle exec spring binstub --all
Could not find gem 'mysql2 (< 0.6.0, >= 0.3.18)' in any of the gem sources listed in your Gemfile.

↑よく見ると、どうやら失敗してそうなのはOpenSSL周りが怪しそう↓

checking for SSL_MODE_DISABLED in mysql.h... no
checking for MYSQL_OPT_SSL_ENFORCE in mysql.h... no
...
ld: library not found for -lssl

brewでopensslがインストールされてなければ、opensslをインストールする

$ brew install openssl

bundle configでmysql2のビルドオプションを変更する

bundleに対してmysql2インストール時に先程インストールしたopnesslのlibとheaderのパスを指定すれば良いらしい しかしbundleはおろかrails newも未実行なのでbundle configはできない。

$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"

rails newでのbundle installをしないようにする

mysql2へのビルドコンフィグを設定できるためにbundle installはスキップさせたい。 これは簡単に出来る。

rails new <app name> --skip-bundle

これだけでbundle installが実行されなくなる。

改めてbundle configでmysql2のビルドコンフィグを設定

$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"

bundle installを実行

$ bundle install -j4 --path=vendor/bundle

これで初期状態からmysqlをdatabaseにしたrailsアプリが出来上がると思います。

うまくいかない場合は別の要因かもしれません。

クライアントエンジニアにはcurlよりHTTPieがお薦め

f:id:motom552:20190224144043p:plain MacLinuxで使うcurlですが、iOSAndroid, フロントエンドWeb開発においてはcurlよりHTTPieを使ったほうが楽だったので紹介します。

クライアントエンジニアはcurlの学習コストが割に合わない

サーバーをよく弄るWebエンジニアはLinux上の操作が多いため既存パッケージのcurlを覚え使えたほうがフットワークが軽いと思います。

しかしAPIを叩く側多いiOSAndroid開発、フロントエンドWebの開発をするクライアントエンジニアにとって自分の開発機がそのまま開発環境になることがほとんどだと思います。

curlのようなパッケージソフトはコマンドとそのオプションを覚えるコストがかかります。 自分はせっかく覚えてもすぐに忘れてまた調べ直すので開発スピードを阻害する要因の一つです。 しかし今回紹介するHTTPieはRESTful APIを叩きやすいコマンドになります。

サンプル

あるサービスのタイムラインを取得

下のようにRESTful APIのように叩けます。

$ http get https://hogehoge.jp/timelines

あるサービスの自分のプロフィールを取得

ヘッダーもすごく簡単です。

$ http get https://hogehoge.jp/users/me/profile "Authorization:bearer accesstoken" 

あるサービスの自分のプロフィールを変更

ボディパラメータも学習コストは低いです。

$ http patch https://hogehoge.jp/users/me/profile "Authorization:bearer accesstoken" name=hoge

インストール方法

MacであればHomebrewを使えば一発です。

$ brew install httpie

比較的よく使うオプション

フォーム(application/x-www-form-urlencoded)送信

-f または --form オプション追加

$ http --form POST api.example.org/person/1 name='hoge'

JSONパラメータを送信

コマンドライン上だと数字も文字列として扱うので次の形式で入れると Boolean, Number, Object といったJSON型を指定できます。

$ http POST api.example.org/person/1 name=Jonh age:=29 male:=true hobbies:='["hobby1", "hobby2"]'

公式ドキュメントがかなり豊富で読みやすい

英語になりますが、難しい単語は少ないので読みやすいです。 HTTPie documentation

WebフロントエンドエンジニアとiOSエンジニアとAndroidエンジニアが最低限知るべきマルチプラットフォーム対応サービスの仕様とデザインの共通と独立の話

背景

自分はUI/UXデザイナーでもグラフィックデザイナーでもないBtoC向けサービス作るのが好きなエンジニアです。 今回会社でクライアントエンジニア向けにプラットフォーム横断するサービスのおいてプラットフォーム横断すべき情報とすべきではない情報について考える機会があったので記事にしました。

質問

みなさんはiOSなのにAndroidみたいなアラート、 AndroidなのにiOSみたいなダイアログボックスをデザイナーから依頼されてアラートやダイアログをフルカスタマイズして実装した経験はないだろうか?

私も経験あります。 あれ意味分からないですよね。 メリットよりデメリットの方が大きいです。

例えばアラートと言われたら最初に浮かぶイメージは何ですか?

  • Webフロントエンドエンジニア「ブラウザ上部に表示されるしょっぱいボックス」
  • iOSエンジニア「画面中央にポップアップで出てくるいわゆるダイアログボックス」
  • Androidエンジニア「iOSと同じくダイアログボックス」

もう一つ、エラー通知と言われたら何が浮かびますか?

  • Webフロントエンドエンジニア「エラー文言を帯やフォーム毎の下に表示。またはCSSゴリゴリの自作ダイアログボックス」
  • iOSエンジニア「アラート、もしくはサードパーティの自作ビュー」
  • Androidエンジニア「アラート、もしくはトースト」

表現方法はプラットフォーム間で比べると大きく異なるが、プラットフォーム内で比べると統一されてる

このように同じアラートやエラー通知と言ってもプラットフォームによって表現方法は一致しません。 だけどその表現方法はプラットフォーム毎のユーザーからしたら標準で見慣れた物です。

つまり プラットフォーム間と比べるとバラバラだけど、アプリ内の表現方法は一致してますし、他アプリでも見たことある表現方法です。

この前提の上で次の仕様があったら

「ユーザーに入力不備エラーを通知する」と仕様があったら、各プラットフォームの表現方法は違います。

  • Webフロントエンドエンジニア「入力フォームの下に赤文字で文言を表示する」
  • iOSエンジニア「アラート(UIAlert)、自作ビューで文言を表示する。文字色は通常色だがエラーアイコンがついてたりする」
  • Androidエンジニア「アラート(AlertDialog)、トーストでiOSと似たように表示する」

つまり仕様は3プラットフォーム同じだけど、仕様の表現は3プラットフォーム異なります。

補足:各プラットフォームの表現方法は一例です

例に上げたプラットフォーム毎の表現方法はトレンドやデザインコンセプトによって変わります。 しかし各アプリ内においては統一されています。

もう一度質問、Web, iOS, Android も全く同じダイアログボックスをデザインして使うメリットはあるか?

ない

たとえあったとしても、そのプラットフォームの標準やトレンドからズレた表現をユーザーに見せることで ユーザーはその表現への学習コストがかかる

例えば

アラートのYes/Noボタンの配置はプラットフォームによって異なるバージョンが存在します。 iOSユーザーにAndroid向けのYes/No配置を見せると、iOSユーザーは操作を間違える。 なぜなら他iOSアプリとYes/No配置が逆だから。 これはUX最悪です。

例2

Macアプリであるアプリだけウィンドウ左上の 「閉じる/最大化/最小化」ボタンが右上にあったらどう思うかと同じです。

では仕様満たせばデザインは完全独立していいのか?

サービスデザインにおいてテーマカラーに違反して、サービス全体としての一体感が薄れます。

例えばピンクをベースカラーとしたサービスがあったとする

  • そこにLPのデザインの全体色が水色だったら?
  • 外部のクレカ決済サービス使うためそこへ遷移したら青色だったら?

もっと簡単に言うと

cookpadのWebアプリ版とiOSアプリ版を見れば分かります。

そもそもデザインは誰向けなのか考える

  • AndroidiOSのデザインをあわせた所で、Androidアプリを使うユーザーからしたらiOSのデザインが合わさってる恩恵は受けません。
  • WebとiOSのデザインをあわせた所で、iOSユーザーは見慣れない操作を体験しなければいけません。
  • PC版WebとiOSデザインをあわせた所で、ポインティングデバイスが違いすぎてUXは最悪です。

各プラットフォームのユーザーに快適で見慣れて受け入れやすいデザインにしていくべきです。

だけど仕様はプラットフォーム跨いで合わせないと不便になる

WebのSEO強化でユーザー集客し、アプリ版へ導線ひく方法は一般的だと思います。

「Webで使ってみて便利だからアプリも使ってみよう」と思ったユーザーがアプリを使ったところ 「Webで使ってた機能がアプリではない」「Webで覚えた用語がアプリじゃ全然違う用語で使いにくい」 といった残念なUXになります。

まとめ

上記を整理すると

  • 全体のデザインガイドラインは全プラットフォーム準拠すべき
  • 仕様やUXの表現はプラットフォーム毎に適切でかつ統一した方法にすべき
  • 仕様やUXはプラットフォーム横断で合わせるべき(ただし独占仕様などは例外)

画面外へスライドアニメすると表示が消えてからスライドするのはSafeAreaが原因

問題の症状

下のアニメのように外へスライドしようとすると最初に白くなってから上へスライドします。

画面外へスライドアニメで表示が消える
画面外へスライドアニメで表示が消える

コードは下記のように至ってシンプル。

UIView.animate(withDuration: 0.3, animations: { [weak self] in
    guard let self = self else { return }
    self.frame.origin.y = self.parentFrame.origin.y - self.frame.size.height
}) { [weak self] (_) in
    guard let self = self else { return }
    self.removeFromSuperview()
    completion()
}

View階層も次の通り

UIViewController.view
  |
  +-- MKMapView
  |
  +-- Button
  |
  +-- SearchPopupView (これをスライドさせてる)

Auto Layoutが効いてる場合は、 animations クロージャ内に self.updateConstraints() が抜けてるとかありますが、今回は対象View自体にはAuto Layoutは使わず単純に UIViewController.view に addSubview してるだけです。

原因

スライド対象Viewの内部ViewのAuto LayoutでTopをSafe Areaに繋いでいることが原因でした。

対象View 制約

今回のようなパーツxibのような Safe Area を使わなくても良い場合はSafe Areaを無効にすることで 画面外へスライドアニメしても表示が消えずにスライドできるように解決できました。

cronの書き方

crond だけでなく何かと色んな所で出てくる cron 記法 毎回検索しても欲しい記法見つけるのに時間かかるのでほぼ自分用に書いた。

フォーマット

分 時 日 月 曜日 コマンド

日時の範囲

時間 値範囲
0~59
0~23
1~31
1~12 or jan~dec
曜日 0~7 or sun ~ sat

* はどの値にも当てはまる

* * * * * <command>

, で区切ると複数時間を指定できる

月曜と水曜のみ実行

* * * * 1,3 <command>

*/ で割ると一定時間おきに実行する

3時間置きに実行

* */3 * * * <command>

※ この記法は Linux だと動かないかも

古いPCにLinux(CentOS 7)をUSBメモリでインストールしてプリンターサーバーとして再生させる

こないだ断捨離してたら独身の頃買ったネットブックを発見。 長らく使っておらず今後も予定なかったので、破棄も考えたのですが比較的使っているプリントサーバとして勉強がてら復活させました。

色々ネットで調べながら構築したのですが、ネットでは見つからなかったり、躓いたり、情報が散らばって進めにくかったのでまとめました。

環境

機器 名称
PC acer の Aspire 1410
プリンター iP2700
OS Windows 7 64bits版
作業PC Mac
USBメモリ 4GB

構築したプリントサーバ

Windows 7 がインストールされてる 内部HDD を CentOS 7 64bits Minimal で上書き。 GUIはなしです。 プリンターはPCにUSBケーブルで接続します。 system-config-printer は GUI なのでそれ以外の方法で構築します

注意

PC内のデータやOSは全て削除されます。

イメージファイルをダウンロード

特別記載することはないですね。 CentOS のページからダウンロードするだけです。 Download CentOS ちなみに Minimal にした理由は2つあって

  1. 手持ちのUSBフラッシュメモリの容量不足
  2. 足りないパッケージや環境などを自分で構築するため

のためなので、特にそういった目的不要であれば フルパッケージ版を入れてもいいと思います。

イメージファイルをUSBフラッシュメモリに書き込む

USBメモリの初期化

ディスク一覧を確認

$ diskutil list

MS_DOS(FAT)形式で初期化 ディスク一覧で確認したパーティション/dev/disk2 だとしたら

$ diskutil eraseDisk MS-DOS UNTITLED /dev/disk2

マウント解除

$ diskuntil unmountDisk /dev/disk2

ISOイメージをUSBメモリに書き込む ここで Finder 上でisoイメージファイルをコピペしても認識されません。 ddコマンド使って書き込む。

以下は isoイメージファイルが ~/Downloads/centos.iso とした場合

$ sudo dd if=~/Downloads/centos.iso of=/dev/disk2 bs=4028

ディスク取り出し

$ diskutil eject /dev/disk2

BIOSのブート順序を変える

  1. PCの電源を入れてF2を押しておき、F12が押せるように設定を変更
  2. 再起動してF12を押しておき、ブートディスクをUSBメモリを1番上に移動

yum を使う準備

$ yum update
$ yum install epel-release
$ yum install wget

権限エラーの場合はsudo つけてください

CUPSをインストール

$ yum install cups cups-devel

権限エラーの場合はsudo つけてください

次のような必要ファイルが見つからない場合は

エラー: 依存性の欠如:
    libcups.so.2 は cnijfilter-common-3.30-1.i386 に必要とされています
    libpopt.so.0 は cnijfilter-common-3.30-1.i386 に必要とされています
$ yum provides libcups.so.2

のようにすることで内包してるパッケージ名を確認できます。

PCからプリンタのUSBケーブルを抜くとCUPSの設定が無効になる

CUPSウェブ管理上では変化ないが印刷しても反応しない 再設定すると印刷される

Macのプリンタ設定で見つからない場合

プリンターサーバーに avahi をインストールしてみてください。

CUPSを設定

vi /etc/cups/cupsd.conf

Listen localhost:631

# Listen localhost:631
Listen 631

にする

<Location /></Location>

の間に Allow From All 末尾を追加

<Location /admin></Location>

の間に Allow From All 末尾を追加

<Location /admin/conf></Location>

の間に Allow From All 末尾を追加

CUPS起動

プリンタ電源を入れておこう

USBにプリンタが接続されているか確認

lsusb
$ systemctl start cups

Firewalld で IPP のポートを開ける

サービス確認

$ firewall-cmd --get-services

IPP が定義されてれば追加

$ firewall-cmd --add-service=ipp --permanent
$ firewall-cmd --reload

Linux用プリンタードライバーをインストール

キヤノン:ダウンロード|IJ Printer Driver Ver.3.30 for Linux から rpm をダウンロードします

$ wget http://pdisp01.c-wss.com/gdl/WWUFORedirectTarget.do?id=MDEwMDAwMjcxNjAx&cmp=ACM&lang=JA

ダウンロードしたファイルはホームフォルダにあります。 適宜名前を変更してください。

$ rpm -vhU --nodeps --force <rpm name>

CentOSの再起動が必要です。

CUPS設定

ブラウザで http://サーバーアドレス:631 にアクセス サーバーアドレスは

$ ip a

で確認できる

  1. 管理者向けの「プリンターとクラスの追加」
  2. プリンターの「プリンターの追加」
  3. 権限エラーページが出るので表示されたURLにアクセス
  4. 再度「プリンターの追加」
  5. rootアカウント情報を入力
  6. プリンターに接続しているローカルプリンターを選択
  7. 「このプリンターを共有する」をONにする

PCのスリープをOFF

vi /etc/systemd/logind.conf を編集する

#HandleLidSwitch=suspend
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate

# PCを閉じた
HandleLidSwitch=ignore
# パワーキーを押した
HandlePowerKey=ignore
# サスペンドキーを押した
HandleSuspendKey=ignore
# ハイバネートキーを押した
HandleHibernateKey=ignore

再起動する

$ systemctl restart systemd-logind.service

プリンタの自動電源OFF機能を無効化

iP2700だと自動電源がデフォルトでONになってる 調べた感じCUI上からだと変更はできなさそう。

少しセキュリティを強固にする

yum-cron で定期 yum update 実行

$ yum install yum-cron

除外設定 vi /etc/yum.conf

[main] より下に除外したい項目を追加

[main]
exclude=kernel*

自動更新を設定 /etc/yum/yum-cron.conf

apply_updates = no

を yes にする

セキュリティ関連に限定するために

update_cmd = default

を security にする

自動起動にする

$ systemctl start yum-cron
$ systemctl enable yum-cron

不要サービスを止める

起動中サービスを確認

$systemctl list-unit-files -t service 

サービスを止める

$ systemctl disable <service name>

root ユーザーのログイン無効化

/etc/ssh/sshd_config 内の

#PermitRootLogin yes

PermitRootLogin no

に変更する

再起動する

$ systemctl reload sshd.service

何かインストールしても変わらない場合

OSの再起動を試してみてください。

参考URL

Mac OSX上でISOイメージからBootable USBを作成する - 1日ひとつだけ強くなる SambaとCUPSと各種プリンター(CUPS・プリンタ編) - Qiita 【丁寧解説】Linuxのファイアウォール firewalld の使い方

CUPS 設定 - CentOS プリンタ 管理