What we choose is never what we really need.

5/26/2023

Linux Command Line Hackery Series - Part 5



Welcome back to the Linux Command Line Hackery series, this is Part-V of the series. Today we are going to learn how to monitor and control processes on our Linux box, so wrap your sleeves up and let's get started.

Command:    ps
Syntax:           ps [options]
Description:  ps displays information about the currently running processes. Some of the common flags of ps are described briefly below
Flags: 
  -A or -e -> select all processes
  -a -> select all processes except both session leaders and processes not associated with a terminal.
  T -> select all processes associated with current terminal
  -u <username or id> -> select all processes of a given user or userlist

Open up a terminal and type ps:

ps

what you'll see is a list of processes currently running in your terminal. One important thing to notice in the output is what's called as PID which stands for process ID. It is the number that uniquely identifies a process. Just keep that PID concept in mind we'll use it soon.

OK I know that's not really what you want to see rather you want to see all the processes that are currently running on your box. Don't worry we have flags to rescue, in order to see all the processes you can use the -e flag like this:

ps -e

Boom! you get a long list of processes currently running on your machine (don't stare at me like that, you asked and I gave you that). If you want to see processes of a particular user you can type the following command in your terminal:

ps -u bob

here "bob" is a username. This command will list all processes of the user with effective user name of bob.

You can do a full-format listing of the processes using the -f flag like this:

ps -fu bob

But the output of the ps command is a snapshot not really a live preview of what is going on in your box. I know your next question is going to be something like this, Isn't there a command in Linux that gives me a live updating information of the processes? Yes, there is a command called top that we'll learn about next.

Command:    top
Syntax:           top [options]
Description:  top gives a dynamic real-time view of a running system. That is, it gives the up-to-date information about all the processes running on your Linux box (sounds fun!). Besides giving information about current processes and threads top also provides a brief system summary.

To start top just type this command:

top

and you'll get a nice and cute looking ugly display :). Well what the heck is going on here you might ask, right? What you get is information about what is going on with your computer. To see what more can you do with top just type <h> within the program window and you'll be given list of options that you can play with.

OK looking at what processes are going on in your box is cool but what if you want to terminate (or close) a process, is there a command line utility for that? Yes, there is and that's what we are going to look at next.

Command:   kill
Syntax:          kill [options] <pid> [...]
Description:  kill is used to send a signal to process which by default is a TERM signal meaning kill by default sends a signal of termination to process (Cruel guy). To list the available signals we can use the -l or -L flag of the kill command.


To simply terminate a process we provide kill command a PID (process ID) and it will send the TERM signal to the process. So to kill a process first we'll list the running processes and then we'll keep the PID of the process in mind that we want to terminate. After that we'll issue the kill command with the PID that we just found.

ps -ax
kill 1153

the above command will send a TERM signal to the process whose PID is 1153, as simple as that.

We can also use our already learned skills to refine the output of ps command. Say we have a xterm terminal running on our box and we want to terminate it. By using ps command all alone we'll get a long listing of all processes running on our box. But we can limit the output of ps command to just those processes that we're interested in by piping ps command with the grep command like this:

ps -ax | grep xterm

wow! that's amazing, we're able to pull out only those results from the ps command that contained xterm in them. Isn't that a cool trick? But what is that vertical bar ( ) doing in the middle, you may be thinking, right? Remember we learned about the input and output re-directors previously, the vertical bar (pipe in geeky terms) is another re-director whose task is to redirect the output of one command as input to another command. Here the pipe redirects the output of ps -ax command as input to grep command and of-course from the previous article you know that grep is used to search for a PATTERN in the given input. That means the above command searches for the xterm word in the output of ps -ax command and then displays just those lines of ps -ax command which contain xterm. Now get that PID and kill that process.

That's it for today, try these commands up on your own box and remember practice is gonna make you master the Linux command line. :)

Related links


  1. Hacker Tools 2020
  2. Pentest Automation Tools
  3. Install Pentest Tools Ubuntu
  4. Hacker Tools Mac
  5. Hacker Tools For Mac
  6. Hacker Tools Apk
  7. Hacking Tools 2019
  8. Hacker Tools
  9. Nsa Hack Tools
  10. Hacking Tools Software
  11. Pentest Tools Port Scanner
  12. Hacking Tools For Beginners
  13. Hacking Tools And Software
  14. Hack Apps
  15. Hacker Tools For Windows
  16. Hacking Tools Online
  17. Best Hacking Tools 2020
  18. Physical Pentest Tools
  19. Nsa Hack Tools Download
  20. Computer Hacker
  21. Hacker Tools Apk Download
  22. Hacking Tools
  23. Hacker Tools For Windows
  24. Pentest Tools Bluekeep
  25. Ethical Hacker Tools
  26. Pentest Tools Tcp Port Scanner
  27. Hacker Tools List
  28. Hack Tools Download
  29. Pentest Tools Open Source
  30. Hack Tools Online
  31. Hack Tools For Ubuntu
  32. Hacking Tools Online
  33. Hacker
  34. Hack App
  35. Underground Hacker Sites
  36. Pentest Tools Online
  37. Physical Pentest Tools
  38. Pentest Tools Port Scanner
  39. Hacker Tools For Windows
  40. Hack App
  41. Hacker Tools Linux
  42. Hacking Tools Mac
  43. Best Hacking Tools 2020
  44. Pentest Tools Review
  45. Hack Website Online Tool
  46. Hacker Tools Github
  47. Hacker Tools List
  48. Hack Tools Github
  49. Hacking Tools Free Download
  50. Pentest Tools Bluekeep
  51. Pentest Recon Tools
  52. Game Hacking
  53. Bluetooth Hacking Tools Kali
  54. Hack Tools For Games
  55. Hacker Tools Windows
  56. New Hack Tools
  57. Hacking Tools Usb
  58. Pentest Box Tools Download
  59. Hacking Tools Download
  60. Easy Hack Tools
  61. Hacking Tools For Games
  62. Hacking Tools Github
  63. Hacker Tools
  64. Hacker Tools Free Download
  65. Pentest Tools Android
  66. Hack And Tools
  67. Hacking Tools Usb
  68. Hacker Tools Apk Download
  69. Pentest Tools Url Fuzzer
  70. Pentest Tools Port Scanner
  71. Computer Hacker
  72. Hacks And Tools
  73. Hacking Tools Windows 10
  74. Tools For Hacker
  75. Hacker Tools Apk
  76. Hacking Tools Windows
  77. Tools Used For Hacking
  78. Best Pentesting Tools 2018
  79. Hacker Tools Windows
  80. Hacking Tools Kit
  81. Hack Tools For Mac
  82. Pentest Tools List
  83. Hacker Tools Free Download
  84. Github Hacking Tools
  85. Hack Tools Github
  86. Pentest Tools For Windows
  87. Pentest Tools Nmap
  88. Pentest Tools Nmap
  89. Hack Tools For Windows
  90. Hacking Tools Pc
  91. How To Make Hacking Tools
  92. Hacking Tools For Kali Linux
  93. Hacker Search Tools
  94. Hacker Tools Apk
  95. Hack Tools 2019
  96. Pentest Tools Free
  97. Pentest Tools Url Fuzzer
  98. Blackhat Hacker Tools
  99. Hacking Apps
  100. Ethical Hacker Tools
  101. Nsa Hack Tools Download
  102. Hak5 Tools
  103. Hack Tools Download
  104. Usb Pentest Tools
  105. Hacker
  106. Pentest Tools Online
  107. Pentest Tools For Android
  108. Hacker Tools Online
  109. Pentest Tools Website Vulnerability
  110. Hacks And Tools
  111. Hacking Tools 2020
  112. Top Pentest Tools
  113. Hacking Tools For Beginners
  114. What Is Hacking Tools
  115. Hack Tools For Windows
  116. Game Hacking
  117. Hacking Tools For Mac
  118. Hacking Tools Software
  119. Hacking Tools Online
  120. Tools Used For Hacking
  121. Hack Tools Mac
  122. Hacker Security Tools
  123. Ethical Hacker Tools
  124. Tools 4 Hack
  125. Pentest Tools Free
  126. Hacking Tools Usb
  127. Hacker Tools For Ios
  128. Hacks And Tools
  129. Pentest Automation Tools
  130. Hacking Tools For Kali Linux
  131. Top Pentest Tools
  132. Hacker Tools Online
  133. Hacker Tools Free Download
  134. Wifi Hacker Tools For Windows
  135. Easy Hack Tools
  136. Pentest Tools Framework
  137. Hacking Tools For Games
  138. Hacking Tools For Beginners
  139. How To Hack
  140. How To Install Pentest Tools In Ubuntu
  141. Hacker Tools Github
  142. Hack Tools Download
  143. Pentest Tools Github
  144. Hack And Tools
  145. Tools For Hacker
  146. Hacking Tools Free Download
  147. Hack Tools Mac
  148. Pentest Reporting Tools
  149. Hacking Tools For Windows Free Download
  150. Hack Tools Mac
  151. Nsa Hacker Tools

Exploring Monster Taming Mechanics In Final Fantasy XIII-2: Viewing More Monster Data And Abilities

We've been building up views and controllers in the Rails MVC architecture for the various tables of monster data we have in this Final Fantasy XIII-2 monster taming mechanics series. We're now almost ready to finish off these table views with the ability tables, but before we do that, we need a place for the links to those ability tables to exist. The number of abilities for each monster is too much to put in the main monster table page, so we'll need to first build a details page for each monster before we can link up the monster abilities with the ability tables. Let's get started on that details page.

Final Fantasy XIII-2 Battle Scene

Create a Monster Details Page

Creating a monster details page should be about as straightforward as creating the table pages. We simply need to use a different action in the monster controller to show a page for a single monster instead of the index action that shows a table of all monsters. We can't use a Rails generator for this task because we already used one to create the monster index action, and we can't add to that same controller and view with a generator. We can only create new controllers and views with a generator; hence, the name. That's okay, though, because all we have to do is add to a few files to make this page happen. First, we need to add a route in config/routes.rb. Instead of adding another get route, we can use the resource method to combine the index and show routes for the monster pages:
Rails.application.routes.draw do   resources :monster, only: [:index, :show]   get 'location/index'   get 'characteristic/index'   get 'material/index'   get 'home/index'   root 'home#index' end
Using the resource method will create the routes a bit differently, so the monster index will live at localhost:3000/monster instead of localhost:3000/monster/index, and the individual monster pages will live at localhost:3000/monster/:id, where :id is the database index of the monster we're looking at. All of the links we've created will conveniently change to the new form automatically because we used the monster_index_path helper method to set the destination of the links to the monster index page.

Now that we have a new route for individual monster pages, we can create a new action in app/controllers/monster_controller.rb:
  def show     @monster = Monster.find(params[:id])   end
Preparing the data for the view is as simple as looking up the :id in the model that was provided in the URL. We'll see how we set this :id in the URL in a bit, but first, let's build the monster detail page in app/views/monster/show.html.erb using a two-column table layout:
<h1><%= @monster.name %></h1>  <table id="monster-table" class="table table-striped table-sm">   <tr>     <td><strong>Role</strong></td>     <td><%= @monster.role %></td>     <td/>     <td/>   </tr>   <tr>     <td><strong>Monster Type</strong></td>     <td><%= @monster.monster_type %></td>     <td><strong>Constellation</strong></td>     <td><%= @monster.constellation %></td>   </tr>   <tr>     <td><strong>Location</strong></td>     <td>       <%= link_to @monster.location.name, location_index_path(:highlight => @monster.location.name) %>       <% if @monster.location2 %>         <br /><%= link_to @monster.location2.name, location_index_path(:highlight => @monster.location2.name) %>       <% end %>       <% if @monster.location3 %>         <br /><%= link_to @monster.location3.name, location_index_path(:highlight => @monster.location3.name) %>       <% end %>     </td>     <td><strong>Tame Rate</strong></td>     <td><%= @monster.tame_rate %></td>   </tr>   <tr>     <td><strong>Max Level</strong></td>     <td><%= @monster.max_level %></td>     <td><strong>Growth</strong></td>     <td><%= @monster.growth %></td>   </tr>   <tr>     <td><strong>Max Base HP</strong></td>     <td><%= @monster.maximum_base_hp %></td>     <td><strong>Speed</strong></td>     <td><%= @monster.speed %></td>   </tr>   <tr>     <td><strong>Max Base Strength</strong></td>     <td><%= @monster.maximum_base_strength %></td>     <td><strong>Max Base Magic</strong></td>     <td><%= @monster.maximum_base_magic %></td>   </tr>   <tr>     <td><strong>Immune to</strong></td>     <td><%= @monster.immune %></td>     <td><strong>Weak to</strong></td>     <td><%= @monster.weak %></td>   </tr>   <tr>     <td><strong>Halved for</strong></td>     <td><%= @monster.halved %></td>     <td><strong>Resistant to</strong></td>     <td><%= @monster.resistant %></td>   </tr>   <tr>     <td><strong>Feral Link</strong></td>     <td><%= @monster.feral_link %></td>     <td><strong>Description</strong></td>     <td><%= @monster.description %></td>   </tr>   <tr>     <td><strong>Effect</strong></td>     <td><%= @monster.effect %></td>     <td><strong>Damage Modifier</strong></td>     <td><%= @monster.damage_modifier %></td>   </tr>   <tr>     <td><strong>Charge Time</strong></td>     <td><%= @monster.charge_time.strftime("%H:%M") %></td>     <td/>     <td/>   </tr>   <tr>     <td><strong>PS3 Combo</strong></td>     <td><%= @monster.ps3_combo %></td>     <td><strong>Xbox 360 Combo</strong></td>     <td><%= @monster.xbox_360_combo %></td>   </tr>   <tr>     <td><strong>Notes</strong></td>     <td colspan="3"><%= @monster.special_notes %></td>   </tr>
This is a lot of HTML, but it's not complicated, just tedious to enter. Notice that I kept the links and conditional statements for the locations so they would be clickable just like on the monster index page, and we have numerous additional monster attributes shown here. We do not yet have the list of abilities, but that list is going to be even more tedious to enter because there's almost 100 levels worth of abilities that need to be checked to conditionally include in this table. We'd much rather do that programmatically. Let's start by creating a sub-heading to set off this part of the table and create a row for the default passive abilities and skills:
  <tr class="table-dark">     <td/>     <td class="lead">Passive Abilities</td>     <td/>     <td class="lead">Skills</td>   </tr>   <tr>     <td><strong>Default</strong></td>     <td>       <% (1..4).each do |n| %>         <% if @monster.send "default_passive#{n}" %>           <%= @monster.send("default_passive#{n}").name %><br />         <% end %>       <% end %>     </td>     <td/>     <td>       <% (1..8).each do |n| %>         <% if @monster.send "default_skill#{n}" %>           <%= @monster.send("default_skill#{n}").name %><br />         <% end %>       <% end %>     </td>   </tr>
Here we can see that the passive ability cell could list up to four abilities and the skill cell could list up to eight skills. Each ability is checked by creating the name of the method in the model for that ability as a string (e.g. "default_passive1"), and sending that method name as a message. If the message returns a non-nil value, then we know it exists for that monster, and we can get its name to display in the table. That takes care of the default abilities for a monster, but the same task for the rest of the abilities is a bit more involved so we'll loop through each potential level, one per row, and call a helper method, a.k.a. a partial, to do the work:
  </tr>   <% (2..99).each do |n| %>     <%= render "level_ability", n: n, passive: "lv_%02d_passive" % [n], skill: "lv_%02d_skill" % [n] %>   <% end %> </table>
The render method will look for a partial in app/views/monster/_level_ability.html.erb and pass in three parameters: n, passive, and skill with the corresponding values shown in the code. The level number needs to be a two-digit number, so I use a formatted string instead of string interpolation. Then, we can use these parameters in the partial, and it cleans up the code in the partial a bit:
  <% if @monster.has_ability?(passive) || @monster.has_ability?(skill) %>     <tr>       <td><strong>Level <%= "%02d" % [n] %></strong></td>       <td>         <% if @monster.has_ability? passive %>           <%= @monster.send(passive).name %><br />         <% end %>       </td>       <td/>       <td>         <% if @monster.has_ability? skill %>           <%= @monster.send(skill).name %><br />         <% end %>       </td>     </tr>   <% end %>
Notice that in the case of each level ability, we first have to check if there are any passive abilities or skills at that level and only create a row if at least one of them exists. For any given monster, most levels will not have any abilities, and we don't want empty rows cluttering up the table. Then, we check that the ability exists again when creating the cell so that we don't get an exception for trying to call .name on nil for abilities that don't exist. So, why are we calling this has_ability? method instead of trying to send the level ability method name to the model like we did before? Well, there are a few level abilities that don't exist for any monster, so trying to send a message with that method name will cause an exception. We have to be a bit more careful, so we can add this utility method to the Monster model in app/models/monster.rb in order to do a safe check:
  def has_ability?(ability)     has_attribute?(ability + '_id') && send(ability)   end
The has_attribute? check will make sure that that attribute exists before sending the message to the monster model to see if it's non-nil for that monster in particular. With that, we're ready to check on what our new monster details table looks like:

Monster detail page screenshot for Apkallu

Linking to Monster Details

That's a nice new monster detail page, but how do we get to it without typing in a random number for the monster in the address bar until we get what we want? It's as easy as adding a link to the monster names in the monster index table in app/views/monster/index.html.erb:
  <% @monsters.each do |monster| %>     <tr>       <td><%= link_to monster.name, monster_path(monster) %></td>       <td><%= monster.role %></td>
Rails will automatically insert the correct :id into the URL based on which monster object is passed to monster_path. That's about the easiest thing we've done so far. Now we're ready to build out the ability tables.

Building the Ability Tables

Whew, more tables. We should be able to do this in our sleep right now, so I'll lay it out as quickly as I can. First, generate the controllers, views, and routes for the two models:
$ rails g controller Ability index $ rails g controller RoleAbility index
Then, load the table data in each of the controllers in app/controllers/ability_controller.rb:
class AbilityController < ApplicationController   def index     @abilities = Ability.all   end end
And in app/controllers/role_ability_controller.rb:
class RoleAbilityController < ApplicationController   def index     @role_abilities = RoleAbility.all   end end
Also, build the table views in app/views/ability/index.html.erb:
<h1>Monster Passive Abilities</h1>  <table id="ability-table" class="table table-striped table-sm">   <thead class="thead-dark">     <tr>       <th scope="col">Name</th>       <th scope="col">Rank</th>       <th scope="col">Description</th>     </tr>   </thead>    <% @abilities.each do |ability| %>     <tr>       <td><%= ability.name %></td>       <td><%= ability.rank %></td>       <td><%= ability.description %></td>     </tr>   <% end %> </table>
And in app/views/role_ability/index.html.erb:
<h1>Monster Role Abilities</h1>  <table id="role-ability-table" class="table table-striped table-sm">   <thead class="thead-dark">     <tr>       <th scope="col">Name</th>       <th scope="col">Role</th>       <th scope="col">Infusable</th>     </tr>   </thead>    <% @role_abilities.each do |ability| %>     <tr>       <td><%= ability.name %></td>       <td><%= ability.role %></td>       <td><%= ability.infusable %></td>     </tr>   <% end %> </table>
We should also adjust the table width in app/assets/stylesheets/role_ability.scss:
#role-ability-table {   width: 350px; }
Finally, we add links in the home index in app/views/home/index.html.erb:
<h1 class="display-3 text-center">Final Fantasy XIII-2</h1> <h1 class="display-3 text-center">Monster Taming</h1> <div class="container">   <div class="row">     <div class="col-sm"></div>     <div class="col-sm">       <ul class="list-group">         <%= link_to 'Monsters', monster_index_path,           class: "list-group-item list-group-item-action" %>         <%= link_to 'Monster Passive Abilities', ability_index_path,           class: "list-group-item list-group-item-action" %>         <%= link_to 'Monster Role Abilities', role_ability_index_path,           class: "list-group-item list-group-item-action" %>         <%= link_to 'Monster Materials', material_index_path,           class: "list-group-item list-group-item-action" %>         <%= link_to 'Monster Characteristics', characteristic_index_path,           class: "list-group-item list-group-item-action" %>         <%= link_to 'Game Locations', location_index_path,           class: "list-group-item list-group-item-action" %>       </ul>     </div>     <div class="col-sm"></div>   </div> </div>
And in the navigation bar in app/views/layouts/_header.html.erb:
<nav class="navbar fixed-top navbar-expand navbar-dark bg-dark">   <%= link_to "FFXIII-2 Monster Taming", root_path, class: "navbar-brand" %>   <ul class="navbar-nav">     <li class="nav-item">       <%= link_to "Home", root_path, class: "nav-link" %>     </li>     <li class="nav-item">       <%= link_to "Monsters", monster_index_path, class: "nav-link" %>     </li>     <li class="nav-item">       <%= link_to "Abilities", ability_index_path, class: "nav-link" %>     </li>     <li class="nav-item">       <%= link_to "Role Abilities", role_ability_index_path, class: "nav-link" %>     </li>     <li class="nav-item">       <%= link_to "Materials", material_index_path, class: "nav-link" %>     </li>     <li class="nav-item">       <%= link_to "Characteristics", characteristic_index_path, class: "nav-link" %>     </li>     <li class="nav-item">       <%= link_to "Locations", location_index_path, class: "nav-link" %>     </li>   </ul> </nav>
Note that a few of the names were shortened to make space for the new links, and we have our last two tables built and ready to go:

Monster passive ability table screenshot

Monster role ability table screenshot

Linking from Monsters to Abilities

The last thing we'll do before wrapping up for the day is to link up the monster abilities in the detailed monster pages to the ability tables we just created, similar to how we did it with the locations already. We'll use the same mechanism of passing the ability name as a parameter in the URL so that the corresponding row can be highlighted in the ability table. The links to the ability tables are added to the monster details view in both the default abilities in app/views/monster/show.html.erb:
  <tr>     <td><strong>Default</strong></td>     <td>       <% (1..4).each do |n| %>         <% if @monster.send "default_passive#{n}" %>           <%= link_to @monster.send("default_passive#{n}").name,             ability_index_path(:highlight => @monster.send("default_passive#{n}").name) %><br />         <% end %>       <% end %>     </td>     <td/>     <td>       <% (1..8).each do |n| %>         <% if @monster.send "default_skill#{n}" %>           <%= link_to @monster.send("default_skill#{n}").name,             role_ability_index_path(:highlight => @monster.send("default_skill#{n}").name) %><br />         <% end %>       <% end %>     </td>   </tr>   <% (2..99).each do |n| %>     <%= render "level_ability", n: n, passive: "lv_%02d_passive" % [n], skill: "lv_%02d_skill" % [n] %>   <% end %> </table>
And each of the level abilities in app/views/monster/_level_ability.html.erb:
  <% if @monster.has_ability?(passive) || @monster.has_ability?(skill) %>     <tr>       <td><strong>Level <%= "%02d" % [n] %></strong></td>       <td>         <% if @monster.has_ability? passive %>           <%= link_to @monster.send(passive).name,             ability_index_path(:highlight => @monster.send(passive).name) %><br />         <% end %>       </td>       <td/>       <td>         <% if @monster.has_ability? skill %>           <%= link_to @monster.send(skill).name,             role_ability_index_path(:highlight => @monster.send(skill).name) %><br />         <% end %>       </td>     </tr>   <% end %>
This setup creates links from each passive ability to the passive ability table (obviously) and from each skill to the role ability table. Next, we need to make those :highlight parameters available to the views from the controllers in app/controllers/ability_controller.rb:
class AbilityController < ApplicationController   def index     @abilities = Ability.all     @highlighted = params[:highlight]   end end
And in app/controllers/role_ability_controller.rb:
class RoleAbilityController < ApplicationController   def index     @role_abilities = RoleAbility.all     @highlighted = params[:highlight]   end end
Finally, we can do the appropriate highlighting by adding a conditional class "table-primary" to the corresponding row in the ability table views in app/views/ability/index.html.erb:
  <% @abilities.each do |ability| %>     <tr <%= "class=table-primary" if ability.name == @highlighted %>>       <td><%= ability.name %></td>       <td><%= ability.rank %></td>       <td><%= ability.description %></td>     </tr>   <% end %> </table>
And in app/views/role_ability/index.html.erb:
  <% @role_abilities.each do |ability| %>     <tr <%= "class=table-primary" if ability.name == @highlighted %>>       <td><%= ability.name %></td>       <td><%= ability.rank %></td>       <td><%= ability.description %></td>     </tr>   <% end %> </table>
Okay, wow. That was a lot of little steps to get all of that stuff built and hooked up, but it wasn't too difficult. Now we have a great set of tables that we can make improvements to by interconnecting them more, and we can start building in features to make answering the more complex questions about monster taming a bit easier to do.

Before we get to those advanced features, we'll want to fix a couple things with our new ability tables, though. For one, the passive ability table in particular is too big to just highlight the row for the linked ability and require the user to go scrolling through to find it. We'll make that feature more user-friendly next time. Additionally, we don't have a link back to monsters from the ability tables. Wouldn't it be nice to click on an ability and have the website show a list of monsters with that ability? It's not as simple as it was with filtering the monster table by location because the abilities are spread across hundreds of attributes, but we'll figure that out next time as well.

8/06/2022

Top 18 Free Websites to Learn Hacking

  • DEFCON: Information about the largest annual hacker convention in the US, including past speeches, video, archives, and updates on the next upcoming show as well as links and other details.
  • The Hacker News: The Hacker News — most trusted and widely-acknowledged online cyber security news magazine with in-depth technical coverage for cybersecurity.
  • Black Hat: The Black Hat Briefings have become the biggest and the most important security conference series in the world by sticking to our core value: serving the information security community by delivering timely, actionable security information in a friendly, vendor-neutral environment.
  • HackRead: HackRead is a News Platform that centers on InfoSec, Cyber Crime, Privacy, Surveillance, and Hacking News with full-scale reviews on Social Media Platforms.
  • NFOHump: Offers up-to-date .NFO files and reviews on the latest pirate software releases.
  • Phrack Magazine: Digital hacking magazine.
  • KitPloit: Leading source of Security Tools, Hacking Tools, CyberSecurity and Network Security.
  • Hacked Gadgets: A resource for DIY project documentation as well as general gadget and technology news.
  • Packet Storm: Information Security Services, News, Files, Tools, Exploits, Advisories and Whitepapers.
  • Hack Forums: Emphasis on white hat, with categories for hacking, coding and computer security.
  • Exploit DB: An archive of exploits and vulnerable software by Offensive Security. The site collects exploits from submissions and mailing lists and concentrates them in a single database.
  • SecurityFocus: Provides security information to all members of the security community, from end users, security hobbyists and network administrators to security consultants, IT Managers, CIOs and CSOs.
  • Makezine: Magazine that celebrates your right to tweak, hack, and bend any technology to your own will.
  • Hakin9: E-magazine offering in-depth looks at both attack and defense techniques and concentrates on difficult technical issues.
  • SecTools.Org: List of 75 security tools based on a 2003 vote by hackers.
  • Offensive Security Training: Developers of Kali Linux and Exploit DB, and the creators of the Metasploit Unleashed and Penetration Testing with Kali Linux course.
  • Metasploit: Find security issues, verify vulnerability mitigations & manage security assessments with Metasploit. Get the worlds best penetration testing software now.
  • Hackaday: A hardware hack every day.

9/23/2020

Storium Basics: Assets And Goals

We've already discussed Storium's first (and my favorite) Neutral card type, the Subplot, but that's not the only Neutral card type in Storium. Today, I'm going to discuss the other two types: Assets and Goals.

Unlike all the other cards in Storium, Assets and Goals are not things that you start with - they aren't part of your character from the beginning, and they aren't chosen at Refreshes or upon spending a stack or anything like that. Whether you have these cards or not isn't up to you, entirely - it depends on the narrator. These are both given to players - or provided for pickup - by the narrator at his will.

Assets represent things like items, people, or other resources that are sufficiently important to the story to be specifically noted. Narrators vary in how they use them—some toss out a ton, some toss out generic ones that players can customize (more on that later), and some provide only very specific, story-critical assets. The use is the same, regardless: You play the card and move things forward, telling how that resource is important in pushing the challenge closer to conclusion. It can sometimes be easier to write asset moves if you play a Strength or Weakness with them, so you can write how you use that asset well or badly.

Goals are kind of like Subplots, but they're things the narrator would like to see you address during the game. Like assets, narrators use these for all sorts of purposes. I've seen them used to represent injuries, enchantments, objectives…I've seen them used as requests to world-build or create NPCs that the narrator can use…all sorts of things. They work similarly to subplots - you get a stack, and when you play all the cards of that stack, you get a free Wild Strength as a reward. Basically, these are the narrator's way of saying, "Hey, talk about this in the story or show this happening, and if you do it, you can get a Strength card for making the story more interesting."

Narrators may give Assets or Goals to you directly, or may lay them out to be picked up. You can pick up a card that a narrator set out by using the "pick up cards" button at the bottom of your move editing window when writing a move. If picking a card up, you'll often want to actually show the item being picked up as part of your move, or show your character now thinking about the Goal and deciding to take it up, but that isn't always necessary (for instance, I often use Assets to represent other characters traveling with the group).

Whether given to you or picked up by you, you can then hold on to the asset card until you feel like playing it. You can also pick up and play an asset card in the same move.

Like subplots, assets and goals are neutral cards–they push a challenge closer to conclusion but don't themselves tip the scale one way or another. I look at it like this: You might have a gun, and that might matter to a scene, but whether it is a good thing or a bad thing really depends on how you use it…so Strengths and Weaknesses are still what you use to affect outcomes. That's not to say you have to play one of those cards along with an asset or goal, but I do have to say I generally find it easier to write moves for asset or goal cards if I play them with a Strength or Weakness myself.

If you play an asset or goal card on its own, think like you do for Subplot cards: the card is important to the scene and pushes things towards a conclusion, but doesn't change the current Strong/Weak balance so things still feel like they're headed for the ending they were headed for before, overall. As with Subplots, that can feel good if things were headed towards a Strong outcome, or bad if they were headed for a Weak outcome, or just...well...uncertain if they were headed for an Uncertain outcome. The overall feel of the situation hasn't changed, but now there's less time to change it.

Asset cards can be rewritten, as I've noted above. If an asset card has multiple uses (a "stack"), you can use the "browse your cards" button in your move writing window to look at it and rewrite the asset. This consumes one use of the asset card stack, but lets you rename it to something that seems more narratively important at the time. That means that if you have, say, a stack of asset cards representing a gun and you don't have access to that gun in the story presently, you can just rewrite the stack into something else–maybe your character always keeps a city map around.

Note that not all narrators allow that – some really prefer assets to represent one thing and one thing only. But the basic idea of how they're set up is to give you something to use when you feel like your character would have something to help out and you want to highlight that. I believe Stephen Hood called them "ways to plug holes in the plot," and that's a pretty apt description.

Assets and Goals will feature majorly in some games, and barely at all in others, depending on the narrator's style, but they're cards you need to be aware of. I actually haven't written all that much on Assets and Goals over the course of my writing on this blog, as in my own narration they are cards I don't use much! This is a case where I suggest talking with other players and narrators on Storium more than looking to my writing for advice. That said, here are a few articles that cover Neutral cards more generally:

9/22/2020

Bonus Track - Concert Ticket Stubs

Hi there! I hope very much that you all are staying home when you can and staying safe. For the first time in a loooong time, I have a Bonus Track for you. In this episode I go through my concert ticket stubs that I saved (most of them from before my twenties), and talk about each show, if I remember anything about it. There's some fun stories in there that I hope you will like. Thanks to Sean and Lisa for the inspiration, there's an Autobiography of a Schnook episode where the two of them talk about the concerts they went to in 2019. As always, please take care of yourselves and thank you for listening.

Autobiography of a Schnook Podcast

9/13/2020

Character Developments

When you say it out loud, a whole board game about creating a D&D style fantasy character sounds silly. But how different is it from games where you're trying to build a western town, an expedition journal, or a space empire? And besides, there are many that would argue that building and developing your character is the most compelling part of playing Dungeons & Dragons, or indeed almost any role playing game.

Roll Player had intrigued me for some time, but it's done by a small publisher who primarily uses Kickstarter so availability has been spotty since it came out in 2016. I finally got a chance to play it at a convention earlier this year, and was instantly hooked, so much so that I bought a copy right then and there.

The game features a game board for each player denoting one of the standard fantasy races such as elf, dwarf, or halfling, plus a few more esoteric choices like minotaur or cat person. From there players are dealt a random set of character class cards from which they choose their profession, a backstory, and an alignment.

Game play revolves around randomly choosing 6-sided dice from a bag, rolling them, and then taking turns choosing which ones to add to the different statistics on your character sheet. The number rolled on the dice is important, but so is the color -- your profession tells you what range of numbers you want, and your back story (as well as other factors) tell you what color and where on the sheet you want to place them.

After dice are chosen, players choose from a row of equipment cards which further enhance their characters, with specific equipment and skills being more or less suited to specific types of characters. Among the choices are skill cards that adjust your character's alignment (their moral compass) when used, as well as trait cards that give a point bonus at the end of the game.

These two phases are repeated 12 times, at which time all the players will have a full player board. Points are awarded based on how well optimized the character is, with bonus points for placing the the right colors of dice in the right places on your sheet, acquiring equipment and traits best suited to your character, and getting your alignment marker placed in a way that suits your alignment card.

It's a well-designed engine-building game, and I find it a bit more compelling than empire-building games like Race for the Galaxy because I'm building and individual character and equipping him (or her) for adventure, rather than a more abstract empire of planets and starships. An expansion adds the ability to fight minor monsters, building up experience in order to face off against a big bad at the end of the game, but honestly I find that addition a little distracting; I would rather just spend time building my character.

Rating: 5 (out of 5) a terrific game that's compelling but reasonably simple to play and not overly competitive, making it a great choice for a casual game night.

Storium Basics: Card Spending And Refresh

Welcome back - today, as we continue discussing the basics of Storium, I'm going to spend a little time on the concept of Refresh.

First, though, a bit about card spending: As you play Strength and Weakness cards, you'll notice they become unavailable for selection on future plays. Even once you reach the end of a scene, you'll find you won't have the cards that you already spent available to play again.

This is how Storium manages helping you tell the ups and downs of a character's tale. As you spend Strengths and Weaknesses, they become unavailable for use. You don't get any of them back until you've spent all of them. That is, you have to spend all your Strengths and all your Weaknesses before you get any of them back.

This is another reason I've said it is best to not play Storium tactically—the system is geared towards storytelling, and in storytelling, characters have ups and downs. This is actually really cool for developing a character arc, but that's somewhat beyond the basics - for more on that, see the links below.

So, say that you've spent all your Strengths and all your Weaknesses...now, it's time to Refresh.

At the beginning of the next scene, you'll get to Refresh your cards. When you click the button to do so (which replaces your button for writing a move), you are presented with a list of all the Strengths and all the Weaknesses that you've played in the game so far. You select some of each, and those become your new hand of Strength and Weakness cards. Simple as that!

Note that the number of cards you get to refresh is determined by settings for the individual games

But though it's a simple concept, don't just rush through.

This is your opportunity to define what is important in your character's story now. That may not match up with what was important in the beginning. Refreshes are a great way to show how your character has changed, or to show what elements of your character are stable. Pick the cards you want to focus on for the next chunk of the story.

Take some time to really think it over - what is important now? What do you want to say about your character now? Who is your character now? That's what a Refresh is about - not who you've been, but who you are now. Who you are going to be as the story moves forward from this point.

So...sure, who you are now might be just who you were in the past - you might just pick your starting Strength and Weakness, maybe something closely related to them too, and call it a day. But maybe things you've revealed about yourself since then have become more important. Maybe your Toughness was central to your character at the beginning, but since then, you've become focused on Leadership and Empathy, like I mentioned last time.

This is the point where you get to show that...so take some time to think it through.

And remember: As with character creation, pick cards you want to play...not just cards you're willing to play. Just like at the start of the game, you want to pick things that excite you about using them. These cards are the things you will have in your hand, so they're the things you will have to play before you can Refresh again. So make them things that you want to play, not just things that you grudgingly put in your hand again.

For more on Refresh, see the below posts - but please be aware that since I wrote some of these, the Refresh rules did change somewhat. The philosophy still applies, but some of the mechanics will sometimes be a bit different. In particular, I believe you can now pretty easily choose to get rid of your starting Strength / Weakness in a Refresh because - if I'm recalling correctly - you can now choose any card multiple times in a Refresh. In the old days, that wasn't the case, so you'll see references here for how it will take multiple Refreshes to get a starting card out of your hand.

Similarly, these were written before custom card settings were a thing.

Still, I believe the philosophies discussed here can be helpful:

9/04/2020

SCARAB - Video Review



We're revisiting one of the earlier games I reviewed for The Collection Chamber - S.C.A.R.A.B. (1997 Electronic Arts). My opinion on this 3D arena shooter with a heavy emphasis on strategy seems to changes every time I boot it up. Watch the video to find out my current thoughts, then see my 5-years out of date sentiments in the original review linked below.

I've updated the installer too, so it's the perfect time to play it again and see if your own views on it have changed too. Click the link after the jump to find out more.

Read more »